为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免重复抓取同一个网页

如何避免重复抓取同一个网页

慕少森 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条经验 获得超4个赞

我没有用过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条经验 获得超5个赞

    这样的问题应该很好解决,写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 关注
    • 915 浏览
    慕课专栏
    更多

    添加回答

    举报

    0/150
    提交
    取消
    意见反馈 帮助中心 APP下载
    官方微信