用python 做爬虫,抓取网站,在抓取的过程中会碰到重复的网址,随着抓取网址的越来越多,网址库越来越大,如果每次爬到网址都去网址库对比一下 是否重复,这样的结果就是效率越来越低了,有什么办法或者算法 提高过滤重复网址的效率? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
soho176
V2EX    Python

用python 做爬虫,抓取网站,在抓取的过程中会碰到重复的网址,随着抓取网址的越来越多,网址库越来越大,如果每次爬到网址都去网址库对比一下 是否重复,这样的结果就是效率越来越低了,有什么办法或者算法 提高过滤重复网址的效率?

  •  
  •   soho176 2013-04-11 15:16:27 +08:00 11218 次点击
    这是一个创建于 4617 天前的主题,其中的信息可能已经有所发展或是发生改变。
    23 条回复    1970-01-01 08:00:00 +08:00
    polythene
        1
    polythene  
       2013-04-11 15:25:34 +08:00   1
    Bloom Filter
    woshifyz
        2
    woshifyz  
       2013-04-11 15:28:16 +08:00   1
    bloom filter ,你要判断不在集合内,所以不会错,而且是常数时间
    richiefans
        3
    richiefans  
       2013-04-11 15:31:34 +08:00
    同求实例 这个算法还是没怎么理解
    cloudzhou
        4
    cloudzhou  
       2013-04-11 15:32:34 +08:00   2
    我提供一个思路给你,在索引里面,定长数据查询效率要远远高于不定长数据,url是不定长数据,但是可以转变成为定长,如果散列足够随机,冲突不大的话,那么可以考虑,比如:
    把url转换成为long值,hash(url) -> id
    long值的范围是 2^64,说实话,我不认为你能达到产生冲突的可能性
    然后做非uniq索引,在每次查询结果列表里面做遍历,在冲突小的情况下,每次基本返回一条数据。

    如果你的数据量很小,允许一定误差,那就根本不考虑冲突的情况。

    这其实就是hash的基本思想。
    sivacohan
        5
    sivacohan  
    PRO
       2013-04-11 15:35:16 +08:00   1
    bloom filter
    SimHash
    littlekfc
        6
    littlekfc  
       2013-04-11 16:03:16 +08:00   1
    用bloom filter有个问题,它是有误判的。比如新的一条url,在bloom filter里查得系统已经存在了。但这会有一定的概率是错误的。数据量还不大的话这个概率很小很小。但是随着记录越来越多,误判的概率会增大的。所以,如果业务要求不能漏url的话,bloom filter不适合,否则可以考虑。
    lookhi
        7
    lookhi  
       2013-04-11 16:05:37 +08:00
    无论怎么做都行,最简单的MD5(URL),比对的时候简单的比对下就好了。

    等你md5都不够用了的话,系统早就要升级了。
    Muninn
        8
    Muninn  
       2013-04-11 17:17:39 +08:00 via Android
    你想变快 肯定要缩短url 想要缩短 肯定会损失信息
    损失了信息肯定会碰撞
    所以别纠结了
    这个地方想完美是没辙的
    和永动机一样做不到的
    Angelkid
        9
    Angelkid  
       2013-04-11 17:34:01 +08:00
    我刚好也在纠结这个问题
    binux
        10
    binux  
       2013-04-11 17:39:42 +08:00
    上10亿了吗?没有?直接hash查库
    Livid
        11
    Livid  
    MOD
    PRO
       2013-04-11 17:46:25 +08:00 via iPhone   2
    把 URL 的 sha256 放到 Redis 里查。
    foxidea
        12
    foxidea  
       2013-04-11 17:49:20 +08:00   1
    告诉你怎么快速:

    把 url 地址 反序一次, md5 一次,然后 取 md5 前三位

    命名为表名 string tableName = "table_"+md5[0]+md5[1]+md5[2];

    然后再封装好算法,进行查、写入
    amazingjxq
        13
    amazingjxq  
       2013-04-11 18:26:47 +08:00
    @foxidea 为什么要反序一次?这样做有什么好处吗
    soho176
        14
    soho176  
    OP
       2013-04-11 18:42:57 +08:00
    @lookhi 当网址足够多的时间 这样的对比 效率很低吧
    soho176
        15
    soho176  
    OP
       2013-04-11 18:49:21 +08:00
    @woshifyz Bloom Filter在时间空间这两个因素之外又引入了另一个因素:错误率。在使用Bloom Filter判断一个元素是否属于某个集合时,会有一定的错误率。也就是说,有可能把不属于这个集合的元素误认为属于这个集合(False Positive),但不会把属于这个集合的元素误认为不属于这个集合(False Negative)。在增加了错误率这个因素之后,Bloom Filter通过允许少量的错误来节省大量的存储空间。
    这样的结果就是有可能这个页面还没有爬过 却跳过了。。。
    lookhi
        16
    lookhi  
       2013-04-11 20:03:07 +08:00
    @soho176 等足够多的时候再考虑。后续可以考虑@foxidea类似的方法。现在你想太多了!
    workaholic
        17
    workaholic  
       2013-04-11 21:52:48 +08:00
    Bloom Filter ++
    csx162
        18
    csx162  
       2013-04-11 22:42:13 +08:00
    先搞清楚慢的地方在哪里。。。
    dingyaguang117
        19
    dingyaguang117  
       2013-04-12 00:06:46 +08:00
    lddhbu
        20
    lddhbu  
       2013-04-12 18:54:13 +08:00
    trie树可以吧
    charnugagoo
        21
    charnugagoo  
       2013-04-14 04:46:43 +08:00
    很大的话,一般用bloomfilter, 如果再大或者是分布式爬虫的话就需要更高级的东西了。
    PS:似乎还可以同时考虑做simhash,找出重复页面。
    Zuckonit
        22
    Zuckonit  
       2013-04-19 16:02:48 +08:00
    hash啊。。。。。常量级
    h4x3rotab
        23
    h4x3rotab  
       2013-04-19 16:40:24 +08:00
    数量没有达到分布式的级别的话,哈希表就完全可以满足你的要求,任何一个实现良好的哈细表都能提供O(1)的查询和修改时间,也不会出错
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3446 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 10:42 PVG 18:42 LAX 02:42 JFK 05:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86