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

首頁(yè) > 編程 > Python > 正文

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

2020-01-04 13:47:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

使用時(shí)需要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實(shí)現(xiàn)異步爬取的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 松江区| 清镇市| 郓城县| 灵山县| 综艺| 淮南市| 闻喜县| 大宁县| 新和县| 红原县| 醴陵市| 河津市| 横峰县| 广河县| 闽侯县| 城口县| 车险| 鹰潭市| 德钦县| 灵丘县| 霞浦县| 乌鲁木齐市| 云和县| 靖安县| 无锡市| 滦南县| 西乌| 弥勒县| 定兴县| 乃东县| 扬州市| 丰原市| 双桥区| 嫩江县| 根河市| 北海市| 万山特区| 策勒县| 内丘县| 扶风县| 平顶山市|