我试图构建一个运行几十只刮擦的蜘蛛的系统,将结果保存到S3,并在完成时通知我。在StackOverflow上有几个类似的问题(例如,这一个和另一个),但它们似乎都使用了相同的建议(从刮伤医生那里):设置一个CrawlerProcess,向它添加蜘蛛,然后点击start()。
但是,当我用我所有325只蜘蛛尝试这个方法时,它最终会被锁定并失败,因为它试图在运行它的系统上打开太多的文件描述符。我试过了有几件事情还没有成功。
使用Scrapy运行大量蜘蛛的推荐方法是什么?
编辑以添加:我知道我可以扩展到多台机器,并支付帮助协调的服务(例如ScrapingHub),但我更愿意使用某种类型的进程池+队列在一台机器上运行这个程序,这样就可以同时运行少量固定数量的蜘蛛。
发布于 2018-01-04 15:56:20
最简单的方法是从命令行运行它们。例如:
$ scrapy list | xargs -P 4 -n 1 scrapy crawl将运行所有的蜘蛛,最多有4个并行运行在任何时候。然后,在此命令完成后,可以在脚本中发送通知。
一个更健壮的选项是使用[医]刮伤。这提供了一个API,一个最小的web接口等等。它还将排队的爬行,并只运行一个特定的(可配置的)号码一次。您可以通过API与其交互,启动蜘蛛并在它们完成后发送通知。
刮云非常适合这个免责声明:我为Scrapinghub工作。它只允许您一次运行一个特定的数量,并有一个队列的待定作业(您可以修改,在线浏览,排序,等等)。和更完整的API比剪贴。
你不应该在一个过程中运行所有的蜘蛛。它可能会慢一些,可能会引入不可预见的bug,而且您可能会遇到资源限制(就像您曾经做的那样)。如果您使用上述任何选项单独运行它们,则只需运行足够多的硬件资源(通常是CPU/网络)即可。如果您在这一点上仍然遇到文件描述符的问题,您应该增加限制。
发布于 2018-01-04 04:18:10
它最终锁定并失败,因为它试图在运行它的系统上打开太多的文件描述符。
这可能是一个迹象,表明您需要多台机器来执行您的蜘蛛。可伸缩性问题。嗯,你也可以垂直缩放,使你的单机更强大,但这会达到一个“极限”更快:
还有一个名为ScrapingHub的基于云的分布式爬行服务,它将完全消除您的可伸缩性问题(请注意,我没有做广告,因为我与公司没有关联)。
发布于 2018-01-04 04:26:47
如果信息是相对静态的(基于您提到的过程“完成”),一种解决方案是简单地设置一个脚本,以便按顺序或批量运行爬行。在启动下一个1(或10,或任何批次大小)之前,等待1完成。
另一件需要考虑的事情是,如果您只使用一台计算机,并且出现了这个错误--打开太多的文件并不是真正的资源瓶颈。最好让每个蜘蛛运行200个左右的线程,使网络IO (通常,有时是CPU或诸如此类)成为瓶颈。每个蜘蛛平均完成的速度比当前的解决方案要快,而当前解决方案同时执行它们,并达到一些“最大文件描述符”限制,而不是实际的资源限制。
https://stackoverflow.com/questions/48088582
复制相似问题