推荐学习书目
› 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 · Apr 11, 2013 · 12049 views
    This topic created in 4956 days ago, the information mentioned may be changed or developed.
    23 replies  •  1970-01-01 08:00:00 +08:00
    polythene
    polythene
    Apr 11, 2013❤️1
    1
    Bloom Filter
    woshifyz
    woshifyz
    Apr 11, 2013❤️1
    2
    bloom filter ,你要判断不在集合内,所以不会错,而且是常数时间
    richiefans
    richiefans
    Apr 11, 2013
    3
    同求实例 这个算法还是没怎么理解
    cloudzhou
    cloudzhou
    Apr 11, 2013❤️2
    4
    我提供一个思路给你,在索引里面,定长数据查询效率要远远高于不定长数据,url是不定长数据,但是可以转变成为定长,如果散列足够随机,冲突不大的话,那么可以考虑,比如:
    把url转换成为long值,hash(url) -> id
    long值的范围是 2^64,说实话,我不认为你能达到产生冲突的可能性
    然后做非uniq索引,在每次查询结果列表里面做遍历,在冲突小的情况下,每次基本返回一条数据。

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

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

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

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

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

    然后再封装好算法,进行查、写入
    amazingjxq
    amazingjxq
    Apr 11, 2013
    13
    @foxidea 为什么要反序一次?这样做有什么好处吗
    soho176
    soho176
    OP
    Apr 11, 2013
    14
    @lookhi 当网址足够多的时间 这样的对比 效率很低吧
    soho176
    soho176
    OP
    Apr 11, 2013
    15
    @woshifyz Bloom Filter在时间空间这两个因素之外又引入了另一个因素:错误率。在使用Bloom Filter判断一个元素是否属于某个集合时,会有一定的错误率。也就是说,有可能把不属于这个集合的元素误认为属于这个集合(False Positive),但不会把属于这个集合的元素误认为不属于这个集合(False Negative)。在增加了错误率这个因素之后,Bloom Filter通过允许少量的错误来节省大量的存储空间。
    这样的结果就是有可能这个页面还没有爬过 却跳过了。。。
    lookhi
    lookhi
    Apr 11, 2013
    16
    @soho176 等足够多的时候再考虑。后续可以考虑@foxidea类似的方法。现在你想太多了!
    workaholic
    workaholic
    Apr 11, 2013
    17
    Bloom Filter ++
    csx162
    csx162
    Apr 11, 2013
    18
    先搞清楚慢的地方在哪里。。。
    dingyaguang117
    dingyaguang117
    Apr 12, 2013
    19
    lddhbu
    lddhbu
    Apr 12, 2013
    20
    trie树可以吧
    charnugagoo
    charnugagoo
    Apr 14, 2013
    21
    很大的话,一般用bloomfilter, 如果再大或者是分布式爬虫的话就需要更高级的东西了。
    PS:似乎还可以同时考虑做simhash,找出重复页面。
    Zuckonit
    Zuckonit
    Apr 19, 2013
    22
    hash啊。。。。。常量级
    h4x3rotab
    h4x3rotab
    Apr 19, 2013
    23
    数量没有达到分布式的级别的话,哈希表就完全可以满足你的要求,任何一个实现良好的哈细表都能提供O(1)的查询和修改时间,也不会出错
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4318 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 04:01 · PVG 12:01 · LAX 20:01 · JFK 23:01
    ♥ Do have faith in what you're doing.