2008-12-10 28 views
1

我在Python中編寫了一個爬蟲,爲了使Ctrl + C不會導致我的爬蟲在下次運行時重新開始,我需要將處理deque保存在文本文件中(一個每行項目)並在每次迭代中更新它,更新操作需要超快。爲了不重新發明輪子,我問是否有一個建立的模塊來做到這一點?在文本文件中保存一個deque

回答

4

作爲一種替代方案,您可以設置退出函數,並在退出時醃出雙端隊列。

Exit function
Pickle

0

浮現在我的腦海裏有些東西:

  • 保留文件處理打開(不要關閉您寫的文件,每次的東西)
  • 或寫入文件中的每個n項和趕關閉信號寫當前非書面的項目
1

我不知道如果我理解正確的問題,我只是好奇,所以這裏有一些問題和建議:

你打算捕捉Ctrl + C中斷並執行雙端隊列嗎? 如果抓取程序因某種任意原因(如未處理的異常或崩潰)崩潰,會發生什麼情況?你放棄隊列狀態並重新開始? 從文檔:

當 程序由信號殺死不叫出口函數, 當 檢測一個Python致命內部錯誤時,或者當os._exit()叫 。

當你碰巧再次訪問相同的URI時,你會維護一個訪問列表或什麼?

我想你應該爲每個抓取的URI維護某種訪問和會話信息/狀態。 下次訪問同一個URI時,您可以使用訪問信息決定是否抓取URI。 其他信息 - 會話信息 - 對於最後一次使用該URI的會話將有助於僅拾取增量內容,如果頁面不更改,則不需要保存某些數據庫I/O成本,重複項等。

這樣你就不必擔心ctrl + C或崩潰。如果爬蟲出於某種原因失敗,可以說在爬滿60K個帖子後剩下40K的帖子時,下一次爬蟲填充隊列,雖然隊列可能很大,但爬蟲可以檢查它是否已經訪問過URI或不是,當它被抓取時頁面的狀態是什麼 - 優化 - 頁面是否需要一個新的拾取因爲它已經改變或沒有改變。

我希望這有些幫助。

+0

正如我測試過的,atexit註冊的函數在CTRL + C和未處理的異常的情況下都被調用,並且我已經發現爲了恢復程序狀態,訪問集也需要被醃製。你的建議很有幫助,非常感謝。 – btw0 2008-12-10 17:59:31