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_REQUESTS
、CONCURRENT_REQUESTS_PER_DOMAIN
、DOWNLOAD_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 与多处理兼容吗?的主要内容,如果未能解决你的问题,请参考以下文章