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

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

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

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

【问题讨论】:

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

标签: python selenium scrapy


【解决方案1】:

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

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

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

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

【讨论】:

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

你可以使用:

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

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的新手,如果你有更好的建议,请告诉我。

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2018-08-27
      相关资源
      最近更新 更多