国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

在scrapy中使用phantomJS實現異步爬取的方法

2020-02-16 00:10:43
字體:
來源:轉載
供稿:網友

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

網上將selenium集成到scrapy的文章很多,但是很少有能夠實現異步爬取的,下面這段代碼就重寫了scrapy的downloader,同時實現了selenium的集成以及異步。

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

# encoding: utf-8from __future__ import unicode_literals from scrapy import signalsfrom scrapy.signalmanager import SignalManagerfrom scrapy.responsetypes import responsetypesfrom scrapy.xlib.pydispatch import dispatcherfrom selenium import webdriverfrom six.moves import queuefrom twisted.internet import defer, threadsfrom 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實現異步爬取的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 毕节市| 仪陇县| 雅江县| 浮山县| 鸡西市| 江安县| 天峻县| 焦作市| 社旗县| 昌江| 肇庆市| 崇仁县| 山阴县| 清苑县| 蓬溪县| 金川县| 栾川县| 郯城县| 苍山县| 栾城县| 婺源县| 阳东县| 湘阴县| 洮南市| 阿拉善右旗| 八宿县| 平武县| 鄂伦春自治旗| 共和县| 壶关县| 深圳市| 灵台县| 平陆县| 南乐县| 舞阳县| 耿马| 县级市| 石屏县| 沐川县| 江北区| 林西县|