爬虫平台Crawlab核心原理--自动提取数组算法
优采云 发布时间: 2020-08-25 17:12爬虫平台Crawlab核心原理--自动提取数组算法
注意: 可配置爬虫如今仅在Python版本(v0.2.1-v0.2.4)可用,在最新版本Golang版本(v0.3.0)还暂时不可用,后续会加上,请关注近日更新
背景
实际的小型爬虫开发项目中,爬虫工程师会被要求抓取监控几十上百个网站。一般来说这种网站的结构大同小异,不同的主要是被抓取项的提取规则。传统方法是使爬虫工程师写一个通用框架,然后将各网站的提取规则弄成可配置的,然后将配置工作交给更中级的工程师或外包出去。这样做将爬虫开发流水线化,提高了部份生产效率。但是,配置的工作还是一个苦力活儿,还是十分消耗人力。因此,自动提取数组应运而生。
自动提取数组是Crawlab在中在基础上开发的新功能。它使用户不用做任何冗长的提取规则配置,就可以手动提取出可能的要抓取的列表项,做到真正的“一键抓取”,顺利的话,开发一个网站的爬虫可以半分钟内完成。市面上有借助机器学习的方式来实现手动抓取要提取的抓取规则,有一些可以做到精准提取,但遗憾的是平台要缴纳高额的费用,个人开发者或大型公司通常承当不起。
Crawlab的手动提取数组是按照人为抓取的模式来模拟的,因此不用经过任何训练就可以使用。而且,Crawlab的手动提取数组功能不会向用户缴纳费用,因为Crawlab本身就是免费的。
算法介绍
算法的核心来自于人的行为本身,通过查找网页中看起来象列表的元素来定位列表及抓取项。一般我们查找列表项是如何的一个过程呢?有人说:这还不容易吗,一看就晓得哪个是各列表呀!兄弟,拜托… 咱们是在程序的角度谈这个的,它只理解HTML、CSS、JS这种代码,并不象你那样智能。
我们辨识一个列表,首先要看它是不是有很多类似的子项;其次,这些列表一般来说看起来比较“复杂”,含有好多看得见的元素;最后,我们还要关注分页,分页按键通常称作“下一页”、“下页”、“Next”、“Next Page”等等。
用程序可以理解的语言,我们把以上规则总结如下:
列表项
列表子项
分页
这样,我们就设计好了手动提取列表项、列表子项、分页的规则。剩下的就是写代码了。我晓得这样的设计过分简单,也过分理想,没有考虑到一些特殊情况。后面我们将通过在一些著名网站上测试瞧瞧我们的算法表现怎么。
算法实现
算法实现很简单。为了更好的操作HTML标签,我们选择了库作为HTML的操作库。是python的一个解析库,支持HTML和XML的解析,支持XPath、CSS解析形式,而且解析效率十分高。
自上而下的遍历句型是。是,而会从根节点自上而下遍历各个元素,直到遍历完所有元素。它是一个。
构造解析树
在获取到页面的HTML以后,我们须要调用中的方式构造解析树。代码很简单如下,其中为的
这段带代码在方式里。源码请见。
辅助函数
在开始建立算法之前,我们须要实现一些辅助函数。所有函数是封装在类中的,所以写法与类方式一样。
获取列表项
下是核心中的核心!同学们请集中注意力。
们来编撰获取列表项的代码。以下是获得列表标签候选列表的代码。看起来稍微有些复杂,但似乎逻辑很简单:对于每一个节点,我们获得所有子节点(一级),过滤出低于阀值(默认10)的节点,然后过滤出节点的子标签类别惟一的节点。这样候选列表就得到了。
接下来我们将从候选列表中筛选出收录最多文本子节点的节点。听起来有些生硬,打个比方:一个电商网站的列表子项,也就是产品项,一定是有许多诸如价钱、产品名、卖家等信息的,因此会收录好多文本节点。我们就是通过这些方法过滤掉文本信息不多的列表(例如菜单列表、类别列表等等),得到最终的列表。在代码里我们存为。
,我们将生成列表项的CSS选择器。以下代码实现的逻辑主要就是按照前面得到的目标标签依照其或属性来生成CSS选择器。
找到目标列表项以后,我们须要做的就是将它下边的文本标签和超链接标签提取下来。代码如下,就不细讲了。感兴趣的读者可以看来理解。
的代码很简单,实现也很容易,就不多说了,大家感兴趣的可以看
我们就实现了提取列表项以及列表子项的算法。
用技巧
要用手动提取数组,首先得安装Crawlab。如何安装请查看。
rawlab安装完毕运行上去后,得创建一个可配置爬虫,详细步骤请参考。
完毕后,我们来到创建好的可配置爬虫的爬虫详情的配置标签,输入开始URL,点击提取数组按键,Crawlab将从开始URL中提取列表数组。
来,点击预览瞧瞧这种数组是否为有效数组,可以适当增删改。可以的话点击运行,爬虫就开始爬数据了。
,你须要做的就是这几步,其余的交给Crawlab来做就可以了。
结果
本文在对排名前10的电商网站上进行了测试,仅有3个网站不能辨识(分别是因为“动态内容”、“列表没有id/class”、“lxml定位元素问题”),成功率为70%。读者们可以尝试用Crawlab手动提取数组功能对大家自己感兴趣的网站进行测试,看看是否符合预期。结果的详尽列表如下。
awlab的算法其实还须要改进,例如考虑动态内容和列表没有id/class等定位点的时侯。也欢迎诸位前来试用,甚至贡献该项目。
ithub:
您认为Crawlab对您的日常开发或公司有帮助,请加作者陌陌拉入开发交流群,大家一起交流关于Crawlab的使用和开发。
本篇文章由一文多发平台ArtiPub手动发布.