3.2.7 数据采集

位置:系统管理->系统管理->数据采集。
数据采集主要用于自动按一定的采集规则从其它网站采集需要的数据,可以减少大量的重复性的工作。

1.采集术语定义

HTML源码:每个网页都是由HTML标记组成,在浏览器中可以查看HTML网页源码。在采集数据时,经常查看这些源码,分析其中的地址规则
列表页:展示文章列表的页面,通过有多个文章标题链接、并且通常有分页。典型的列表页:http://developer.51cto.com/col/1553/list_1553_1.htm  
详细页:文章详细内容所在的最终页面,就叫详细页,也叫内容页。这部分是我们采集的目标。典型的详细页:http://developer.51cto.com/art/201506/479439.htm 
数据采集:数据采集的过程,先是从列表页中根据详细页URL地址规则一个一个地提取详细页,然后再采集这些详细页的某部分数据(如:文章标题、内容、发布日期等),最终保存至频道。

2.数据采集案例

下面以 采集51CTO业界资讯的前3页 为例,详细说明采集步骤:
第1步:设置列表页和详细页的匹配规则
点击“添加采集规则”按钮,打开添加采集规则主界面,在基本信息栏中可以设置匹配规则,如下图所示:
图 3-2-7-1 基本信息
下面对几个主要参数进行详细说明:
a. 采集的数据存入频道
指本次采集的数据将保存到哪个频道,采集的数据将直接存入频道
b. 采集列表页URL地址规则
我们采集的列表页是:http://developer.51cto.com/col/1553/list_1553_1.htm,通过点击页面,我们很容易分析出最后一个1表示页面。因此把这个1改为通配符{*},并且在下面设置通配符的起始值1、结束值3,这样就将列表页的规则设置好了,在下面有列表页地址预览,请检查一下是否正确
c. 附加列表页设置
前面的采集列表页URL地址规则主要用于批量设置一些有规律的列表页地址,如果一些地址是零散的、无规律的请在本项设置。
d. 列表页中详细页链接区域规则
一个列表页通常有很多链接,通过设置此项可以将目标详细页所在的范围进一步缩小,有利于更加精确匹配。如果你的详细页URL地址规则能够精确匹配,可以不设置此项。通过查看列表页HTML源码可知,详细页链接主要位于
详细页链接区域
标签对里面,因此设置为:
{*}
,{*}:表示表示匹配任何字符
e. 采集详细页URL地址规则
指目标详细页的URL地址匹配规则,通过查看HTML源码看一下一个详细页的地址:http://developer.51cto.com/art/201506/479439.htm,因此可以设置为:/art/201{*}.htm,当然也可以设置为:/art/{*}.htm只要能匹配详细页地址即可。
注意:这里通配符{*}是贪婪匹配,会尽可能多地匹配字符,如果通配符在最后面并且匹配数字,如:http://www.xx.com/news?id=1(id范围是1-100),那么必须使用通配符{n}(表示匹配数字):/news?id={n}
f. 详细页地址采集测试
点击“详细页采集测试”按钮测试设置的规则是否正确,请仔细看看每个列表页的详细页是否正确(一般只要详细页数量正确就没有问题)

第2步:设置详细页内容替换规则
这部分的设置,主要用于过滤一些不希望出现的内容,如:广告,脚本内容,网址等。如下图所示:
图 3-2-7-2 设置详细页内容替换规则

由上图可知,在内容页有广告,我们需要过滤掉,通过查看网页页面,可以知道广告时位于

 

标签对里面。
细心的人会发现,第二项过滤内容是:将this.width>498替换成了this.width=498,为什么需要这么替换呢?因为标签的属性值不能包含特殊的字符(如:>、<),否则会无法提取img图片并保存至服务器,因此将>替换为=
图 3-2-7-3 特殊字符过滤

第3步:设置字段匹配规则
这部分设置最关键,主要用于设置被采集的详细页的哪部分数据存储到哪个字段,如下图所示:
图 3-2-7-4 设置字段匹配规则
设置好自定义规则以后,点击“字段采集测试”按钮,将随机采集(也可以在采集设置中指定采集一个页面)一个详细页的字段值,从而可以分析当前字段的匹配规则是否正确。
在字段匹配规则中,最复杂的就是匹配规则,下面详细介绍:
匹配规则主要有4种:
[1] 固定值
如果匹配规则没有{*}、也不是函数匹配,则直接返回设置值,相当于设置字段的默认值
[2] 前后截取
格式:开始字符串{*}结束字符串,匹配的内容为开始字符串和结束字符串之间的内容。如:
{*}

[3] 标签对前后截取
格式:<开始标签 [属性]>{*},比前后截取匹配更实用, 匹配的内容为与开始标签对应的结束标签之间的内容。 如:
{*}

[4] 选择器表达式
格式:$("jquery语法选择器").html|val|text|attr(),主要用于采集网页中更复杂的数据,如:HTML标记、表单值、纯文本、标签属性。匹配速度最慢
以上匹配规则全部可以用选择器表达式重写:
文章标题:$("h1").txt()
简短内容:$(".brieftext").html()
详细内容:$("#content").html()
[5] 自定义函数
主要实现一些高级功能:如:随机返回值、复杂数据提取与处理等。 格式:function getfield($content){ //PHP语法处理代码 },参数$content:表示当前采集网页的内容,在函数中可以调用php的一些函数来处理
如:随机返回3位数数字:function getfield($content){ return rand(100,999); }
以下几个函数对编写自定义函数规则非常有用:

1. yd_tagpos 获取开始标签对应的结束标签之间的字符串
  参数:$content:输入内容哦功能、$start_tag:开始标签字符串、$return_type:1:返回中间字符串,2:返回结束标记位置
  返回值:没有找到返回 false,
  原型:function yd_tagpos($content, $start_tag, $return_type='1')
2. rand 产生一个整数随机数
参数:$min:最小值、$max:最大值
返回值:返回位于[$min,$max]之间的随机整数
原型:int rand ([ int $min ], int $max )

第4步:采集规则设置
图 3-2-7-5 采集设置
采集设置一般使用默认即可,以上每项设置值很容易理解,可以看后面的注释,这里就不赘述了。设置完成以后,点击”保存并继续添加“按钮,保存采集规则

第5步:采集数据
返回数据采集主界面,点击采集规则右侧的”开始采集数据“按钮进入采集数据页面,然后点击”开始采集“按钮开始采集数据,如下图所示:

图 3-2-7-6 采集数据
采集数据界面会显示当前采集的进度、采集失败数、成功数、跳过、总采集耗时等信息。
如果由于某些未知的原因,会导致极少数的页面采集失败,界面会显示所有采集失败的页面,在本次采集完以后,点击"重新采集失败页面"按钮将重新采集本次采集失败的页面。

3.数据采集常见问题

1. 为什么我无法采集某些微信网站的内容?
可能是微信网站限制了必须使用微信才能访问,可以使用电脑浏览器访问试试,如果不能访问,表示做了限制。在采集设置里,我们可以将浏览器标识User-Agent设置为微信手机浏览器可以解决此问题
2. 为什么保存采集文章中的图片到服务器?
主要原因有:图片过大(如:大于1M),网速过慢导致下载图片时间过长(如大于30s),程序超时失败;图片做了防盗链禁止放在第三方网站
3. 采集的文章超过1万,程序会超时吗?
是否超时与采集文章的数量没有关系,系统每次采集1篇文章,只要在这一次采集中没有超时就行(一般采集1篇文章不会超过1秒,远小于默认超时时间30秒)