⚠注意: 可配置爬虫现在仅在Python版本(v0.2.1-v0.2.4)可用,在最新版本Golang版本(v0.3.0)还暂时不可用,后续会加上,请关注近期更新
背景
实际的大型爬虫开发项目中,爬虫工程师会被要求抓取监控几十上百个网站。一般来说这些网站的结构大同小异,不同的主要是被抓取项的提取规则。传统方式是让爬虫工程师写一个通用框架,然后将各网站的提取规则做成可配置的,然后将配置工作交给更初级的工程师或外包出去。这样做将爬虫开发流水线化,提高了部分生产效率。但是,配置的工作还是一个苦力活儿,还是非常消耗人力。因此,自动提取字段应运而生。
自动提取字段是Crawlab在版本v0.2.2中在可配置爬虫基础上开发的新功能。它让用户不用做任何繁琐的提取规则配置,就可以自动提取出可能的要抓取的列表项,做到真正的“一键抓取”,顺利的话,开发一个网站的爬虫可以半分钟内完成。市面上有利用机器学习的方法来实现自动抓取要提取的抓取规则,有一些可以做到精准提取,但遗憾的是平台要收取高额的费用,个人开发者或小型公司一般承担不起。
Crawlab的自动提取字段是根据人为抓取的模式来模拟的,因此不用经过任何训练就可以使用。而且,Crawlab的自动提取字段功能不会向用户收取费用,因为Crawlab本身就是免费的。
算法介绍
算法的核心来自于人的行为本身,通过查找网页中看起来像列表的元素来定位列表及抓取项。一般我们查找列表项是怎样的一个过程呢?有人说:这还不容易吗,一看就知道那个是各列表呀!兄弟,拜托… 咱们是在程序的角度谈这个的,它只理解HTML、CSS、JS这些代码,并不像你那样智能。
我们识别一个列表,首先要看它是不是有很多类似的子项;其次,这些列表通常来说看起来比较“复杂”,含有很多看得见的元素;最后,我们还要关注分页,分页按钮一般叫做“下一页”、“下页”、“Next”、“Next Page”等等。
用程序可以理解的语言,我们把以上规则总结如下:
列表项
- 从根节点自上而下遍历标签;
- 对于每一个标签,如果包含多个同样的子标签,判断为列表标签候选;
- 取子标签(递归)个数最多的列表标签候选为列表标签;
列表子项
- 对以上规则提取的列表标签,对每个子标签(递归)进行遍历
- 将有href的a标签为加入目标字段;
- 将有text的标签为加入目标字段。
分页
- 对于每一个标签,如果标签文本为特定文本(“下一页”、“下页”、“next page”、“next”),选取该标签为目标标签。
这样,我们就设计好了自动提取列表项、列表子项、分页的规则。剩下的就是写代码了。我知道这样的设计过于简单,也过于理想,没有考虑到一些特殊情况。后面我们将通过在一些知名网站上测试看看我们的算法表现如何。
算法实现
算法实现很简单。为了更好的操作HTML标签,我们选择了lxml
库作为HTML的操作库。lxml