【问题标题】:Save a deque in a text file将双端队列保存在文本文件中
【发布时间】:2008-12-10 11:23:19
【问题描述】:

我正在用 Python 编写一个爬虫,为了使 Ctrl+C 不会导致我的爬虫在下次运行时重新开始,我需要将处理双端队列保存在一个文本文件中(每行一个项目)并更新它每次迭代,更新操作都需要超快。为了不重新发明轮子,请问有没有既定的模块可以做到这一点?

【问题讨论】:

    标签: python web-crawler


    【解决方案1】:

    作为替代方案,您可以设置一个退出函数,并在退出时腌制双端队列。

    Exit function
    Pickle

    【讨论】:

      【解决方案2】:

      您应该能够使用pickle 来序列化您的列表。

      【讨论】:

        【解决方案3】:

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

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

        注意

        退出函数没有被调用 程序被信号杀死, 当一个 Python 致命的内部错误是 检测到,或者当 os._exit() 是 调用。

        当你碰巧再次访问同一个 URI 时会发生什么,你是在维护一个访问列表还是什么?

        我认为您应该为您抓取的每个 URI 维护某种访问和会话信息/状态。 您可以根据访问信息来决定下次访问同一个 URI 时是否抓取该 URI。 与该 URI 的最后一个会话的其他信息 - 会话信息 - 将有助于仅拾取增量内容,如果页面未更改,则无需拾取它,从而节省一些 db I/O 成本、重复等。

        这样您就不必担心 ctrl+C 或崩溃。如果爬虫因任何原因停止运行,假设在爬取 60K 帖子后还剩 40K 时,下一次爬虫填充队列,虽然队列可能很大,但爬虫可以检查它是否已经访问了 URI 或不是,页面被抓取时的状态是什么 - 优化 - 页面是否需要重新拾取,因为它是否已更改。

        我希望这会有所帮助。

        【讨论】:

        • 正如我测试过的,在 CTRL+C 和未处理异常的两种情况下都会调用 atexit 注册函数,并且我发现还需要对访问集进行腌制以恢复程序状态。您的建议很有帮助,非常感谢。
        【解决方案4】:

        我想到的一些事情:

        • 保持文件句柄打开(不要每次写东西都关闭文件)
        • 或每隔 n 项写入文件并捕获关闭信号以写入当前未写入的项

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多