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

时间:2016-10-26 17:41:42

标签: selenium scrapy

我遇到了selenium和scrapy对象之间的通信问题。

我正在使用selenium登录某个站点,一旦得到响应,我想使用scrape的工作人员进行解析和处理。请一些人帮我写中间件,以便每个请求都应该通过selenium web驱动程序,响应应该传递给scrapy。

谢谢!

1 个答案:

答案 0 :(得分:4)

这非常简单,使用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

这样做的缺点是你必须摆脱蜘蛛的并发性,因为selenium webdrive一次只能处理一个url。为此,请参阅settings documentation page