Scrapy 与多处理兼容吗?

Posted

技术标签:

【中文标题】Scrapy 与多处理兼容吗?【英文标题】:Is Scrapy compatible with multiprocessing? 【发布时间】:2019-05-12 23:27:57 【问题描述】:

所以我一直在使用 selenium 进行刮擦。但我想将所有代码更改为 Scrapy。我唯一不确定的是我正在使用多处理(python 库)来加快我的进程。我研究了很多,但我完全不明白。我找到了:Multiprocessing of Scrapy Spiders in Parallel Processes,但它对我没有帮助,因为它说可以用 Twisted 完成,但我还没有找到一个例子。

在其他论坛上,它说 Scrapy 可以与多处理一起使用。

最后一件事,scrapy 中的选项CONCURRENT_REQUESTS(设置)与多处理有一些联系吗?

【问题讨论】:

如果您需要更多帮助,您可以在这里评论,我会尽力提供帮助 我一直在一个脚本中处理我所有的蜘蛛,就是这样,实际上我并没有对数据进行大量处理,我只是获取数据并将其附加到文件中pandas(显然有一些像验证码这样的处理来获取数据)。那么,当您说“将获取信息的流程与使用该信息的流程分开”时,您是什么意思? ....还有一件事,我们可以用扭曲的方式做什么?有没有办法加快这个过程? 【参考方案1】:

使用 scrapy 的推荐方法是不要在运行的蜘蛛中使用多处理。

更好的选择是使用各自独立的输入调用几个scrapy作业。

Scrapy 作业本身是非常快的 IMO,当然,你总是可以走得更快,特殊设置如你提到的CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAINDOWNLOAD_DELAY 等。但这基本上是因为scrapy 是异步的,意味着它不会等待请求完成来安排并继续处理剩余的任务(安排更多请求、解析响应等)

CONCURRENT_REQUESTS 与多处理无关。由于是异步的,这主要是一种“限制”可以调度的请求速度的方法。

【讨论】:

在脚本中调用scrapy还不错,但也不是推荐的方式。您需要记住,Scrapy 是一个“Web 爬网框架”,因此它可以独立运行(自己的进程、自己的调用等)。最后,你只需要指定输入,然后告诉 Scrapy 如何处理输出,这就是你应该如何配置它来工作。将获取信息的进程与使用该信息的进程分开。【参考方案2】:

你可以使用:

CONCURRENT_ITEMS配置项目处理并发, CONCURRENT_REQUESTS,CONCURRENT_REQUESTS_PER_DOMAIN,CONCURRENT_REQUESTS_PER_IP配置HTTP请求并发

如果您需要更多或者您有一些繁重的处理,我建议您将这部分移动到一个单独的进程中。

Scrapy 的职责是 Web 解析,例如,您可以在项目管道中,将任务发送到队列并有单独的进程消费和处理任务。

【讨论】:

【参考方案3】:

好吧,通常来说,scrapy 不支持多进程,请参阅

ReactorNotRestartable error in while loop with scrapy

对于特定进程,一旦您调用 reactor.run() 或 process.start(),您将无法重新运行这些命令。原因是反应堆无法重新启动。一旦脚本完成执行,反应器将停止执行。

但是,有一些解决方法。

    pool = Pool(processes=pool_size,maxtasksperchild=1)

maxtasksperchild 是工作进程在退出并被新的工作进程替换之前可以完成的任务数。

由于maxtasksperchild设置为1,所以任务完成后子进程会被杀死,会创建一个新的子进程,不需要重新启动任务。

但这会造成内存压力,请确保您确实需要它。 我认为开始乘法过程是一个更好的选择。


我是scrapy的新手,如果你有更好的建议,请告诉我。

【讨论】:

以上是关于Scrapy 与多处理兼容吗?的主要内容,如果未能解决你的问题,请参考以下文章

技术你懂Scrapy吗?Scrapy大型爬虫框架讲解

Boost.Python 与多处理兼容吗?

使用 scrapy-splash 会显着影响抓取速度吗? [关闭]

scrapy-redis 能分布式post请求吗

scrapy使用

你知道在 scrapy 中,可以定制化导出数据格式吗?scrapy 导出器学习