自己寫的爬蟲程序運行停止,下次運行如何不重複爬取?

爬取頁面的內容,我自己停止程序,下次運行時如何接著爬取?


無論是Python也好,java也罷,凡是爬蟲,你爬下來的東西有百分之九十九的概率會存下來,當然,如果不存下來那就別繼續往下看了。
首先,爬下來的數據保存到資料庫或者其他地方。
其二,使用集合構建一個緩存,自己看內存,數據多少定大小。
其三,重新啟動爬蟲後載入已有的數據到這個緩存池,每次爬到數據先在這個緩存池裡找,如果沒有在去資料庫裡面找,然後更新緩存池。
其四,這個緩存池的優化演算法有很多,可以把碰撞率提高到一個很可觀的狀態,具體樓主可以google或者百度下。。。(link給一個緩存演算法_百度百科)

自己寫的一個知乎爬蟲 MatrixSeven/ZhihuSpider
效果如下,去重效果還是挺可觀了~~4612221~
另外附之前搞得一個蟲子還在爬。。。是時候統計下了。。_java吧_百度貼吧帖子~
甩個圖~


這種需求,簡單說,就是搞個可持久化的MQ。

至於是自己做個broker還是直接用現成的,甚至都不是重點。


用Bloom filter存已爬的。。。


本人是這樣玩的,創建一個xmlrpc 提供服務,redis + Bloom filter 每次比較一下,沒有的保存到redis。
這樣的架構適合分散式爬蟲。


如果你用scrapy的話,可以使用這個 scrapy-plugins/scrapy-deltafetch
不是的話,可以把爬取過的存在redis或者其他資料庫內,
下次爬的時候先看看有沒有在資料庫內,在的話就跳過...


考慮下你的爬蟲架構,維護一個 link 庫,選擇一個合適的判斷需要抓取的 link 的演算法。


scrapy_redis , github上有,支持簡單的分散式


靠 不請自來,今天剛做了一個妹子圖爬蟲,如何防止重複爬取,我的思想就是每爬取一個網頁,就將其插入資料庫中,如果程序停止,就用需要爬的網址列表的集合減去已經爬到的網頁集合,得到的結果就是沒有爬過的網址。

# 需要下載的地址 這裡採用mongodb資料庫
img_links = [link["img_link"] for link in img_link.find()]
# 已下載的地址
downloaded_link = [link["img_link"] for link in downloaded_Link.find()]
# 未下載的地址
undownload_link = set(img_links) - set(downloaded_link)


最近剛好在做搜索引擎,強答一發。
對於python來說這個問題還是很容易實現的,簡單來說,方法就是定時記錄日誌。
比如每爬取10000個網頁,就記錄一下當前隊列里待爬取的網頁,保存到文件里,下次爬的時候用這個隊列初始狀態爬就行了。
當然最好順便保存一下已經爬取了的鏈接池,這樣下次爬取的初始狀態就完全確定了。


Scrapy框架1 scrapy-redis模塊
2 scrapy crawl xx -s jobdir=xxx
前者各種東西都存儲在redis中,後者存在了本地文件中


如果是爬很多頁的那種,我會建一個txt保存頁號,下次啟動時候直接從當前頁開始。
如果是每天刷新的網頁內容,我會保存第一條信息,然後對爬取的每條信息做比對,如果一樣則程序停止。

簡潔的說就是做一個日誌,第二次開始之前先讀取日誌。


url緩存,url狀態記錄,待爬,正在爬,爬好了

我用的mongodb,簡單一些,用redis做爬蟲消息隊列好像更好,但是貌似不做持久化配置關了redis數據就沒了


把爬過的東西記錄在一個地方,下次爬之前去裡面找,找到就不爬。

建議把爬過的數據鏈接放在資料庫,較妥。


scrapy有個啟動參數jobdir,自動保存抓取進度,詳細使用方法自己官網查,拿走不謝。


已爬過的url存起來


很多優秀的爬蟲框架可以參考==


原理自然是隨時保存當前的狀態以便恢復,保存哪些數據由需求決定
比如你爬一個wiki,因為頁面基本是不動的,所以隨時保存已爬取和待爬取的url到資料庫就行了
再比如你爬知乎某大V的動態,只要隨時保存最新一條狀態的ID,重啟的時候從新開始爬,一直爬到這個ID為止


具體問題具體分析

抽象問題分析個屁啊


把爬過的url寫到文件里,例如pickle模塊等,然後程序開始運行時就從文件里load,遇到異常,就把爬過的url重新dump文件中


兄弟
這是設計的問題,再次才是不是技術的問題。

先說技術的問題,你可以用布隆過濾器把爬取的URL取出來存在一起。然後開始爬取的時候,對爬到的URL進行過濾,如果在就不爬。

但是,我不覺得這是一種特別好的辦法,你可以自己試試感受下。

我自己的話,通過設計來解決這個問題。不過比較長。。。


直接給個快照


當然是崩潰前記錄已爬過的link。


推薦閱讀:

如何用scrapy提取不在標籤內的文字?
tcp 編程中,connect 連接成功的標準是什麼?
tcp連接的問題?
前途未卜的准程序員,吃過苦頭有智慧的或者過來人前輩大牛有什麼樣的忠告給當局者?
金融工程的新生怎麼選購筆記本電腦?

TAG:Python | 編程 | 爬蟲計算機網路 |