有没有办法减少 Scrapy 的内存消耗?

use*_*000 7 python scrapy web-scraping python-3.x

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

我尝试过的事情:

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

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

小智 1

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

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

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

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

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