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

时间:2018-01-04 04:15:05

标签: python web-scraping scrapy

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

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

答案 1 :(得分:1)

  

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

这可能表示您需要多台计算机来执行您的蜘蛛。可扩展性问题。好吧,你也可以垂直扩展,使你的单机更强大,但这将达到'#34;限制"更快:

查看Distributed Crawling文档和scrapyd项目。

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

答案 2 :(得分:0)

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

如果你只使用一台机器并且这个错误正在出现,那么另外需要考虑的事情是 - 打开太多文件并不是真正的资源瓶颈。你可能最好让每个蜘蛛运行200个左右的线程来制造网络IO(通常,尽管有时是CPU或诸如此类的)瓶颈。每个蜘蛛平均比当前解决方案完成得更快,它同时执行所有蜘蛛并达到一些“最大文件描述符”限制,而不是实际的资源限制。