最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

網(wǎng)上將selenium集成到scrapy的文章很多,但是很少有能夠?qū)崿F(xiàn)異步爬取的,下面這段代碼就重寫了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)異步爬取的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python MD5加密實(shí)例詳解

    Python MD5加密實(shí)例詳解

    這篇文章主要介紹了Python MD5加密實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)方法及實(shí)例,需要的朋友可以參考下
    2017-08-08
  • 使用Python將Exception異常錯(cuò)誤堆棧信息寫入日志文件

    使用Python將Exception異常錯(cuò)誤堆棧信息寫入日志文件

    這篇文章主要介紹了使用Python將Exception異常錯(cuò)誤堆棧信息寫入日志文件,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python正則表達(dá)式re模塊的使用示例詳解

    python正則表達(dá)式re模塊的使用示例詳解

    這篇文章主要為大家介紹了python正則表達(dá)式re模塊的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Python中yield函數(shù)的用法詳解

    Python中yield函數(shù)的用法詳解

    這篇文章詳細(xì)介紹了Python中的yield關(guān)鍵字及其用法,yield關(guān)鍵字用于生成器函數(shù)中,使得函數(shù)可以像迭代器一樣工作,但不會(huì)一次性將所有結(jié)果加載到內(nèi)存中,文中將用法介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • python scipy.spatial.distance 距離計(jì)算函數(shù) ?

    python scipy.spatial.distance 距離計(jì)算函數(shù) ?

    本文主要介紹了python scipy.spatial.distance 距離計(jì)算函數(shù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • pandas使用get_dummies進(jìn)行one-hot編碼的方法

    pandas使用get_dummies進(jìn)行one-hot編碼的方法

    今天小編就為大家分享一篇pandas使用get_dummies進(jìn)行one-hot編碼的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 詳解Python中深淺拷貝的使用及注意事項(xiàng)

    詳解Python中深淺拷貝的使用及注意事項(xiàng)

    Python中的深淺拷貝是經(jīng)常被使用的概念,對于初學(xué)者來說可能會(huì)比較難以理解,本文將詳細(xì)闡述Python深淺拷貝的概念、使用場景、注意事項(xiàng)以及如何實(shí)現(xiàn)深淺拷貝
    2023-04-04
  • python密碼錯(cuò)誤三次鎖定(實(shí)例講解)

    python密碼錯(cuò)誤三次鎖定(實(shí)例講解)

    下面小編就為大家分享一篇python密碼錯(cuò)誤三次鎖定的實(shí)例講解。具有很好的參考價(jià)值。希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • pyqt5實(shí)現(xiàn)按鈕添加背景圖片以及背景圖片的切換方法

    pyqt5實(shí)現(xiàn)按鈕添加背景圖片以及背景圖片的切換方法

    今天小編就為大家分享一篇pyqt5實(shí)現(xiàn)按鈕添加背景圖片以及背景圖片的切換方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 清理pip和conda緩存的方法示例

    清理pip和conda緩存的方法示例

    本文主要介紹了清理pip和conda緩存的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03

最新評論

巢湖市| 左云县| 曲沃县| 连平县| 裕民县| 驻马店市| 平原县| 将乐县| 麟游县| 鹤山市| 施甸县| 任丘市| 额济纳旗| 乌兰察布市| 松滋市| 牟定县| 苗栗县| 江都市| 松原市| 贡觉县| 大冶市| 无为县| 泰安市| 葫芦岛市| 海淀区| 双流县| 拉孜县| 临泉县| 奉贤区| 金昌市| 涡阳县| 东丰县| 会泽县| 巴塘县| 蓬莱市| 嫩江县| 永寿县| 鄯善县| 澄江县| 和田县| 汉寿县|