如何为 selenium 和 Scrapy 编写自定义下载器中间件?

wor*_*rld 3 selenium scrapy

我在 selenium 和 scrapy 对象之间进行通信时遇到问题。

我正在使用 selenium 登录某个站点,一旦我得到该响应,我想使用刮削的函数来解析和处理。请有人帮助我编写中间件,以便每个请求都应该通过 selenium web 驱动程序,并且响应应该传递给scrapy。

谢谢!

Gra*_*rus 6

这非常简单,创建一个带有 webdriver 的中间件并用于process_request拦截请求,丢弃它并使用它必须将它传递给您的 selenium webdriver 的 url:

from scrapy.http import HtmlResponse
from selenium import webdriver


class DownloaderMiddleware(object):
    def __init__(self):
        self.driver = webdriver.Chrome()  # your chosen driver

    def process_request(self, request, spider):
        # only process tagged request or delete this if you want all
        if not request.meta.get('selenium'):
            return
        self.driver.get(request.url)
        body = self.driver.page_source
        response = HtmlResponse(url=self.driver.current_url, body=body)
        return response
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是您必须摆脱蜘蛛中的并发性,因为 selenium webdrive 一次只能处理一个 url。请参阅设置文档页面