以受控方式运行数十个 Scrapy 蜘蛛

Posted

技术标签:

【中文标题】以受控方式运行数十个 Scrapy 蜘蛛【英文标题】:Running dozens of Scrapy spiders in a controlled manner 【发布时间】:2018-06-13 18:56:16 【问题描述】:

我正在尝试构建一个系统来运行a few dozen Scrapy spiders,将结果保存到 S3,并在完成时通知我。 *** 上有几个类似的问题(例如this one 和this other one),但它们似乎都使用相同的建议(from the Scrapy docs):设置CrawlerProcess,将蜘蛛添加到其中,然后点击@987654328 @。

但是,当我对所有 325 个蜘蛛尝试此方法时,它最终锁定并失败,因为它试图在运行它的系统上打开太多文件描述符。 I've tried 一些没用的东西。

使用 Scrapy 运行大量蜘蛛的推荐方法是什么?

编辑添加:我知道我可以扩展到多台机器并支付服务以帮助协调(例如 ScrapingHub),但我更喜欢在一台机器上使用某种进程池 + 队列,这样只有少数固定数量的蜘蛛会同时运行。

【问题讨论】:

【参考方案1】:

最简单的方法是从命令行运行它们。例如:

$ scrapy list | xargs -P 4 -n 1 scrapy crawl

将运行您的所有蜘蛛,最多可随时并行运行 4 个。然后,您可以在此命令完成后在脚本中发送通知。

更强大的选项是使用scrapyd。它带有一个 API、一个最小的 Web 界面等。它还将对爬网进行排队,并且一次只运行某个(可配置的)数字。您可以通过 API 与之交互以启动您的蜘蛛并在它们全部完成后发送通知。

Scrapy Cloud 非常适合这个 [免责声明:我为 Scrapinghub 工作]。它将只允许您一次只运行一定数量的作业,并有一个待处理作业队列(您可以对其进行修改、在线浏览、确定优先级等)和一个比 scrapyd 更完整的 API。

您不应该在一个进程中运行所有蜘蛛。它可能会更慢,可能会引入无法预料的错误,并且您可能会达到资源限制(就像您所做的那样)。如果您使用上述任何选项单独运行它们,只需运行足以最大限度地利用您的硬件资源(通常是 CPU/网络)。如果此时您仍然遇到文件描述符问题,则应增加限制。

【讨论】:

感谢您的建议。我之前尝试过使用scrapyd,但是设置和配置它、添加蜘蛛、安排它们全部运行、等待它们完成、以我想要的格式获得结果以及关闭整个过程变得非常复杂。我也试过 Scrapinghub,但运行起来同样复杂,而且相当昂贵。听起来scrapy不支持这种东西,所以我现在还是坚持使用xargs路径。 xargs 绝对没有问题!其他的更复杂,所以只有你可以使用额外的功能才值得。 Scrapy Cloud 起价为每月 9 美元,但费用取决于您想同时运行多少蜘蛛。 "我也试过 Scrapinghub,但运行起来同样复杂" 你觉得哪部分复杂?创建帐户、项目、部署代码和/或使用 webapp 或 API 运行蜘蛛? ——“而且相当昂贵。”如果没有太多要求,我想知道您可以选择哪些主机。你打算定期运行你的蜘蛛还是只运行一次? 文档中的命令行解决方案在哪里,以便我了解这里正在做什么?这是我发现的这个问题的最简单的答案。我在文档中没有找到关于 -p 或 -n 命令行参数的任何内容,除非它们是其他东西的简写。感谢您发布此答案。 这不在 scrapy 文档中。 -n 和 -P 参数是 xargs 的参数。 scrapy list 命令生成一个蜘蛛列表,通过管道传送到 xargs。 xargs 用蜘蛛调用scrapy crawl-n 告诉 xargs 一次只使用一个蜘蛛调用 scrapy crawl,-P 允许它同时运行 4 个进程。【参考方案2】:

如果信息是相对静态的(基于您提到的“完成”过程),一个解决方案是简单地设置一个脚本来按顺序或分批运行爬网。等待 1 完成,然后再开始下一个 1(或 10,或任何批量大小)。

如果您只使用一台机器并且出现此错误,则需要考虑的另一件事 - 打开的文件过多并不是真正的资源瓶颈。您最好让每个蜘蛛运行 200 个左右的线程以使网络 IO(通常,尽管有时是 CPU 或诸如此类)成为瓶颈。平均而言,每个蜘蛛完成的速度比您当前的解决方案要快,后者一次执行它们并达到一些“最大文件描述符”限制,而不是实际的资源限制。

【讨论】:

【参考方案3】:

它最终会锁定并失败,因为它试图在运行它的系统上打开太多文件描述符

这可能表明您需要多台机器来执行您的蜘蛛。可扩展性问题。好吧,您还可以垂直扩展以使您的单台机器更强大,但这会更快地达到“极限”:

Difference between scaling horizontally and vertically for databases

查看Distributed Crawling 文档和scrapyd 项目。

还有一个名为ScrapingHub 的基于云的分布式爬虫服务,它可以完全解决您的可扩展性问题(请注意,我没有宣传它们,因为我与该公司没有任何关系)。

【讨论】:

我不想一次运行所有的蜘蛛——我想一次在(比如说)12 个池中运行它们,直到它们完成。我很高兴等几个小时才能完成所有这些工作,但我希望它们在一台机器上运行。 @magneticMonster 你也可以使用scrapyd,那里有调度。

以上是关于以受控方式运行数十个 Scrapy 蜘蛛的主要内容,如果未能解决你的问题,请参考以下文章

多核执行Scrapy

scrapy工作流程

Scrapy:努力实现爬网蜘蛛

Scrapy - 如何启动同一个蜘蛛进程的多个实例?

从脚本scrapy运行蜘蛛

在 Celery 任务中运行 Scrapy 蜘蛛