与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 实战