十、学习爬虫框架WebMagic(六)---去重和增量爬取

一、问题缘由

(一)去重

  笔者最近正在做一个爬取小说网站的后台端,遇到一个问题:有些URL重复爬取了。尽管重复爬取的页面不多,但是还是对程序造成了一些困扰,所以尝试去找到一种可以百分百去重的手段。

  通过查阅相关资料,知道 Webmagic 去重靠的是Scheduler,默认使用的是QueueScheduler,同时在资料中还看到了 RedisScheduler。我们都知道,Redis 具有天然的单线程特性,不需要使用额外的同步方法,都能保证同一时间仅有一个线程可以访问 Redis,同时查阅 RedisScheduler 源码可知,采用的是 Redis 的 set 进行去重,这样更加保证了一个 Url 只会被爬取一次(PS:因为所有待爬取的 Url 先被放入 Redis 中,然后再被 Spider 取出来进行爬取操作的,而 Redis Set 中就保证了不会出现重复的Url)。

(二)增量

  因为小说网站是不断更新的,我需要知道每天新增了哪些小说,更新了哪些章节。但是由于小说很多,章节更是庞大,若是每天来一个全量爬取,没有意义,毕竟新增的小说是少数,大部分还是原有的。所以,就涉及到第二个问题,怎样保证前一天怕取过的小说,今天不再被爬取,只爬取最新更新的。所以就涉及到第二个问题:增量爬取。

二、解决办法

(一)去重

  解决办法也相对简单,在虚拟机中启动 redis-server,然后在 spider 中设置 RedisScheduler,具体代码参见如下:

spider = Spider.create(new NovelProcessor())
                .addUrl(NOVEL_WEBSITE_URL)
                .addPipeline(new NovelPipeline())
                .setDownloader(new HttpClientDownloader())
                .setScheduler(new RedisScheduler("192.168.10.130"))
                .thread(10);

备注:关于这里为什么没有设置端口:这是因为 Webmagic 默认提供了的 Redis 端口为6379,若读者不是这个端口,则需要自己单独设置。

(二)增量

  增量的解决思路也是类似,因为redis中记录了已经爬取过的Url,再爬去的时候,会自动将已经爬取过的Url去掉,只爬取新更新的Url。

你可能感兴趣的:(java爬虫)