与Python Scrapy中的Selenium WebDriver并发

问题描述 投票:0回答:1

我有许多不同的页面(比方说50)要刮,我使用Selenium WebDriver用Scrapy Downloader Middleware下载每个页面,然后以经典的Scrapy方式处理每个页面。

应该有办法使这更快,即不必等待Selenium驱动程序顺序下载50页,然后才处理它们,但可能会引入多处理池或多个Selenium驱动程序同时下载页面,如每个页面下载后,只进行一次所有处理。

但是我不知道如何做到这一点,因为只需要一个请求作为它的process_request方法的输入:

def process_request(self, request, spider):
    ...
    self.driver.get(request.url)
    ...
    return HtmlResponse(self.driver.current_url,
                        body=self.driver.page_source, 
                        encoding='utf-8', 
                        request=request) 

在中间件之前的代码部分,我有这样的事情:

for item in items:
    request = Request(url=...)
    yield request

这些请求中的每一个都被顺序发送到中间件,所以我不确定是否可以做任何事情,即此时引入并发。

可以做些什么来提高这项任务的速度?

python selenium selenium-webdriver scrapy multiprocessing
1个回答
1
投票

您可以尝试使用docker swarm来启动selenium实例池,然后通过将实例的名称作为请求元属性传递,让下载器中间件使用其中一个可用实例。

这是一个例子(虽然没有整合scrapy)http://danielfrg.com/blog/2015/09/28/crawling-python-selenium-docker/

© www.soinside.com 2019 - 2024. All rights reserved.