【问题标题】:Designing a multi-process spider in Python用 Python 设计一个多进程蜘蛛
【发布时间】:2009-11-23 17:20:13
【问题描述】:

我正在用 Python 开发一个多进程蜘蛛。它应该开始抓取一页的链接并从那里开始工作。具体来说,顶级页面包含类别列表、这些类别中的二级页面事件以及事件中的最终、三级页面参与者。我无法预测会有多少类别、活动或参与者。

我不知道如何最好地设计这样的蜘蛛,尤其是如何知道它何时完成爬网(预计它会继续运行,直到它发现并检索到每个相关页面)。

理想情况下,第一次抓取是同步的,其他一切都是异步的,以最大限度地并行解析和添加到数据库,但我一直不知道如何确定抓取何时完成。

你建议我如何构建蜘蛛,就并行进程,尤其是上述问题而言?

【问题讨论】:

    标签: python multithreading web-crawler


    【解决方案1】:

    您可能想研究Scrapy,这是一个异步(基于Twisted)网络爬虫。看起来对于您的任务,蜘蛛的 XPath 描述很容易定义!

    祝你好运!

    (如果你真的想自己做,也许可以考虑使用小型 sqlite 数据库来跟踪每个页面是否被点击......或者如果它的大小合理,只需在内存中做......扭曲general 可能是你的好朋友。)

    【讨论】:

    • 我已经有了组件模块和类(解析器、数据库等),但我不知道如何将它们粘合在一起。如果我跟踪我点击过的页面,我怎么知道我何时完成了 /last/ 页面?
    • 我在想象(在同步系统中),你会保留一个队列或堆栈(在查看组页面时添加页面,或其他),当它变空时,你就完成了.
    • 同步很容易。我想我已经把它舔了,谢谢。我没有正确理解 task_done()。
    【解决方案2】:

    我假设您将要访问的项目放在 queue 中,使工作人员耗尽队列,工作人员找到要访问的新项目并将它们添加到队列中。

    当所有worker都空闲,并且要访问的项目队列为空时,它就完成了。

    当工作线程利用队列的task_done() 方法时,主线程可以join() 阻塞队列直到它为空。

    【讨论】:

    • 嗯。我怎么知道队列是空的,因为一切都已完成,或者说,因为类别少于工作进程,即使队列远未完成也会清空队列?
    • 抱歉,我发的太早了。我对您所说的进行了更多思考,而 multiprocessing.JoinableQueue.task_done() 和 .join() 正是我想要的。我只需要确保在调用 task_done() 之前将新任务添加到队列中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多