【发布时间】:2008-12-10 11:23:19
【问题描述】:
我正在用 Python 编写一个爬虫,为了使 Ctrl+C 不会导致我的爬虫在下次运行时重新开始,我需要将处理双端队列保存在一个文本文件中(每行一个项目)并更新它每次迭代,更新操作都需要超快。为了不重新发明轮子,请问有没有既定的模块可以做到这一点?
【问题讨论】:
标签: python web-crawler
我正在用 Python 编写一个爬虫,为了使 Ctrl+C 不会导致我的爬虫在下次运行时重新开始,我需要将处理双端队列保存在一个文本文件中(每行一个项目)并更新它每次迭代,更新操作都需要超快。为了不重新发明轮子,请问有没有既定的模块可以做到这一点?
【问题讨论】:
标签: python web-crawler
作为替代方案,您可以设置一个退出函数,并在退出时腌制双端队列。
【讨论】:
您应该能够使用pickle 来序列化您的列表。
【讨论】:
我不确定我是否理解了这个问题,我只是好奇,所以这里有几个问题和建议:
您是否打算捕获 Ctrl+C 中断并执行双端队列? 如果爬虫由于某种任意原因(例如未处理的异常或崩溃)而崩溃会发生什么?您失去了队列状态并重新开始? 来自文档:
注意
退出函数没有被调用 程序被信号杀死, 当一个 Python 致命的内部错误是 检测到,或者当 os._exit() 是 调用。
当你碰巧再次访问同一个 URI 时会发生什么,你是在维护一个访问列表还是什么?
我认为您应该为您抓取的每个 URI 维护某种访问和会话信息/状态。 您可以根据访问信息来决定下次访问同一个 URI 时是否抓取该 URI。 与该 URI 的最后一个会话的其他信息 - 会话信息 - 将有助于仅拾取增量内容,如果页面未更改,则无需拾取它,从而节省一些 db I/O 成本、重复等。
这样您就不必担心 ctrl+C 或崩溃。如果爬虫因任何原因停止运行,假设在爬取 60K 帖子后还剩 40K 时,下一次爬虫填充队列,虽然队列可能很大,但爬虫可以检查它是否已经访问了 URI 或不是,页面被抓取时的状态是什么 - 优化 - 页面是否需要重新拾取,因为它是否已更改。
我希望这会有所帮助。
【讨论】:
我想到的一些事情:
【讨论】: