2013-06-12 55 views
0

我希望你能幫助我。我試圖抓取包含信息的4500個鏈接的網站。因此,結構是這樣的:爬行大型網站,處理超時

1級(只是不同類別)
第2層(含不同的主題)
第3層(含主題信息)

所以我的腳本打開每一類中環 - 然後按主題打開主題,並從第3層中提取所有信息。但由於存在4500個主題,所以我遇到了問題,有時會出現超時錯誤,此後我必須從頭開始嘗試(有時在200個主題之後,以及其他時間是在2200個話題之後)。我的問題是如何以正確的方式做到這一點,所以如果它崩潰,我可以繼續下一個主題,而不是從一開始就崩潰。我是Ruby和Crawling的新手,希望能聽到每一條建議。

謝謝!

回答

0

你絕對應該拆分你的解析器例程,並同時將臨時數據保存到數據庫中。

我的做法是:

  1. 抓取一級收集類別。將它們保存到臨時數據庫。
  2. 使用數據庫,爬取第2層以收集主題列表。將它們保存到DB中。
  3. 使用數據庫,抓取第3層來獲取實際內容。將它們保存到DB中,如果發生錯誤,則跳過/重試。
+0

「臨時數據庫」可能是一個實際的關係數據庫,或者您可以使用Ruby的'Hash' /'Array'。 – saki7

+0

臨時數據庫是否存儲在某個地方,或者每次只是一次又一次填充臨時數據庫。例如,如果我做了前兩個步驟,然後讓步驟3失敗了。如果我重新啓動應該是步驟1和2再做一次,或者應該只是步驟3重新啓動。如果是這樣,我必須保存它失敗的地方? – user2448801

+0

這完全取決於你的選擇和設計思想。如果您希望在應用程序重新啓動後從錯誤中回退,則必須將其存儲在永久存儲中;否則你可以將它存儲在內存中。在我看來,我會選擇將它存儲在一個簡單的JSON文件中。 ActiveSupport爲哈希和數組提供'to_json'方法。與應用程序設計相關的進一步問題將過於籠統。你必須在新線索中提出更具體的問題。 – saki7