大家经常会问:看起来一个很普通的表格,要抓取每一行的每个单元格,但是发现有些单元格的内容是重复的。 这是一个常见问题,原因是每个单元格的显示样式是一样的,编写网页html的工程师使用了相同的class或者id,而GooSeeker网络爬虫会自动选用网页上的class或者id作为定位标志,一旦出现相同的class或者id,抓取内容有可能就会重复。 下面我们用一个具体例子讲解怎样避免这个问题,以及提高抓取规则适应性的小技巧。 1. 样本网页和抓取规则名
很明显,需要两级规则,第一级用于输入查询条件,第二级是把看到的查询结果抓下来。运行时要从第一级开始。编辑第二级抓取规则时,要把规则的加载过程分成两阶段执行:阶段1,把抓取规则下载到工作台上来,但是不立即分析;阶段2,让用户输入查询条件,看到抓取结果后再手工启动“后续分析”过程。这是因为第二级规则的页面是查询关键词后,网页结构发生了变化,必须定位到搜索关键词后的页面才能正确加载规则。 2. 设置定位首选项,弃用定位标志 如上图,在红圈位置点击鼠标右键,选择菜单“首选项”,在弹出窗口中选择“绝对定位”。重新映射后,红色箭头指向的那些相同的@class值就不会干扰抓取了。从5.6.0版本爬虫开始,定位菜单挪到整理箱右边。 请注意,@class值是重要的定位标志,有些是对抓取很有效的,要排除的情形是横向单元格之间有相同的@class,如果横向单元格之间没有重复的@class,而重复出现在行之间,那是最好的,抓取多行的时候不但可以选择样例复制,也可以使用定位标志映射,定位标志映射更有适应性。 其实,为了抓取这个网页,必须选择绝对定位,否则只能抓取第一行,即使做了样例复制映射也不行,请看红色箭头指向那两行的 @id 值,每行都有唯一的@id 值,如果自动生成的抓取规则使用了这个@id值,那么无论怎么调整规则,都只能抓到一行。可见,在行的方向上,相同的@class是我们期望的,唯一性的@id是我们要避开的。这一点,刚好与列方向不一样。 选择绝对定位会大大降低抓取规则的适应度,那么,怎样做弥补呢? 3. 用嵌套整理箱兼顾定位标志映射和样例复制映射 如上图,我们定义了一个多层嵌套的整理箱,“企业信息”和“样例复制”都是容器节点,他们下面才是抓取内容。“企业信息”这一级只是起到一个定位作用,把一个@id映射给它,这个@id特别好,唯一性地限定了整个表格范围。这样,即便我们设置了绝对定位,但是因为顶级容器节点含有一个定位标志,那么生成的抓取规则也是基于这个标志节点的,弥补了绝对定位导致适应性降低的缺陷。 因为对一个容器节点不能同时做样例复制映射和定位标志映射,所以,又创建了一级容器节点“样例复制”,专门用来做样例复制映射,抓取多行。 上图,蓝色箭头指向的那些定位标志都有效地避开了。 4. 爬虫群入库功能带来的惊喜 我们人为地增加了一级容器节点,这个节点是没有意义的,请使用爬虫群的入库过程,从云存储数据库中导出excel的时候,就会惊喜地发现这些多余的容器节点被过滤掉了。 5. V5.6.x版本的缺陷 由于输入的查询条件是写在第一级抓取规则中的,所以,要添加查询条件,必须要修改抓取规则,当查询条件很多,可以使用连发弹仓功能(v6.0.1版本爬虫),支持10000个关键词自动搜索采集。 |