在文本文件中保存双端队列

时间:2008-12-10 11:23:20

标签: python web-crawler

我正在用Python编写一个爬虫程序,为了使Ctrl + C不会导致我的爬虫在下次运行中重新开始,我需要将处理双端队列保存在一个文本文件中(每行一个项目)并更新它每次迭代,更新操作都需要超快。为了不重新发明轮子,我问是否有一个已建立的模块来执行此操作?

4 个答案:

答案 0 :(得分:4)

作为替代方案,您可以设置退出功能,并在退出时挑选双端队列。

Exit function
Pickle

答案 1 :(得分:1)

我不确定我是否理解这个问题,我只是很好奇,所以这里有一些问题和建议:

您是否计划捕获Ctrl + C中断并执行双端队列? 如果爬虫因某些任意原因(如未处理的异常或崩溃)崩溃,会发生什么?你失去了队列状态并重新开始? 来自文档:

  

请注意

     

退出时不调用退出功能   该程序被信号杀死,   当一个Python致命的内部错误是   检测到,或os._exit()时   调用。

当您再次访问相同的URI时会发生什么情况,您是在维护访问列表还是其他什么?

我认为你应该为你抓取的每个URI维护某种访问和会话信息/状态。 下次访问同一URI时,您可以使用访问信息决定是否抓取URI。 另一个信息 - 会话信息 - 用于与该URI的最后一个会话将有助于仅获取增量内容,如果页面没有更改,则无需选择它来节省一些数据库I / O成本,重复项等。

这样你就不必担心ctrl + C或崩溃了。如果爬虫由于任何原因而宕机,让我们说在剩下40K以上的时候抓取60K帖子后,下一次爬虫填充队列,虽然队列可能很大但爬虫可以检查它是否已经访问过URI或者不是,当它被抓取时页面的状态是什么 - 优化 - 页面是否需要新的提取,因为它已经改变了。

我希望这有所帮助。

答案 2 :(得分:1)

您应该可以使用pickle来序列化您的列表。

答案 3 :(得分:0)

我想到的一些事情:

  • 保持文件句柄处于打开状态(每次写入内容时都不要关闭文件)
  • 或每n个项目写入文件并捕获一个关闭信号以写入当前未写入的项目