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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本韩国无矿砖码 | 青草国产在线观看 | 女老板用丝袜脚夹我好爽 | 亚洲2卡三卡4卡5卡精品 | 国产乱子伦在线观看不卡 | www.av色| 免费观看国产视频 | 娇小8一12xxxx第一次 | 亚洲天堂精品视频 | 91无毒不卡 | 国产精品毛片va一区二区三区 | 操到翻白眼 | 色老板在线视频观看 | 欧美日韩精品一区二区三区高清视频 | 亚洲aⅴ天堂 | 亚洲AV无码乱码国产麻豆穿越 | 男女啪啪gif | 沉香如屑西瓜视频免费观看完整版 | 欧美一区二区三区综合色视频 | 亚洲精品国产A久久久久久 亚洲精品福利一区二区在线观看 | 亚洲欧美久久一区二区 | 寡妇一级毛片 | 亚洲成aⅴ人片在线 | 毛片资源站 | 久久永久影院免费 | 国产成人精品视频一区 | 欧美贵妇videos办公室360 | 日韩精品欧美 | acg火影忍者熟密姬纲手h | 国产xx肥老妇视频奂费 | 91亚洲一区二区在线观看不卡 | 日本高清免费观看 | 草莓绿巨人香蕉茄子芭乐 | 美日韩一区二区三区 | 日韩一级在线观看 | 国产精亚洲视频 | 国产福利微拍精品一区二区 | 嗯啊好爽视频 | 欧美日韩导航 | 色综久久天天综合绕视看 | 6080伦理久久精品亚洲 |