一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 在scrapy中使用phantomJS實現異步爬取的方法

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

2021-04-30 01:30郎總 Python

今天小編就為大家分享一篇在scrapy中使用phantomJS實現異步爬取的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 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實現異步爬取的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/whueratsjtuer/article/details/79198863

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2021小妲己永久回家地址 | 欧美专区亚洲 | www.日日操| 调教女秘书 | 毛片网站免费观看 | 美女翘臀内疯狂进出 | 三级无删减高清在线影院 | 男同gay玩奴男同玩奴 | 香蕉在线精品一区二区 | blacked最大的吊 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 色综合天天综合网看在线影院 | 精品乱lun小说 | 色先锋av资源中文字幕 | 四虎麻豆| 久久天天综合 | 逼里逼里香 | 亚洲国产高清一区二区三区 | 爱福利一区二区 | 国产精品不卡 | 精品国产一区二区三区在线 | 星空无限传媒视频在线观看视频 | 护士让我吃奶我扒她奶 | 久99视频精品免费观看福利 | 黄动漫车车好快的车车a | 日韩中文在线 | 亚洲第一二三四区 | 日本ssswww大学生 | luan小说| 午夜一个人在线观看完整版 | 国产伦久视频免费观看视频 | 香港论理午夜电影网 | 性色香蕉AV久久久天天网 | 国内精品久久久久影院中国 | 亚洲小视频| 边摸边吃奶边做爽gif动态图 | 亚洲一区二区三区91 | 国产免费一区二区三区 | xxxxxx日本处大片免费看 | 日韩亚洲国产激情在线观看 | 欧美摸胸|