4

我目前正在编写一个网络爬虫(使用 python 框架scrapy)。
最近我不得不实现一个暂停/恢复系统。
我实现的解决方案是最简单的一种,基本上,当它们被安排时存储链接,并在它们实际存在时将它们标记为“已处理”。
因此,当恢复蜘蛛时,我能够获取这些链接(显然存储的不仅仅是 URL、深度值、链接所属的域等......),到目前为止一切正常。

现在,我一直在使用 mysql 表来处理这些存储操作,主要用于快速原型设计。

现在我想知道如何优化它,因为我相信数据库不应该是这里唯一可用的选项。通过优化,我的意思是,使用一个非常简单和轻量级的系统,同时仍然能够处理在短时间内写入的大量数据

目前,它应该能够处理几十个域的爬取,这意味着每秒存储几千个链接......

提前感谢您的建议

4

2 回答 2

4

持久化事物的最快方法通常是将它们附加到日志中——这种完全顺序的访问模式最大限度地减少了磁盘查找,这通常是存储时间成本的最大部分。重新启动后,您重新读取日志并重建您在最初附加到日志时也在动态构建的内存结构。

您的特定应用程序可以进一步优化,因为它不一定需要 100% 的可靠性——如果您由于突然崩溃而错过编写一些条目,嗯,您将再次抓取它们。因此,您的日志文件可以被缓冲,并且不需要过分同步。

我想搜索结构也可以很好地适应内存(如果它只适用于几十个网站,你可能只需要保留一组包含所有 URL,不需要布隆过滤器或任何花哨的东西)——如果没有,你可能只需要在内存中保留一组最近的条目,并定期将其转储到磁盘(例如,将所有条目合并到Berkeley DB文件中);但我不会详细介绍这些选项,因为您似乎不需要它们。

于 2009-11-13T15:39:50.487 回答
2

在 PyCon 2009 上有一个演讲,您可能会觉得有趣,Bill Gribble 的数据分析应用程序的精确状态恢复和重启。

保存应用程序状态的另一种快速方法可能是使用pickle将应用程序状态序列化到磁盘。

于 2009-11-13T14:43:54.807 回答