欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在scrapy中使用phantomJS實(shí)現(xiàn)異步爬取的方法

 更新時(shí)間:2018年12月17日 11:16:02   作者:郎總  
今天小編就為大家分享一篇在scrapy中使用phantomJS實(shí)現(xiàn)異步爬取的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

使用selenium能夠非常方便的獲取網(wǎng)頁(yè)的ajax內(nèi)容,并且能夠模擬用戶點(diǎn)擊和輸入文本等諸多操作,這在使用scrapy爬取網(wǎng)頁(yè)的過(guò)程中非常有用。

網(wǎng)上將selenium集成到scrapy的文章很多,但是很少有能夠?qū)崿F(xiàn)異步爬取的,下面這段代碼就重寫(xiě)了scrapy的downloader,同時(shí)實(shí)現(xiàn)了selenium的集成以及異步。

使用時(shí)需要PhantomJSDownloadHandler添加到配置文件的DOWNLOADER中。

# encoding: utf-8
from __future__ import unicode_literals
 
from scrapy import signals
from scrapy.signalmanager import SignalManager
from scrapy.responsetypes import responsetypes
from scrapy.xlib.pydispatch import dispatcher
from selenium import webdriver
from six.moves import queue
from twisted.internet import defer, threads
from twisted.python.failure import Failure
 
 
class PhantomJSDownloadHandler(object):
 
 def __init__(self, settings):
  self.options = settings.get('PHANTOMJS_OPTIONS', {})
 
  max_run = settings.get('PHANTOMJS_MAXRUN', 10)
  self.sem = defer.DeferredSemaphore(max_run)
  self.queue = queue.LifoQueue(max_run)
 
  SignalManager(dispatcher.Any).connect(self._close, signal=signals.spider_closed)
 
 def download_request(self, request, spider):
  """use semaphore to guard a phantomjs pool"""
  return self.sem.run(self._wait_request, request, spider)
 
 def _wait_request(self, request, spider):
  try:
   driver = self.queue.get_nowait()
  except queue.Empty:
   driver = webdriver.PhantomJS(**self.options)
 
  driver.get(request.url)
  # ghostdriver won't response when switch window until page is loaded
  dfd = threads.deferToThread(lambda: driver.switch_to.window(driver.current_window_handle))
  dfd.addCallback(self._response, driver, spider)
  return dfd
 
 def _response(self, _, driver, spider):
  body = driver.execute_script("return document.documentElement.innerHTML")
  if body.startswith("<head></head>"): # cannot access response header in Selenium
   body = driver.execute_script("return document.documentElement.textContent")
  url = driver.current_url
  respcls = responsetypes.from_args(url=url, body=body[:100].encode('utf8'))
  resp = respcls(url=url, body=body, encoding="utf-8")
 
  response_failed = getattr(spider, "response_failed", None)
  if response_failed and callable(response_failed) and response_failed(resp, driver):
   driver.close()
   return defer.fail(Failure())
  else:
   self.queue.put(driver)
   return defer.succeed(resp)
 
 def _close(self):
  while not self.queue.empty():
   driver = self.queue.get_nowait()
   driver.close()

以上這篇在scrapy中使用phantomJS實(shí)現(xiàn)異步爬取的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用Python實(shí)現(xiàn)QQ實(shí)時(shí)到賬免簽支付功能

    利用Python實(shí)現(xiàn)QQ實(shí)時(shí)到賬免簽支付功能

    這篇文章主要介紹了利用Python實(shí)現(xiàn)QQ實(shí)時(shí)到賬免簽支付功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • python 通過(guò)logging寫(xiě)入日志到文件和控制臺(tái)的實(shí)例

    python 通過(guò)logging寫(xiě)入日志到文件和控制臺(tái)的實(shí)例

    下面小編就為大家分享一篇python 通過(guò)logging寫(xiě)入日志到文件和控制臺(tái)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python列表生成式和字典生成式實(shí)例

    Python列表生成式和字典生成式實(shí)例

    這篇文章主要介紹了Python列表生成式和字典生成式實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python?yield?關(guān)鍵詞,

    Python?yield?關(guān)鍵詞,

    這篇文章主要介紹了Python?yield?關(guān)鍵詞,要理解yield的作用,你必須理解生成器是什么。在理解生成器之前,必須先理解迭代器。下面文章我們就先從
    迭代器開(kāi)始展開(kāi)yield關(guān)鍵詞的相關(guān)自資料 ,需要的朋友可以參考一下
    2021-12-12
  • Python如何實(shí)現(xiàn)逐行讀取文本文件

    Python如何實(shí)現(xiàn)逐行讀取文本文件

    在Python中,有幾種方法可以讀取文本文件。在本文中,將介紹以下幾種方法:open()?函數(shù)、read()?方法、readline()?方法、readlines()?方法、close()?方法和?with?關(guān)鍵字。需要的同學(xué)可以參考一下
    2021-12-12
  • Python數(shù)據(jù)類(lèi)型之String字符串實(shí)例詳解

    Python數(shù)據(jù)類(lèi)型之String字符串實(shí)例詳解

    這篇文章主要介紹了Python數(shù)據(jù)類(lèi)型之String字符串,結(jié)合實(shí)例形式詳細(xì)講解了Python字符串的概念、定義、連接、格式化、轉(zhuǎn)換、查找、截取、判斷等常見(jiàn)操作技巧,需要的朋友可以參考下
    2019-05-05
  • django實(shí)現(xiàn)圖片上傳數(shù)據(jù)庫(kù)并顯示

    django實(shí)現(xiàn)圖片上傳數(shù)據(jù)庫(kù)并顯示

    這篇文章主要為大家詳細(xì)介紹了django實(shí)現(xiàn)圖片上傳數(shù)據(jù)庫(kù)并顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • pycharm?使用conda虛擬環(huán)境的詳細(xì)配置過(guò)程

    pycharm?使用conda虛擬環(huán)境的詳細(xì)配置過(guò)程

    這篇文章主要介紹了pycharm?使用conda虛擬環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • python自動(dòng)化測(cè)試之DDT數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)代碼

    python自動(dòng)化測(cè)試之DDT數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了python自動(dòng)化測(cè)試之DDT數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 使用python實(shí)現(xiàn)簡(jiǎn)單去水印功能

    使用python實(shí)現(xiàn)簡(jiǎn)單去水印功能

    這篇文章主要為大家詳細(xì)介紹了使用python實(shí)現(xiàn)簡(jiǎn)單去水印功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論