Scrapy并发策略

13

如何更好地扩展Scrapy?

  1. 运行一个scrapy进程并增加CONCURRENT_REQUESTS内部设置。
  2. 运行多个scrapy进程,但仍然专注于增加内部设置。
  3. 通过增加一定数量的scrapy进程来提高效率,同时保持内部设置不变。

如果选择第三种方法,则最好使用哪种软件启动多个Scrapy进程?

分布式多台服务器上部署scrapy的最佳方式是什么?


3
我知道这个问题是一年多以前提出的,但你能否水平扩展 Scrapyd? - gerosalesc
3个回答

17

Scrapyd是管理Scrapy进程的好工具。但最好的答案是它取决于情况。首先需要确定瓶颈在哪里。

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

如果仅限制速度的是请求数量,则调整并发请求。测试您的Internet速度。测试您有多少带宽然后,转到系统监视器中的网络资源,运行您的Spider,并查看与您的最大值相比使用了多少带宽。增加并发请求数,直到不再看到性能提高为止。停止点可以由站点容量确定,尽管仅适用于小型站点,网站反扒/DDoS程序(假设您没有代理或VPN),您的带宽还是系统中的另一个瓶颈。

最后要知道的是,虽然请求以异步方式处理,但项目不是。如果有很多文本并且全部写入本地,它将在写入时阻塞请求。您将在系统监视器网络面板上看到间歇期。您可以调整并发项目,也许可以获得更平滑的网络使用情况,但仍需要相同的时间。如果使用db写入,请考虑延迟插入或具有阈值的执行多个队列,或两者兼而有之。 这里是一个管道,有人编写了异步处理所有数据库写入的方法

最后一个瓶颈可能是内存。我在AWS微实例上遇到了这个问题,尽管在笔记本电脑上,这可能不是问题。如果您不需要它们,请考虑禁用缓存,Cookie和重复过滤器。当然,它们可能非常有用。并发项目和请求也会占用内存。


1
如果你发现自己被阻止了,上述链接将从你提供的列表中随机选择代理。代理会比你的网络慢,但可能比你为避免被阻止所采取的预防措施更快。 - Will Madaus
关于代理,您可以使用带有轮询的负载均衡器。 - Daniel Dror

8

Scrapyd是专门用于部署和运行Scrapy爬虫的工具。基本上,它是一个守护进程,监听运行爬虫的请求。Scrapyd可以在多个进程中运行爬虫,您可以使用max_procmax-proc-per-cpu设置来控制其行为:

max_proc

同时运行的Scrapy进程的最大数量。如果未设置或为0,则将使用系统中可用CPU的数量乘以max_proc_per_cpu选项的值。默认为0。

max_proc_per_cpu

每个CPU同时启动的Scrapy进程的最大数量。默认为4。

它有一个不错的JSON API,并提供了一种方便的部署Scrapy项目到scrapyd的方式

还可以参见:


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

Scrapy Cloud将高效的Scrapy开发环境与强大的生产环境桥接在一起,用于部署和运行您的爬取。它就像Scrapy的Heroku,尽管其他技术将在不久的将来得到支持。它运行在Scrapinghub平台之上,这意味着您的项目可以根据需要按比例扩展。


3
这可能不完全符合您预定义的选择,但是为了并发性和延迟管理,您可以通过在内部设置中削减每个硬限制,让Autothrottle扩展程序来改善您的总体配置,从而为您工作。
它将根据请求的平均域延迟和您以该速度爬行的能力来调整配置。添加新域也变得更加容易,因为您不必担心如何调整该域的配置。
我在一个项目中尝试过,并且结果非常有趣。性能没有显著下降,但可靠性得到了提高。最重要的是,它大大简化了一切,并减少了由于限流或过载而导致抓取失败的风险,这在该项目情况下是一个问题。
我知道这个问题很旧,但我希望这对寻求可靠性的人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接