与Python Scrapy中的Selenium WebDriver并发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与Python Scrapy中的Selenium WebDriver并发相关的知识,希望对你有一定的参考价值。

我有许多不同的页面(比方说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

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

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

答案

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

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

以上是关于与Python Scrapy中的Selenium WebDriver并发的主要内容,如果未能解决你的问题,请参考以下文章

小白学 Python 爬虫(40):爬虫框架 Scrapy 入门基础对接 Selenium 实战

将 Selenium 与 Scrapy 集成

爬虫07 /scrapy图片爬取中间件selenium在scrapy中的应用CrawlSpider分布式增量式

scrapy中的selenium

scrapy的暂停与重启

python小白学习记录 scrapy 结合 selenium 使用自己的chrome浏览器