V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
laskuma
V2EX  ›  问与答

爬虫如何处理重复抓取的网页?

  •  
  •   laskuma · 2013-02-27 12:55:47 +08:00 · 6843 次点击
    这是一个创建于 4306 天前的主题,其中的信息可能已经有所发展或是发生改变。
    入门开始写一个爬虫。在爬进一个地址之前是不是需要检测那个地址是否被爬过呢?
    检测的时候一般用什么方法呢?暂时能想到的是用HashMap.
    17 条回复    1970-01-01 08:00:00 +08:00
    fishsjoy
        1
    fishsjoy  
       2013-02-27 13:13:52 +08:00   ❤️ 1
    bloom filter
    xingzhi
        2
    xingzhi  
       2013-02-27 13:15:37 +08:00   ❤️ 1
    hashMap是可以,但相对而言耗内存。
    如ls所说,用布隆过滤器较好。 吴军的书 《数学之美》中有详细的介绍。
    twm
        3
    twm  
       2013-02-27 13:15:45 +08:00   ❤️ 1
    做一个redis集群,或者memcache集群,bdb也行,抓取过的就扔进去,每次要抓取的时候检查一下。
    xingzhi
        4
    xingzhi  
       2013-02-27 13:17:38 +08:00
    很久前收藏的一篇文章, 你可以看看:
    http://www.xiuwz.com/site/tech-bloom-filter/
    laskuma
        5
    laskuma  
    OP
       2013-02-27 13:22:31 +08:00   ❤️ 1
    @xingzhi 多谢分享!
    forest520
        6
    forest520  
       2013-02-27 13:47:37 +08:00
    @fishsjoy
    @xingzhi
    @twm 很多情况下,一个相同的网页可以有很多不同的URL地址,譬如加上一些识别来源的动态参数等,这种情况有什么办法识别是重复的URL?比如:
    item.taobao.com/item.htm?spm=1020.3.9.79.4L0esQ&id=15480553483&from=
    item.taobao.com/item.htm?id=15480553483
    其实是一个网页。
    xingzhi
        7
    xingzhi  
       2013-02-27 13:57:22 +08:00
    @forest520
    我觉得这个就没有万能的解决方案了,得视网站而定。
    如你举的例子,可以先找出taobao究竟是以什么参数来决定这个页面的。
    这里是id, 那就在获取url后,抽取出id来进行二次判断。
    laskuma
        8
    laskuma  
    OP
       2013-03-01 13:31:13 +08:00
    @xingzhi 还想再问一个问题 如何获取tinyurl的真实url呢? 我在java下用getresponcecode拿到的是200不是301= =
    crazybubble
        9
    crazybubble  
       2013-03-01 16:44:31 +08:00
    @laskuma python里的方法是,urllib2.urlopen("http://bit.ly/XKqphv").geturl()
    crazybubble
        10
    crazybubble  
       2013-03-01 16:58:00 +08:00
    @laskuma java里你可以用HttpURLConnection建立链接,然后getURL()
    laskuma
        11
    laskuma  
    OP
       2013-03-01 20:46:57 +08:00 via iPad
    @crazybubble 机制不同 获取的还是tinyurl
    binux
        12
    binux  
       2013-03-01 21:17:29 +08:00
    真没必要用什么bloom filter,就算你爬一千万个页面,那已经很厉害了,哈希一下全放数据库里,MYSQL什么就行,内存数据库都不需要,每次查一下,没任何问题。
    laskuma
        13
    laskuma  
    OP
       2013-03-01 21:32:01 +08:00 via iPad
    @binux 正好不会写 也就练练手了
    crazybubble
        14
    crazybubble  
       2013-03-01 21:33:19 +08:00   ❤️ 1
    @laskuma ...这就奇怪了,我试了下tinyurl,能得到原地址
    clowwindy
        15
    clowwindy  
       2013-03-01 21:34:37 +08:00   ❤️ 1
    hash 一下存 redis
    laskuma
        16
    laskuma  
    OP
       2013-03-02 02:28:35 +08:00
    @crazybubble http://tinyurl.com/at3p3en 能帮忙测试下吗?我这个网址不行
    laskuma
        17
    laskuma  
    OP
       2013-03-02 02:36:04 +08:00
    @crazybubble 解决了。。我一connect()就立刻call 的get url。所以给出的还是原来的url 谢谢了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2225 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:58 · PVG 23:58 · LAX 07:58 · JFK 10:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.