2009-11-23 35 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