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