SeleniumをScrapyに統合

14155 ワード

1.新しい知乎爬虫類を作る:
> 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