最终还是模拟了 scrapy 的行为

缘起

一直在写脚本爬虫,就是根据固定的网站,去提取结构化的数据。这样的脚本中,会预先分析网站的模版结构,找到要爬取的页面的规律,然后使用正则或者页面提取工具进行结构化数据的抽取。

这样的爬虫写多了以后,让人产生怀疑,如何才能构造出具有自主运行能力的爬虫,爬虫寻找合适的 url 是自主行为,而不是人过多的参与其中,定义好要爬取哪些页面。这样的爬虫只需要提前定义好过滤和聚焦规则,它就能自动的进行筛选。

在爬取页面的策略中,脚本爬虫就是简单的翻页,这种策略可以看作是定向深度优先。根据页码向下行走,不管页面内提取出来的各个链接信息。

这样的脚本爬虫在定向爬取中,是好使的,是轻量级的,也是灵活的。但,同时,调度、运行逻辑和数据处理是糅杂在一起的,难以抽象和分开,所以难以复用。

逻辑与数据分离

看看 scrapy 这样的框架,只需要自己定义好种子链接和抽取规则,爬虫就可以运行起来了。scrapy 这样的框架把调度运行逻辑抽离了出来,暴露了具体定义爬虫抽取、数据分析等接口给外部,用户只需要关心自身的业务,而无需去关注如何进行调度和运行控制。

通过这样的方式,就实现了代码的复用,并且在抽象层次上也很清晰。scrapy 中的中间件的引入,可以更加灵活的控制数据的流向和使用。

我想要改造自己的爬虫,自己实现一个逻辑和数据分离的爬虫,那么我要考虑的问题主要集中在如下几个方面:

  1. 爬取策略(广度优先/深度优先/其他方式);
  2. 调度策略,如何暴露数据接口给外部;
  3. 链接抽取,新链接的增加、过滤、去重等;
  4. 页面下载方法,单线程/多线程/多进程等;
  5. 数据共享策略,如何让用户能方便的编写业务代码实现爬虫;

根据我的考虑,是要开发出来一个完整的微爬虫框架,包含了一个爬虫框架的各个方面,这个过程也是一个学习和思考的过程。通过实际的开发,我发现我的思路在完善的同时,也慢慢的变成了和 scrapy 的功能点上类似的程序了,我似乎实现了它的架构的各个方面,虽然很不完善,只是一个功能简单的雏形,但是似乎我的开发过程验证了一个观点,scrapy 真的很强大。

沮丧

通过编写程序实现了一个爬虫的各个方面,最终发现是模仿的 scrapy,说高兴吧,因为自己开发了一个通用型的爬虫,说沮丧吧,重复的造了个轮子,还是个木头不能跑远的轮子。

就当作是一次学习了。

完。