SeleniumをScrapyに統合
1.新しい知乎爬虫類を作る:
zhihu spiderを記述するページ解析関数
注意:ここではSeleniumをScrapyに統合することに重点を置き、zhihu spiderに関する具体的な論理は無視されます.
2.Downloader Middlewareの作成
Downloader Middlewareの
3.Downloaderミドルウェアのアクティブ化(Downloader Middlewares)
Downloaderミドルウェアを有効にするには、
4.テスト
しかし、Seleniumで起動したブラウザが閉じていないことに気づき、
5.
ここではScrapy信号量の知識については,しばらく説明しない.
対応するDownloader Middlewareには、対応する変更が必要です.
これでSeleniumをScrapyに統合しました.
参考:爬虫類(十五):scrapyのsettingsの詳細http://www.cnblogs.com/felixwang2/p/8798653.html八.Scrapy学習の下でSpiderミドルウェアSpider Middlewareshttps://blog.csdn.net/beyond_f/article/details/74626311scrapyのmiddlewaresコンポーネントを書き換え、user-agentプールとIPエージェントプールを確立して逆登りの効果を達成するhttps://blog.csdn.net/qq_41020281/article/details/79436643
> scrapy genspider zhihu www.zhihu.com
zhihu spiderを記述するページ解析関数
parse()
は、この関数が反復可能なオブジェクトを返すように要求されるため、ここではテストとして空のリストを直接返す.# -*- coding: utf-8 -*-
# @Author : One Fine
# @File : zhihu.py
import scrapy
class ZhihuSpider(scrapy.Spider):
name = 'zhihu'
allowed_domains = ['www.zhihu.com']
start_urls = ['http://www.zhihu.com/']
def parse(self, response):
yield [] #
注意:ここではSeleniumをScrapyに統合することに重点を置き、zhihu spiderに関する具体的な論理は無視されます.
2.Downloader Middlewareの作成
Downloader Middlewareの
process_request()
メソッドが実装され、Responseオブジェクト(htmlResponseはそのサブクラス)に戻ると、Scrapyは他のプロセスを呼び出すことはありません.requestメソッドは、このresponseオブジェクトに直接戻ります.from selenium import webdriver
from time import sleep
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
# Chrome
def __init__(self):
self.browser = webdriver.Chrome(executable_path='D:/selenium/chromedriver.exe')
super(JSPageMiddleware, self).__init__()
def process_request(self, request, spider):
# htmlResponse scrapy downloader 。
# htmlResponse,scrapy downloader , spider。
# ,
if spider.name == 'zhihu':
self.browser.get(request.url)
sleep(3)
print(" {0}".format(request.url))
return HtmlResponse(url=self.browser.current_url, body=self.browser.page_source,
encoding='utf8', request=request)
3.Downloaderミドルウェアのアクティブ化(Downloader Middlewares)
Downloaderミドルウェアを有効にするには、
settings.py
のDOWNLOADER_に追加します.MIDDLEWARES設定中です.この設定は、キーがミドルウェアのパスであり、値がミドルウェアの順序(order)である辞書です.DOWNLOADER_MIDDLEWARES = {
'spider_pjt1.middlewares.JSPageMiddleware': 1,
}
4.テスト
# -*- coding: utf-8 -*-
# @Author : One Fine
# @File : main.py
from scrapy.cmdline import execute
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# execute() ,
execute(["scrapy", "crawl", "zhihu"])
しかし、Seleniumで起動したブラウザが閉じていないことに気づき、
zhihu.py
ファイルを書き換えました.5.
zhihu.py
ファイルとDownloader Middlewareを書き換えるここではScrapy信号量の知識については,しばらく説明しない.
# -*- coding: utf-8 -*-
# @Author : One Fine
# @File : zhihu.py
import scrapy
from selenium import webdriver
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
class ZhihuSpider(scrapy.Spider):
name = 'zhihu'
allowed_domains = ['www.zhihu.com']
start_urls = ['http://www.zhihu.com/']
def __init__(self):
self.browser = webdriver.Chrome(executable_path='D:/selenium/chromedriver.exe')
super(ZhihuSpider, self).__init__()
# zhihu
dispatcher.connect(self.spider_closed, signals.spider_closed)
def spider_closed(self):
#
print("spider closed")
self.browser.quit()
def parse(self, response):
yield []
対応するDownloader Middlewareには、対応する変更が必要です.
from time import sleep
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
def process_request(self, request, spider):
if spider.name == 'zhihu':
spider.browser.get(request.url)
sleep(3)
return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source,
encoding='utf8', request=request)
これでSeleniumをScrapyに統合しました.
参考:爬虫類(十五):scrapyのsettingsの詳細http://www.cnblogs.com/felixwang2/p/8798653.html八.Scrapy学習の下でSpiderミドルウェアSpider Middlewareshttps://blog.csdn.net/beyond_f/article/details/74626311scrapyのmiddlewaresコンポーネントを書き換え、user-agentプールとIPエージェントプールを確立して逆登りの効果を達成するhttps://blog.csdn.net/qq_41020281/article/details/79436643