亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何避免重復抓取同一個網頁

如何避免重復抓取同一個網頁

慕少森 2019-02-23 19:12:33
自己寫一個python網頁抓取的程序,碰到一個問題 url是http://xxx 網頁代碼是這樣的: <!DOCTYPE html> <html> <head> <meta charset=utf8> <title>Crawl Me</title> </head> <body> <ul> <li><a href=page1.html>page 1</a></li> <li><a href="page2.html">page 2</a></li> <li><a href='page3.html'>page 3</a></li> <li><a href='mirror/index.html'>mirror</a></li> <li><a href='javascript:location.href="page4.html"'>page 4</a></li> </ul> </body> </html> 在點擊mirror的時候,頁面會跳轉到http://xxx/mirror/index.html 再點擊mirror,又會跳轉到http://xxx/mirror/mirror/index.html 我在抓取的時候就會出現循環地重復地去抓這個index.html的問題 我用md5去計算這個網頁的內容,發現每次index.html的內容的md5的值都是不同的,但是抓取到的網頁,我用 md5sum得到的結果又是一樣的,非常郁悶…… 代碼如下 content = urllib2.urlopen(url).read() md5obj = hashlib.md5() md5obj.update(content) print md5obj.hexdigest() 發現每一次的md5碼都不同 現在有兩個問題: 1、有什么辦法能夠在這樣的情況下避免重復抓??? 2、為什么python里每一個md5值都不同,而md5sum的結果是相同的?
查看完整描述

7 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

md5sum一樣,但每次python算的md5值不一樣,說明:你的用法錯了,我目測你在每次計算md5值的時候還是用前一次用過的md5對象,這當然不一樣了。如果同一個md5對象第一次update了'a',沒有清空數據,第二次又update了'a',那你再調hexdigest算出來的是'aa'的md5值:

import hashlib

m = hashlib.md5()
m.update('a')
print m.hexdigest()    // 0cc175b9c0f1b6a831c399e269772661
m.update('a')
print m.hexdigest()    // 4124bc0a9335c27f086f24ba207a4912

m = hashlib.md5()
m.update('aa')
print m.hexdigest()    // 4124bc0a9335c27f086f24ba207a4912


可以看到,兩次update('a')的效果和一次update('aa')的效果是相同的

查看完整回答
反對 回復 2019-03-01
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

你可以試試對url進行md5的計算,每次抓取url的時候,先判斷下這個url是不是已經抓取過了

查看完整回答
反對 回復 2019-03-01
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

我沒有用過python,不過看你用md5值,你看看能不能用crc32(循環冗余校驗)的值來判斷唯一性呢

查看完整回答
反對 回復 2019-03-01
?
達令說

TA貢獻1821條經驗 獲得超6個贊

如果相同url出現的位置具有規律,比如你上面的mirror總是第四個

  • , 那么可以通過在python代碼中排除它。

    如果相同url出現完全沒有規律,那么你可以新建一個set,或者其他容器,爬過的url放入該容器。在可能重復的地方,驗證該url是否已經存在于該容器。

  • 查看完整回答
    反對 回復 2019-03-01
    ?
    楊魅力

    TA貢獻1811條經驗 獲得超6個贊

    使用Python的set數據結構, 每次遇到一個鏈接,判斷它是否已經在該set中,是=>不添加; 不是=>添加到set中;

    然后是一個queue,從set中pop鏈接,針對每一個鏈接做相應處理

    不知我講清楚沒有?

    查看完整回答
    反對 回復 2019-03-01
    ?
    ibeautiful

    TA貢獻1993條經驗 獲得超6個贊

    這樣的問題應該很好解決,寫robot

    查看完整回答
    反對 回復 2019-03-01
    ?
    繁花不似錦

    TA貢獻1851條經驗 獲得超4個贊

    判斷網頁是否抓去過,可以使用bloomFilter算法.可以準確的判斷不存在.判斷存在則有一定的概率誤差.網頁抓取這種可以接受這種誤差.
    在搜索引擎領域,Bloom-Filter最常用于網絡蜘蛛(Spider)的URL過濾,網絡蜘蛛通常有一個URL列表,保存著將要下載和已經下載的網頁的URL,網絡蜘蛛下載了一個網頁,從網頁中提取到新的URL后,需要判斷該URL是否已經存在于列表中。此時,Bloom-Filter算法是最好的選擇。Bloom-Filter算法的核心思想就是利用多個不同的Hash函數來解決“沖突”。占用的空間性價比很高.

    查看完整回答
    反對 回復 2019-03-01
    • 7 回答
    • 0 關注
    • 974 瀏覽
    慕課專欄
    更多

    添加回答

    舉報

    0/150
    提交
    取消
    微信客服

    購課補貼
    聯系客服咨詢優惠詳情

    幫助反饋 APP下載

    慕課網APP
    您的移動學習伙伴

    公眾號

    掃描二維碼
    關注慕課網微信公眾號