【问题标题】:Is there a way to reduce Scrapy's memory consumption?有没有办法减少 Scrapy 的内存消耗?
【发布时间】:2018-01-28 00:47:35
【问题描述】:

我正在尝试使用 Scrapy 抓取一个相当大的网站(大约 100 万页)。蜘蛛工作正常,它能够抓取几千页,然后由于内存不足而不可避免地崩溃。

我尝试过的事情:

  • 使用-s JOBDIR=<DIRECTORY>:这给了我一个初步的改进,我能够抓取的 URL 数量是以前方法的两倍。但是,即使使用此选项,Scrapy 的内存消耗也会缓慢增加,直到它被内存不足的杀手杀死。
  • 防止不必要的功能,例如通过将日志限制从 DEBUG 提高到 INFO 来防止过度输出。
  • 使用 yield 语句而不是返回数组。
  • 将返回的数据保持在绝对最小值。
  • 在更强大的机器上运行蜘蛛:这有助于我爬得更多,但不可避免地它会在稍后再次崩溃(我离 100 万大关还很远)。

有什么我缺少的东西可以帮助我完成抓取吗?

【问题讨论】:

标签: python python-3.x web-scraping scrapy


【解决方案1】:

不要存储任何中间数据。检查代码是否经历了无限循环。

要存储 URL,请使用任何队列代理,例如 RabbitMq 或 Redis。

对于最终数据,使用 python db 连接库(sqlalchemy、mysqlconnecter、pyodc 等取决于所选数据库)存储在任何数据库中

这可以帮助您的代码以分布式和高效的方式运行(记得使用 NUllpool 或 singlepool 以避免过多的数据库连接)

为了简单有效的方法是使用 sqlite db 在状态为已完成或尚未完成的表中插入 100 万 在抓取 URL 数据并将其存储到另一个数据表中后,将 URL 表从“notyet”更新为“done” 这有助于跟踪 scraped 的 URL,以便在出现任何问题时重新启动脚本并仅抓取未完成的日期。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2023-03-18
    相关资源
    最近更新 更多