在搜索引擎中,通常已访问过的URL库都是亿级别的,如何在蜘蛛访问前知道某一个URL以前是否有访问过呢。我以前的做法是使用数据库,建立一个表,然后为URL字段设置一个唯一索引,这样插入失败就说明这个网址已经访问过了,但是随着网址数量越来越多,就出问题了,数据库太大了。而且也没办法判断一个网址是否已经更新了是否需要再次去访问一次,比如没办法判断 网页的最后更新时间,网页的长度比对等等。我查看了一些资料也问了一些朋友,大家都说需要使用MD5进行哈希处理,但是我始终没有想明白如何才能达到O(1)的时间复杂度,希望一些有经验的朋友能指导一下,最好有完整的思路,也可以推荐我一些详细描写这方面知识的书或是网页。最近为这个问题实在是郁闷极了。

解决方案 »

  1.   

    php的关联数组就是O(1)的,规模不大时,直接用关联数组,
    爬完后存到数据库,开始爬时从数据库初始化数组一个url在你访问它之前,你是无法知道它是否有更新的,可以对整个页面生成md5,若md5变了,
    就认为更新过了,md5没变,就认为没有更新过太大规模的数据,一台机器处理是不行的,你需要一个集群
      

  2.   


    对实时性要求有多高? 一个指定的页面,多久时间间隔判断一次是否更新?10亿已经是G级数据,每个url产生1KB的流量算,也要2.5TB的网络流量了。
    百兆独享带宽,假设80%利用率,24小时能传输不到1TB的数据。单PC上做爬虫,一般是针对特定站点,爬一些感兴趣的东西,URL是M级的
    到了G级,用php可能力不从心,我知道的几个类似应用都是C/C++,机器也不止一台。建议先用最简单的方式实现url判重这一块,例如把url存放到本机数据库,数据库再弄个缓存,
    然后实际运行看看,瓶颈是在判断url上,还是在网络带宽