【问题标题】:crawl a list of sites one by one with scrapy用scrapy一一抓取网站列表
【发布时间】:2013-01-12 19:19:08
【问题描述】:

我正在尝试使用scrapy 抓取网站列表。我试图将网站 url 列表设置为 start_urls,但后来我发现我买不起这么多内存。有什么办法可以设置scrapy一次抓取一两个网站吗?

【问题讨论】:

    标签: python screen-scraping web-crawler scrapy


    【解决方案1】:

    您可以尝试使用concurrent_requests = 1,以免数据过载

    http://doc.scrapy.org/en/latest/topics/settings.html#concurrent-requests

    【讨论】:

      【解决方案2】:

      您可以定义一个start_requests 方法,该方法遍历对您的 URL 的请求。这应该避免一次将所有起始 URL 保存在内存中的开销,并且是解决您描述的问题的最简单方法。

      如果在抓取过程中,scrapy 仍然需要在内存中保存大量 URL,您可以enable persistence support

      如果你真的想一次只喂几个 URL,这可以通过注册 spider_idle 信号并在你的回调函数中添加接下来的几个 URL 并引发 DontCloseSpider 来实现。

      【讨论】:

      • 谢谢。我在其中尝试了 start_requests 和迭代器,但没有帮助。从日志中,我注意到蜘蛛在深入之前仍然爬取了多个域。我知道持久性支持是为了存储蜘蛛爬过的东西,所以下次蜘蛛可以从它开始时,我可能不是在寻找这种情况。如果我理解错了,请纠正我。你能分享更多关于spider_idle信号的第三种方法吗?我对scrapy的经验有限。
      • 我认为不使用 start_urls 的原因是内存使用?在这种情况下 start_requests 意味着您不需要将所有请求都放入内存中。持久性支持避免在内存中保留未完成的(尚未提出的)请求。如果你想限制并发和控制爬取顺序也是可能的,但我不太明白你为什么需要这样做以及你需要实现什么。
      • 我需要解决的唯一问题是通过站点列表减少内存消耗。我在其中使用了 start_requests 和一个迭代器,但蜘蛛仍然爬取了多个域 url。
      • 内存使用情况如何?您似乎假设从多个域中抓取 url 会导致内存问题,但应该没问题
      • 内存随着我在 start_urls 中包含的网站数量成比例增加,所以我假设从多个域中抓取 url 会导致内存问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      相关资源
      最近更新 更多