redis - 爬虫如何保存已经访问过的url
大家讲道理
大家讲道理 2017-04-21 10:57:04
0
6
804

话说同志们在爬取数据的时候如何保存已经访问过的url和队列?对于爬取过的url,我使用redis的set来保存,访问队列是用list来保存,数据量是直线上升,内存不大,也只有4g,扛不住。不知道以前的方法是什么?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复 (6)
左手右手慢动作

队列和判断是否访问我都是用的MySQL,考虑到Redis的持久化特性不是很好,而且当时也没想过用Redis或者其他的,暂时现在用MySQL也没什么问题。
具体的做法就是对url的md5值做唯一索引,每次查询都很快,表结构也简单。
队列的话使用的是查表的形式,SQL如下(具体status是表示一些自己定义的状态):
select * from t_down_task where status = 0 order by id limit 1;
定期删除已经执行完的任务

    刘奇

    http://en.wikipedia.org/wiki/Bloom_fi...

    4G内存可以开很大的BloomFilter了,每个URL只需要几个比特,URL长度无关。BloomFilter有一定错误率(比如千分之一、百分之一,取决于配置),会导致漏爬一些网页,但不会重复爬。

    如果4G内存开BloomFilter还不够的话,楼主更需要考虑的问题是怎么存爬出来的网页。

      左手右手慢动作

      md5的hash存储在数据量不是很大的时候,存在KV存储中还是比较靠谱的,索引量很大的话,估计不太够用,就得使用带空间压缩的一些特别算法,比如上面有人提到的bloom filter

      也有人把这个算法存储用Memcache协议实现了,http://code.google.com/p/mc-bloom-fil...

        巴扎黑

        一些持久化的k/v数据库可以考虑采用,我建议可以用leveldb。

          左手右手慢动作

          这种还是不要用redis来做了,直接用文件系统

          已经采集过的url通过MD5成16进制字符串,然后每4个字符作为一层目录,最后4个字符作为文件名,文件内容为空即可

          判断url有没有采集过,直接把当前url MD5以后,按照上述规则生成文件路径,直接判断文件路径是否存在即可。

            巴扎黑

            顶bloomfilter。可以这样使用:使用leveldb来存储url,然后查询的时候先用bloomfilter挡掉大部分不在库里面的的url,这样应该就差不多了。
            lz要爬多少url?如果url非常多,比如上亿,有hadoop的话也可以用hadoop做新url和老url的去重,MapReduce很快的

              最新下载
              更多>
              网站特效
              网站源码
              网站素材
              前端模板
              关于我们 免责声明 Sitemap
              PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!