Skip to content

3. 网页采集器

ferventdesert edited this page Oct 11, 2016 · 9 revisions

3. 网页采集器

标签: Hawk文档

1. 原理(建议阅读)

网页采集器的功能是获取网页中的数据(废话)。通常来说,目标可能是列表(如购物车列表),或是一个页面中的固定字段(如JD某商品的价格和介绍,在页面中只有一个)。因此需要设置其读取模式。传统的采集器需要编写正则表达式,但方法过分复杂。如果认识到html是一棵树,只要找到了承载数据的节点即可。XPath就是一种在树中描述路径的语法。指定XPath,就能搜索到树中的节点。

QQ截图20160501105743.jpg-20kB

手工编写XPath也很复杂,因此软件可以通过关键字,自动检索XPath,提供关键字,软件就会从树中递归搜索包含该数据的叶子节点。因此关键字最好是在页面中独一无二的。

如上图所示,只要提供“北京”和“42”这两个关键字,就能找到parent节点, 进而获取div[0]和div1这两个列表元素。通过div[0]和div1两个节点的比较,我们就能自动发现相同的子节点(name,mount)和不同的节点(北京:上海,37:42)。相同的节点会保存为属性名,不同的节点为属性值。但是,不能提供北京和37,此时,公共节点是div[0], 这不是列表。

软件在不提供关键字的情况下,也能通过html文档的特征,去计算最可能是列表父节点(如图中的parent)的节点,但当网页特别复杂时,猜测可能会出错,所以需要至少提供两个关键字( 属性)。

本算法原理是原创的,可查看源码或留言交流。

2. 两种工作模式

Hawk把网页分成两种类型:

  • 列表(List)
    • 如二手房房源信息
    • 某个购物清单
  • 普通文档(One)
    • 如京东的某个商品页面
    • 某条新闻页面

对一些复杂的页面,可能包含多个列表和文档。Hawk建议你一次只抓取其中的一类信息,同时抓取多类信息会相当复杂。

你可以在网页采集器的【工作模式】下拉菜单中选择目标模式,默认List.

基本列表

我们以爬取链家二手房为例,介绍网页采集器的使用。首先双击图标,加载采集器:

QQ截图20160501121116.jpg-17.2kB

在最上方的地址栏中,输入要采集的目标网址,本次是http://bj.lianjia.com/ershoufang/。并点击刷新网页。此时,下方展示的是获取的html文本。原始网站页面如下:

由于软件不知道到底要获取哪些内容,因此需要手工给定几个关键字, 让Hawk搜索关键字, 并获取位置。

QQ截图20160501121150.jpg-88kB

以上述页面为例,通过检索820万和51789(单价,每次采集时都会有所不同),我们就能通过DOM树的路径,找出整个房源列表的根节点。

下面是实际步骤

QQ截图20160501121344.jpg-21.6kB

由于要抓取列表,所以读取模式选择List。 填入搜索字符700, 发现能够成功获取XPath, 编写属性为“总价” ,点击添加字段,即可添加一个属性。类似地,再填入30535,设置属性名称为“单价”,即可添加另外一个属性。

如果发现有错误,可点击编辑集合, 对属性进行删除,修改和排序。

你可以类似的将所有要抓取的特征字段添加进去,或是直接点击手气不错,系统会根据目前的属性,推测其他属性:

QQ截图20160501121405.jpg-138.5kB

属性的名称是自动推断的,如果不满意,可以修改列表第一列的属性名, 在对应的列中敲键盘回车提交修改。之后系统就会自动将这些属性添加到属性列表中。

工作过程中,可点击提取测试 ,随时查看采集器目前的能够抓取的数据内容。这样,一个链家二手房的网页采集器即可完成。可属性管理器的上方,可以修改采集器的模块名称,这样就方便数据清洗 模块调用该采集器。

###注意:

  • 只有【List】模式才能使用【手气不错】
  • List模式能够生成文档列表,表示为[{}]

3. 单文档模式

该模式只能从一个网页中抽取一个文档出来。 你可以设置多个属性,这样采集器就会从网页中依次将其抽取出来。

以抓取新闻内容为例: http://www.ce.cn/xwzx/gnsz/gdxw/201609/21/t20160921_16119449.shtml 页面如下: image_1at5pff7g7m71jtq1b2o1hlq1dt9.png-76.5kB

你可以在搜索关键字中,搜索【2016年09月21日】,属性填写为时间,搜索【人民日报】,属性为【来源】。

提取正文需要注意,你可以随意填写正文中的一部分关键字,例如【量子隐形传态是一种传递量子】,这样Hawk就检索出了XPath: 前面省略/div[1]/p[1] 如果你直接使用这个XP,则抓取的内容只有这一段。为了抓取正文,我们可以将/p[1]部分去掉,只获取其父节点。这样就能抓取全文数据(是不是很赞)?

如果你想获取原始正文的html,则在属性列表的对话框里,可以勾选某个属性的【HTML标签】。

此时,点击提取测试,看看是不是获取了所需的数据?

4.注意事项

4.1 XPath搜索相关问题

网页采集器中,填写关键字,却发现无法找到XPath。可能的原因:

网页是动态网页

此时本网页不包含该关键字,建议考虑使用【嗅探方案】

关键字太长

文本中包含不可见字符时经常出现。例如340[制表符]万,但用户可能会直接输入340万。Hawk搜索是按照严格字符串匹配的,就会匹配不成功,因此输入短一些,如340。

该信息是标签(attribute)

标签指网页中非正文的信息,很多有价值的内容都属于标签: image_1at5q2o3p17ac17cekadlke6cp.png-25.6kB 当提取标签时,请勾选网页采集器中的【提取标签】。否则Hawk是不会执行搜索的。

4.2 和 Chrome等浏览器得到的XPath不同

一方面,XPath的表示方法有很多种,这和正则类似。可能看起来不一样的XPath指代的都是同一个节点。 另一方面,Chrome会执行js代码,而js可能会改变网页的结构,因此XPath也就对应地发生变化了。这会通常会导致从Chrome拷贝出来的XPath在Hawk中不能使用。 Hawk未来不会考虑支持加入执行js代码的功能,因此,如果搜索XPath,还请以Hawk得到的结果为准。多搜多看,通常就能建立感觉。

4.3 手气不错的问题

很多人使用手气不错会失败。这是因为:

不是所有的网页都支持直接点击【手气不错】

手气不错需要特定的网页结构(列表),如果整个网页没有显著的列表节点,则搜索失败,此时就会提示 手气不错失败。 此时建议,给Hawk手工添加

手气不错会自动规约父节点

使用手气不错后,嗅探器会找到列表节点的父节点,以及挂载在父节点上的多个子节点,从而形成一个树状结构

  • 父节点(/html/div2/div3/div4)
    • 子节点1(/a1)
    • 子节点2(/a2/@href)
    • 其他省略 有时候,父节点的xpath是不稳定的,举个例子,北京上海的二手房页面,上海会在列表上面增加一个广告banner,从而真正的父节点就会发生变化。为了应对这种变化,通常的做法是手工修改【父节点XPath】,继续举例子,父节点的id为house_list,且在网页中全局唯一,你就可以使用另外一种父节点表示法//*[@id='house_list'](写法可以参考其他XPath教程),而子节点表达式不变。 Hawk在【手气不错】得到【确定】后,会询问是否提取父节点XPath,此时Hawk会自动提取【父节点XPath】到属性对话框中,从而方便修改。 当然,Hawk目前的一些bug,也都是因为手气不错导致的。

Clone this wiki locally