老狗啃爬虫-URL去重之Scheduler
摘要:
读过源代码,再回顾我们之前所学所述,WebMagic的工作机制,以及之后我们如何设计具体的爬虫程序,思路会更加明了清晰。我们知道了Scheduler是WebMagic中进行URL管理的组件,其作用是对待抓取的URL队列进行管理和对已抓取的URL进行去重。有时候不同的URL指向的是相同的页面,这时候去重就不是简单的URL字符串对比了
前面我们爬取数据做入库操作的时候,留心的话可以发现,人物信息页面前翻页后翻页,其实获取到并放入待抓取队列的链接,是有重复的,但运行时,WebMagic并没有做重复抓取的动作,这是为什么呢?
源码阅读
经过一番开发学习,我们是知道Spider在WebMagic框架在整个数据爬取处理过程中,起着穿针引线的关键作用,那么我们如想更加全面的了解WebMagic框架,就有必要看一看Spider的源码,探一探WebMagic的究竟。
找到jar包webmagic-core-0.7.4.jar:

我们看到,这里有很多接口很多类:Downloader、Pipeline、PageProcessor、Scheduler等等,我们找到Spider,拨开源码,细细看来:

哦,原来,Spider已经帮我们默认初始了QueueScheduler,那接着我们再细看这个QueueScheduler类,可以发现,原来QueueScheduler已经帮我们处理了URL重复的问题:

后面我们再深入度去看看,在DuplicateRemovedScheduler类中,又是如何使用DuplicateRemover处理链接重复问题的。
此外,我们在多看一眼源码,WebMagic框架的Spider类,其实在我们程序启动运行的时候,已经做足了工作:

其中initComponent()方法,实例了默认的downloader、pipelines等;此外还需特别留意下threadPool(CountableThreadPool)这个线程池的巧妙应用等等。
读过这些源代码,再回顾我们之前所学所述,WebMagic的工作机制,以及之后我们该如何设计具体的爬虫程序,估计思路会更加明了清晰。
结语
经过上面的一番源码探究,我们可以知道Scheduler是WebMagic中进行URL管理的组件,其作用是对待抓取的URL队列进行管理和对已抓取的URL进行去重。
当然,简单的URL链接去重,WebMagic已经帮我们实现了。但事实上,有时候我们抓取的目标网站可能并不是那么规范,即不同的URL也有可能指向的是相同内容的页面,这时候去重就不是简单的URL字符串对比了,可能还需要一些其他额外的规则考量,这时候,我们就需要考虑按照具体需求,设计实现满足我们需要的Scheduler。
接下来我们就延续WebMagic框架的思想结构,尝试用代码,按照一定的规则,实现我们想要的Scheduler。