我目前正在编写一个网络爬虫(使用python框架scrapy)
最近我不得不实施暂停/恢复系统
我实施的解决方案是最简单的,基本上,它们在安排时存储链接,并在实际标记为“已处理”。
因此,当我恢复蜘蛛并且到目前为止一切正常时,我能够获取这些链接(显然存储的内容不仅仅是URL,深度值,链接所属的域等等)。
现在,我刚刚使用mysql表来处理这些存储操作,主要用于快速原型设计。
现在我想知道如何优化它,因为我认为数据库不应该是这里唯一可用的选项。通过优化,我的意思是,使用一个非常简单和轻便的系统,同时仍然能够处理大量短时间内写入的数据
现在,它应该能够处理几十个域的爬行,这意味着每秒存储几千个链接......
提前感谢您的建议
答案 0 :(得分:3)
持久化的最快方法通常是将它们附加到日志中 - 这种完全顺序的访问模式可以最大限度地减少磁盘搜索,这通常是存储时间成本的最大部分。重新启动后,您将重新读取日志并重新构建您在第一时间附加到日志时即时构建的内存结构。
您的特定应用程序可以进一步优化,因为它不一定需要100%的可靠性 - 如果您因为突然崩溃而错过了一些条目,那么,您只需再次抓取它们。因此,您的日志文件可以缓冲,不需要痴迷于fsync。
我认为搜索结构也可以很好地适应内存(如果它只适用于几十个网站,你可能只需保留一个包含所有网址,不需要布隆过滤器或任何花哨的东西) - 如果它没有' t,您可能必须在内存中仅保留一组最近的条目,并定期将该组转储到磁盘(例如,将所有条目合并到Berkeley DB文件中);但我不会对这些选项的细节感到痛苦,因为它似乎不会要求它们。
答案 1 :(得分:1)
在PyCon 2009上有一个演讲,你可能会发现Bill Gribble很有意思,Precise state recovery and restart for data-analysis applications。
另一种保存应用程序状态的快捷方法可能是使用pickle将应用程序状态序列化为磁盘。