Scrapy并发策略

时间:2014-07-11 06:24:51

标签: python concurrency web-scraping scrapy

什么是缩放Scrapy的更好方法?

  1. 运行一个scrapy流程并增加CONCURRENT_REQUESTS内部Scrapy设置
  2. 通过运行多个scrapy进程,但仍然专注于增加内部设置。
  3. 通过增加内部设定值的scrapy次数增加。
  4. 如果是3 - 那么什么软件更适合用于启动多个scrapy流程?

    在多个服务器之间分发scrapy的最佳方法是什么?

3 个答案:

答案 0 :(得分:10)

Scrapyd是管理Scrapy流程的绝佳工具。但我能给出的最佳答案是它取决于它。首先,你需要弄清楚你的瓶颈在哪里。

如果是CPU密集型解析,则应使用多个进程。 Scrapy能够通过Twisted的Reactor模式实现并行处理1000个请求。但它只使用一个进程而没有多线程,因此它只使用一个核心。

如果只是限制速度的请求数,请调整并发请求。测试你的网速。 To test how much bandwidth you have然后,转到系统监视器中的网络资源,运行蜘蛛并查看与最大值相比使用的带宽量。增加并发请求,直到您看到性能提升为止。停止点可以由站点容量确定,但仅限于小站点,站点反刮/ DDoS程序(假设您没有代理或vpns),您的带宽或系统中的另一个阻塞点。 最后要知道的是,虽然请求是以异步方式处理的,但项目却不是。如果你有很多文本并在本地写入所有内容,它会在写入时阻止请求。您将在系统监视器网络面板上看到暂停。您可以调整并发项目,并可能获得更平滑的网络使用,但它仍将花费相同的时间。如果您正在使用数据库写入,请考虑插入延迟,或者在阈值之后执行多次的队列,或两者兼而有之。 Here is a pipeline someone wrote to handle all db writes async。 最后的阻塞点可能是记忆。我在AWS微型实例上遇到过这个问题,虽然在笔记本电脑上,它可能不是问题。如果您不需要它们,请考虑禁用缓存,cookie和dupefilter。当然,他们可以非常有帮助。并发项和请求也会占用内存。

答案 1 :(得分:7)

Scrapyd完全用于部署和运行scrapy蜘蛛。基本上它是一个监听蜘蛛请求的守护进程。 Scrapyd在多个流程中运行蜘蛛,您可以使用max_procmax-proc-per-cpu设置来控制行为:

  

max_proc

     

将要执行的最大并发Scrapy进程数   开始。如果未设置或0,它将使用可用的cpus数   系统乘以max_proc_per_cpu选项中的值。默认为   0

     

max_proc_per_cpu

     

最大并发Scrapy进程数   将按每个cpu启动。默认为4。

它有一个很好的JSON API,并为scrapyd提供了一个方便的way to deploy scrapy项目。

另见:


另一种选择是使用其他服务,例如Scrapy Cloud

  

Scrapy Cloud为高效的Scrapy开发奠定了基础   环境具有强大,功能齐全的生产环境   部署并运行您的爬网。它虽然像Scoku的Heroku   其他技术将在不久的将来得到支持。它继续运行   Scrapinghub平台的顶部,这意味着您的项目可以扩展   需求,根据需要。

答案 2 :(得分:2)

这可能不完全在您预定义的选择中,但对于并发和延迟管理,您可以通过切断内部设置中的每个硬限制来改善整体配置,并让Autothrottle扩展为您工作

它会根据您的请求的平均域延迟以及以此速度抓取的能力来调整您的配置。添加新域也变得更加容易,因为您不必担心如何调整该域的配置。

我尝试了一个项目,结果非常有趣。没有出现巨大的性能下降,但可靠性得到了提高。最重要的是,它简化了所有操作并降低了由于节流或过载而导致爬行失败的风险,这是该项目情况中的一个问题。

我知道这个问题已经过时了,但我希望这也能帮助那些寻求可靠性的人。