【转】爬虫入门一
2019獨角獸企業重金招聘Python工程師標準>>>
?
怎樣對連接進行判重?
Bloom Filter. 簡單講它仍然是一種hash的方法,但是它的特點是,它可以使用固定的內存(不隨url的數量而增長)以O(1)的效率判定url是否已經在set中。可惜天下沒有白吃的午餐,它的唯一問題在于,如果這個url不在set中,BF可以100%確定這個url沒有看過。但是如果這個url在set中,它會告訴你:這個url應該已經出現過,不過我有2%的不確定性。注意這里的不確定性在你分配的內存足夠大的時候,可以變得很小很少。一個簡單的教程:Bloom Filters by Example
集群化抓取
????????爬取豆瓣的時候,我總共用了100多臺機器晝夜不停地運行了一個月。想象如果只用一臺機子你就得運行100個月了...那么,假設你現在有100臺機器可以用,怎么用python實現一個分布式的爬取算法呢?
????????我們把這100臺中的99臺運算能力較小的機器叫作slave,另外一臺較大的機器叫作master,那么回顧上面代碼中的url_queue,如果我們能把這個queue放到這臺master機器上,所有的slave都可以通過網絡跟master聯通,每當一個slave完成下載一個網頁,就向master請求一個新的網頁來抓取。而每次slave新抓到一個網頁,就把這個網頁上所有的鏈接送到master的queue里去。同樣,bloom filter也放到master上,但是現在master只發送確定沒有被訪問過的url給slave。Bloom Filter放到master的內存里,而被訪問過的url放到運行在master上的Redis里,這樣保證所有操作都是O(1)。(至少平攤是O(1),Redis的訪問效率見:LINSERT – Redis)? 考慮如何用python實現:
在各臺slave上裝好scrapy,那么各臺機子就變成了一臺有抓取能力的slave,在master上裝好Redis和rq用作分布式隊列。
以上簡要示例的具體開源項目:darkrho/scrapy-redis · GitHub
展望及后處理
雖然上面用很多“簡單”,但是真正要實現一個商業規模可用的爬蟲并不是一件容易的事。上面的代碼用來爬一個整體的網站幾乎沒有太大的問題。但是如果附加上你需要這些后續處理,比如
作者:謝科
鏈接:https://www.zhihu.com/question/20899988/answer/24923424
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
轉載于:https://my.oschina.net/zengjs275/blog/779249
總結
- 上一篇: @Controller和@RestCon
- 下一篇: 【LeetCode】405 Conver