Hawk3已经发布,本文的不少信息已经不完整或过时,全部更新信息和下载地址均可参考下面的连接:html
HAWK是一种数据采集和清洗工具,依据GPL协议开源,可以灵活,有效地采集来自网页,数据库,文件, 并经过可视化地拖拽,
快速地进行生成,过滤,转换等操做。其功能最适合的领域,是爬虫和数据清洗。python
Hawk的含义为“鹰”,可以高效,准确地捕杀猎物。git
HAWK使用C# 编写,其前端界面使用WPF开发,支持插件扩展。经过图形化操做,可以快速创建解决方案。程序员
GitHub地址:https://github.com/ferventdesert/Hawkgithub
其Python等价的实现是etlpy:正则表达式
http://www.cnblogs.com/buptzym/p/5320552.html算法
笔者专门为其开发的工程文件已公开在GitHub:数据库
https://github.com/ferventdesert/Hawk-Projects后端
使用时,点击文件,加载工程便可加载。
编译路径在:
Hawk.Core\Hawk.Core.sln
以获取大众点评的全部北京美食为例,使用本软件可在10分钟内完成配置,在1小时以内自动并行抓取所有内容,并能监视子线程工做状况。而手工编写代码,即便是使用python,一个熟练的程序员也可能须要一天以上:
视频演示,复杂度由小到大:
软件采用相似Visual Studio和Eclipse的Dock风格,全部的组件均可以悬停和切换。包括如下核心组件:
可以添加来自不一样数据源的链接器, 并对数据进行加载和管理:
在空白处,点击右键,可增长新的链接器。在链接器的数据表上,双击可查看样例,点击右键,能够将数据加载到内存中。也能够选择加载虚拟数据集,此时系统会维护一个虚拟集合, 当上层请求分页数据时, 动态地访问数据库, 从而有效提高性能。
目前系统仅仅提供了两个模块: 网页采集器和数据清洗ETL, 双击便可加载一个新的模块。
以前配置好的模块,能够保存为任务, 双击可加载一个已有任务:
当加载了数据集或模块时,在系统状态管理中,就可对其查看和编辑:
点击右键,能够对数据集进行删除,修更名称等。也能够将数据集拖拽到下方的图标上,如拖到回收站,便可删除该模块。
双击数据集或模块,可查看模块的内容。 将数据集拖拽到数据清洗( 数据视图的下方第一个图标),可直接对本数据集作数据清洗。
网页采集器的功能是获取网页中的数据(废话)。一般来讲,目标多是列表(如购物车列表),或是一个页面中的固定字段(如JD某商品的价格和介绍,在页面中只有一个)。所以须要设置其读取模式。传统的采集器须要编写正则表达式,但方法过度复杂。若是认识到html是一棵树,只要找到了承载数据的节点便可。XPath就是一种在树中描述路径的语法。指定XPath,就能搜索到树中的节点。
手工编写XPath也很复杂,所以软件能够经过关键字,自动检索XPath,提供关键字,软件就会从树中递归搜索包含该数据的叶子节点。所以关键字最好是在页面中独一无二的。
如上图所示,只要提供“北京”和“42”这两个关键字,就能找到parent节点, 进而获取div[0]和div1这两个列表元素。经过div[0]和div1两个节点的比较,咱们就能自动发现相同的子节点(name,mount)和不一样的节点(北京:上海,37:42)。相同的节点会保存为属性名,不一样的节点为属性值。可是,不能提供北京和37,此时,公共节点是div[0], 这不是列表。
软件在不提供关键字的状况下,也能经过html文档的特征,去计算最多是列表父节点(如图中的parent)的节点,但当网页特别复杂时,猜想可能会出错,因此须要至少提供两个关键字( 属性)。
本算法原理是原创的,可查看源码或留言交流。
咱们以爬取链家二手房为例,介绍网页采集器的使用。首先双击图标,加载采集器:
在最上方的地址栏中,输入要采集的目标网址,本次是http://bj.lianjia.com/ershoufang/。并点击刷新网页。此时,下方展现的是获取的html文本。原始网站页面以下:
因为软件不知道到底要获取哪些内容,所以须要手工给定几个关键字, 让Hawk搜索关键字, 并获取位置。
以上述页面为例,经过检索820万和51789(单价,每次采集时都会有所不一样),咱们就能经过DOM树的路径,找出整个房源列表的根节点。
下面是实际步骤
因为要抓取列表,因此读取模式选择List。 填入搜索字符700, 发现可以成功获取XPath, 编写属性为“总价” ,点击添加字段,便可添加一个属性。相似地,再填入30535,设置属性名称为“单价”,便可添加另一个属性。
若是发现有错误,可点击编辑集合, 对属性进行删除,修改和排序。
你能够相似的将全部要抓取的特征字段添加进去,或是直接点击手气不错,系统会根据目前的属性,推测其余属性:
属性的名称是自动推断的,若是不满意,能够修改列表第一列的属性名, 在对应的列中敲键盘回车提交修改。以后系统就会自动将这些属性添加到属性列表中。
工做过程当中,可点击提取测试 ,随时查看采集器目前的可以抓取的数据内容。这样,一个链家二手房的网页采集器便可完成。可属性管理器的上方,能够修改采集器的模块名称,这样就方便数据清洗 模块调用该采集器。
数据清洗模块,包括几十个子模块, 这些子模块包含四类:生成, 转换, 过滤和执行
数据清洗的本质是动态组装Linq,其数据链为IEnumerable<IFreeDocument>
。 IFreeDocument
是 IDictionary<string, object>
接口的扩展。 Linq的Select函数可以对流进行变换,在本例中,就是对字典不一样列的操做(增删改),不一样的模块定义了一个完整的Linq
流:
result= source.Take(mount).where(d=>module0.func(d)).select(d=>Module1.func(d)).select(d=>Module2.func(d))….
借助于C#编译器的恩赐, Linq能很方便地支持流式数据,即便是巨型集合(上亿个元素),也可以有效地处理。
因为Python没有Linq, 所以组装的是生成器(generator), 对生成器进行操做,便可定义出相似Linq的完整链条:
for tool in tools: generator = transform(tool, generator)
详细源代码,能够参考Github上的开源项目https://github.com/ferventdesert/etlpy/
在3.1节介绍了如何实现一个页面的采集,但如何采集全部二手房数据呢? 这涉及到翻页。
仍是以链家为例,翻页时,咱们会看到页面是这样变换的:
http://bj.lianjia.com/ershoufang/pg2/ http://bj.lianjia.com/ershoufang/pg3/ …
所以,须要构造一串上面的url. 聪明的你确定会想到, 应当先生成一组序列, 从1到100(假设咱们只抓取前100页)。
(若是须要多个列合并为一个列, 则在“其余项” 栏目中填写其余列的列名,用空格分割, 并在format中用{1},{2}..等表示)
(因为设计的问题,数据查看器的宽度不超过150像素,所以对长文本显示不全,能够在右侧属性对话框点击查看样例, 弹出的编辑器可支持拷贝数据和修改列宽。
生成这串URL以后,咱们便可将刚才已经完成的网页采集器与这串url进行合并。
拖拽从爬虫转换到当前的url,双击该模块:将刚才的网页采集器的名称, 填入爬虫选择 栏目中。
以后,系统就会转换出爬取的前20条数据:
能够看到, 数据中“属性3” 列包含html转义符, 拖拽html字符转义,到属性3列,便可自动转换全部转义符。
若是要修改列名,在最上方的列名上直接修改, 点击回车便可修更名字。
where(面积)列中包含数字,想把数字提取出来,能够将提取数字模块拖拽到该列上,全部数字便可提取出来。
相似地,能够拖拽字符分割或正则分割 到某一列,从而分割文本和替换文本。此处再也不赘述。
有一些列为空,能够拖拽空对象过滤器 到该列,那么该列为空的话会自动过滤这一行数据。
须要保存数据时,能够选择写入文件,或者是临时存储(本软件的数据管理器),或是数据库。所以能够将“执行” 模块, 拖入清洗链的后端:
拖写入数据表到任意一列, 并填入新建表名(如链家二手房)
下图是此次操做的全部子模块列表:
以后,便可对整个过程进行操做:
选择串行模式或并行模式, 并行模式使用线程池, 可设定最多同时执行的线程数(最好不要超过100)。推荐使用并行模式,
点击执行按钮,便可在任务管理视图中采集数据。
以后,在数据管理的数据表链家二手房上点击右键, 选择另存为, 导出到Excel,Json等,便可将原始数据导出到外部文件中。
相似的, 你能够在清洗流程中拖入执行器,则保存的是中间过程,也能够在结尾拖入多个执行器,这样就能同时写入数据库或文件, 从而得到了极大的灵活性。
在右下角的算法视图中的任意模块上点击右键,保存任务,便可在任务视图中保存新任务(任务名称与当前模块名字一致),下次可直接加载便可。若是存在同名任务, 则会对原有任务进行覆盖。
在算法视图的空白处,点击保存全部模块,会批量保存全部的任务。
你能够将一批任务,保存为一个工程文件(xml),并在以后将其加载和分发。
上文以抓取房地产网站链家为例,介绍了软件的总体使用流程。固然,Hawk功能远远不限于这些。以后咱们将经过一系列文章来介绍其使用方法。
值得提醒的是,因为软件功能在不断地升级,可能会出现视频和图片与软件中不一致的状况,所以全部的介绍和功能以软件的实际功能为准。