所以我一直在用硒进行刮削。但是我想将所有代码更改为Scrapy。我唯一不确定的是我正在使用多处理(python库)来加快处理速度。我做了很多研究,但我完全不了解。我发现:Multiprocessing of Scrapy Spiders in Parallel Processes,但对我没有帮助,因为它说可以使用Twisted来完成,但是我还没有找到示例。
在其他论坛上,它说Scrapy可以进行多处理。
最后,值得一提的是,选项CONCURRENT_REQUESTS
(设置)与多处理程序有关联吗?
答案 0 :(得分:3)
推荐使用的方法是不要在正在运行的蜘蛛内部使用多重处理。
更好的选择是使用各自独立的输入来调用多个scrapy作业。
草率的作业本身是非常快的IMO,当然,您可以总是更快地进行特殊设置,就像您提到的CONCURRENT_REQUESTS
,CONCURRENT_REQUESTS_PER_DOMAIN
,DOWNLOAD_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,因此子进程将在任务完成后被杀死,因此将创建一个新的子进程,而无需重新启动任务。
但这会导致内存压力,请确保您确实需要它。 我认为开始乘法过程是一个更好的选择。
我是新手,所以如果您有更好的建议,请告诉我。