Scrapy与多处理兼容吗?

时间:2018-12-11 22:18:45

标签: python selenium scrapy

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

在其他论坛上,它说Scrapy可以进行多处理。

最后,值得一提的是,选项CONCURRENT_REQUESTS(设置)与多处理程序有关联吗?

3 个答案:

答案 0 :(得分:3)

推荐使用的方法是不要在正在运行的蜘蛛内部使用多重处理。

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

草率的作业本身是非常快的IMO,当然,您可以总是更快地进行特殊设置,就像您提到的CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAINDOWNLOAD_DELAY等。但这基本上是因为scrapy是异步的,这意味着它不会等待请求完成以安排并继续处理其余任务(安排更多请求,解析响应等)

CONCURRENT_REQUESTS与多重处理没有联系。由于异步,这主要是一种“限制”可以调度多少个请求的速度的方法。

答案 1 :(得分:0)

您可以使用:

如果您需要的更多,或者需要进行繁重的处理,建议您将这一部分移到另一个流程中。

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

答案 2 :(得分:0)

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

ReactorNotRestartable error in while loop with scrapy

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

但是,有一些解决方法。

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

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

由于maxtasksperchild设置为1,因此子进程将在任务完成后被杀死,因此将创建一个新的子进程,而无需重新启动任务。

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


我是新手,所以如果您有更好的建议,请告诉我。