0

现在我有一个简单的网络爬虫,它逐页获取,将它的 url 放入访问列表(也将记录写入数据库),在页面上查找 url,如果它们不在访问列表中,则将它们放入未访问列表。然后它从未访问过的 url 中获取。

简单的。

但是慢。在 DigitalOcean 的最小实例上,它仅使用 2-3% 的 CPU。并且访问列表不断增长。如果我启动 python interpriter (2.7x32) 并创建一个带有类似 url 的字符串的列表,那么它将需要大约 0.5 GB 的 RAM。不好。另外我想在一段时间后从访问列表中删除 url 以再次解析它(信息可以更改)

所以我有几个关于修改这个过程的问题。如何保存进程状态以确保它会快速重新启动,并且如果发生中断,不要遍历每个访问过的 url。

如何在爬虫之间共享当前状态:

  • 创建一个 RabbitMQ 队列并将要访问的 url 放入其中
  • 使用队列的一些全局python对象在“内部”使用它并在不同线程中的工作人员之间共享

?

4

1 回答 1

0

您可以(not)visiteUrls通过实现最近最少使用的缓存算法来限制结构的大小。您可以限制它的大小,以便在达到限制时丢弃最旧的 url。这样你的爬虫就不会占用超过 X 内存。调整缓存大小将导致内存和再次检查访问过的 url 的机会之间的平衡。

为了保留状态 - 我能想到的最简单的解决方案是定期将缓存写入文件。例如,一行中的单个 url。它也很容易解析。我想这会很慢,但这是一个起点,你可以在几分钟内完成一次。您不必担心存储的版本不是最准确/最新的,因为您已经从缓存中删除了 url,并且最终会在某个时候再次访问它们。

于 2013-10-01T14:46:59.973 回答