爬虫判重 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1a1a11a
V2EX    编程

爬虫判重

  •  
  •   1a1a11a 2017-03-09 00:22:22 +08:00 5123 次点击
    这是一个创建于 3190 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般大家用什么办法判断 url 已经被爬过了? 用 hashmap 感觉内存消耗无上限啊,几十 G 内存唰唰唰就满了,用 sqlite 感觉 HDD 会成瓶颈?

    28 条回复    2017-03-12 03:37:30 +08:00
    wmttom
        1
    wmttom  
       2017-03-09 00:24:14 +08:00 via iPhone
    bloom filter
    cdwyd
        2
    cdwyd  
       2017-03-09 00:30:15 +08:00 via Android
    吓一跳,看成了爬虫重判
    cdwyd
        3
    cdwyd  
       2017-03-09 00:32:28 +08:00 via Android
    hashmap 也不会嗖嗖几十个 g 吧,检查下流程,是不是哪里错了。
    gouchaoer
        4
    gouchaoer  
       2017-03-09 00:46:31 +08:00 via Android
    数据库加索引就完了,搞那么复杂
    jiangzhuo
        5
    jiangzhuo  
       2017-03-09 01:15:52 +08:00   1
    首先大家应该是用 url 判重,一般是选取 hostname 、 path 和一部分或者全部的 query 来组合进行 hash 判重。
    就拿把 hash 作为 key 以 string 类型存在 redis 中来说。 计算出来的 key 的 sds 大小是 64 字节,值只有 1 字节, sds 大小 16 字节。
    在没有修改 redis 配置的情况下。
    然后根据 http://www.worldwidewebsize.com/ Google 索引 47 亿多一点
    如果有 47 亿个不同的 url 的话,占用内存是
    4700000000*( 16+16+16+64 )+8589934592*4 = 522.25G (卧槽,打自己脸了

    再算算 如果楼主爬 5 亿个不同网址,大概需要 54G 的 redis ,这应该是一般能买的起的 64G 或者 96G 内存的机器。
    5 亿个网址好像也超过现在的必应了。
    scnace
        6
    scnace  
       2017-03-09 01:32:53 +08:00 via Android
    Bloomfilter 或 数据库加索引
    samcode
        7
    samcode  
       2017-03-09 02:27:44 +08:00   1
    先 crc 或者啥 hash 一下
    1a1a11a
        8
    1a1a11a  
    OP
       2017-03-09 06:36:28 +08:00
    @wmttom bloom filter 在这里不好用吧,再不那么重视准确性的情况下,的确可以用
    1a1a11a
        9
    1a1a11a  
    OP
       2017-03-09 06:37:50 +08:00
    检查过了,主要是 url 数据量太大了,写入磁盘的已经几百 GB 了,不过有些 url 是没意义的,需要想办法过滤掉。
    1a1a11a
        10
    1a1a11a  
    OP
       2017-03-09 06:38:22 +08:00
    @gouchaoer 如果没有 redis 这类的,数据库查询会不会慢? 我没测试过,不太了解
    1a1a11a
        11
    1a1a11a  
    OP
       2017-03-09 06:40:14 +08:00
    @samcode 这个可以考虑,谢谢啦。
    1a1a11a
        12
    1a1a11a  
    OP
       2017-03-09 06:42:53 +08:00
    @jiangzhuo 为什么我 72G 的内存刷刷刷就满了 :(,估计有不少费 url ,加上 python 可能比较费内存,你发的这个网址挺好玩的,不知道为什么中间突然降下去了,我一直觉得网页总数是单调增加的,不过从这个网站看,还挺稳定的。
    1a1a11a
        13
    1a1a11a  
    OP
       2017-03-09 06:43:31 +08:00
    @jiangzhuo 哦,对,你的数值错了,是 470 亿,单位是 10 亿,不是 1 亿,所以你的计算要再乘以 10
    binux
        14
    binux  
       2017-03-09 07:25:34 +08:00
    @1a1a11a #9 你已经写磁盘了?没有去重就已经写磁盘了?那么看起来你并没有实时去重的需求啊。那简单,把 url 排个序 sort | uniq 就行了。
    bjlbeyond
        15
    bjlbeyond  
       2017-03-09 07:57:34 +08:00 via iPhone
    对爬取过的 url 计数,超过一定次数后丢弃
    wmttom
        16
    wmttom  
       2017-03-09 09:43:29 +08:00 via iPhone   2
    @1a1a11a 很多时候几个 9 的准确性已经足够了。
    或者可以利用 Bloomfilter 的特性,不存在的一定不在,存在的再去查询存储索引,看是不是真的存在。
    Lax
        17
    Lax  
       2017-03-09 09:44:38 +08:00
    用 HLL ,内存占用很少,有些误差
    v2pro
        18
    v2pro  
       2017-03-09 09:47:06 +08:00   1
    simhash
    1a1a11a
        19
    1a1a11a  
    OP
       2017-03-09 10:58:30 +08:00
    @binux 我把去重完的 url 写磁盘了和待爬 url 队列写磁盘了,要不内存不一会儿就满,服务器是前兆带宽,我满载了在爬。。。
    1a1a11a
        20
    1a1a11a  
    OP
       2017-03-09 10:59:20 +08:00
    @wmttom 这个主意不错,非常感谢
    allgy
        21
    allgy  
       
    #1 楼正解
    1a1a11a
        22
    1a1a11a  
    OP
       2017-03-09 10:59:47 +08:00
    @bjlbeyond 好像不太对题?还是我没理解到点?
    1a1a11a
        23
    1a1a11a  
    OP
       2017-03-09 11:00:24 +08:00
    @Lax HLL 是什么,三个字母不太好搜,能不能给个名字?谢谢啦!
    1a1a11a
        24
    1a1a11a  
    OP
       2017-03-09 11:03:37 +08:00
    @v2pro 好东西,学习了
    jiangzhuo
        25
    jiangzhuo  
       2017-03-09 11:58:42 +08:00
    @1a1a11a 果然大半夜事多了就是精力不集中, 1#说的对 bloomfilter+个 bigtable 什么的足够了
    1a1a11a
        26
    1a1a11a  
    OP
       2017-03-09 13:02:10 +08:00
    @jiangzhuo 谢谢
    Lax
        27
    Lax  
       2017-03-11 17:22:51 +08:00   1
    @1a1a11a HyperLogLog , redis 内置支持 https://redis.io/commands/pfadd
    1a1a11a
        28
    1a1a11a  
    OP
       2017-03-12 03:37:30 +08:00
    @Lax 谢谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     897 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:01 PVG 05:01 LAX 13:01 JFK 16:01
    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