2009-11-23 29 views
3

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

对于如何最好地设计这样一个蜘蛛,特别是如何知道它何时完成爬行(预计它将继续前进直到它发现并检索每个相关页面),我有点不知所措, 。

理想情况下,第一次刮会是同步的,其他所有异步最大化并行解析和添加到数据库,但我坚持如何确定何时完成抓取。

对于并行进程,特别是上面的问题,你会如何建议我构建蜘蛛?

回答

1

我推测你正在将项目放在queue中,这样就耗尽了工作人员的排队时间,工作人员找到要访问的新项目并将其添加到队列中。

当所有工作人员闲置并且要访问的项目队列都为空时,结束。

当工作人员利用队列的task_done()方法时,主线程可以阻止队列,直到其为空。

+0

嗯。我怎么知道队列是空的,因为一切都完成了,或者因为比工作进程更少的类别,即使这个队列还没有完成,它会清空队列? – wbg 2009-11-23 18:39:35

+0

对不起,我发布的过快。我更多地考虑过你说的,multiprocessing.JoinableQueue.task_done()和.join()正是我正在寻找的。我只需要确保在调用task_done()之前将新任务添加到队列中。 谢谢! – wbg 2009-11-23 18:52:51

2

您可能想要查看Scrapy,这是一个异步(基于Twisted)web刮板。它看起来像你的任务,蜘蛛的XPath描述很容易定义!

祝你好运! (如果你真的想自己做,也许考虑有一个小的SQLite数据库,以跟踪每个页面是否被击中或者如果它是合理的大小,只是在内存中... ...扭曲一般来说可能是你打的朋友。)

+0

我已经有组件模块和类(解析器,db等),但我坚持如何将它们粘合在一起。 如果我跟踪了我打过的页面,我怎么知道我何时完成了/ last/page? – wbg 2009-11-23 18:33:51

+0

我想象(在一个同步系统中),你会保留一个队列或堆栈(当看一个组页面时添加页面,或者其他任何东西),当它变成空的时候,你就完成了。 – 2009-11-23 19:16:12

+0

同步很简单。我想我已经明白了,谢谢。我没有正确理解task_done()。 – wbg 2009-11-23 22:05:32