发明内容
针对现有技术中存在的上述不足,本发明提供一种网页数据定向抓取方法,解决网页数据的定向获取问题。
为实现上述目的,本发明采用了如下技术手段:
作为一种方案,网页数据定向抓取方法,包括以下步骤:
1)根据待抓取的网页数据在网页文件中具有的数据结构特征以及网页文件的源代码语法规则,编译由正则表达式构建的数据匹配模型;
2)根据URL地址获取包含待抓取网页数据的网页文件,解析所述网页文件的源代码;
3)用所述数据匹配模型对所述网页文件的源代码进行数据匹配,依次获取相匹配的部分源代码;
4)从所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出待抓取的网页数据;
5)对提取出的网页数据进行存储处理。
在第一种方案中,所述由正则表达式构建的数据匹配模型是由结构匹配字符和捕获组构成;所述结构匹配字符用于匹配待抓取的网页数据的数据结构特征;所述捕获组用于匹配待抓取的网页数据。
在第一种方案中,所述步骤3)中“从所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出待抓取的网页数据”,是通过正则表达式语法规则中的捕获组对所述相匹配的部分源代码中待抓取的网页数据进行捕获并存储于缓存区中,从而屏蔽结构匹配字符匹配的数据结构特征部分;再从缓存区中提取待抓取的网页数据。
在第一种方案中,所述待抓取的网页数据有多组,每组待抓取的网页数据匹配于数据匹配模型中的一个捕获组,且不同的捕获组通过不同的编号或命名加以区分识别。
在第一种方案中,所述步骤4)中“对提取出的网页数据进行存储处理”,是计算提取出的网页数据的MD5值,并查找数据库中是否存在相同的MD5值;若是,则放弃存储操作;否则,将提取出的网页数据连同其MD5值一起存入数据库,并建立该网页数据与其MD5值的对应关系。
作为另一种方案,网页数据定向抓取方法,包括以下步骤:
A)将待抓取的网页数据在网页文件中具有的数据结构特征拆分为N级,划分N级定位域;每一级定位域包含至少一个待抓取的网页数据的数据结构特征,以及除数据结构特征部分的定位提取部分;其中,第N级定位域的定位提取部分即为待抓取的网页数据,N≥2;
B)根据网页文件的源代码语法规则,分别编译由正则表达式构建的每一级定位域的数据匹配模型;
C)通过多级定位的方式逐级提取待抓取的网页数据;该步骤具体为:
c1)第1级定位步骤包括:
11)根据URL地址获取包含待抓取网页数据的网页文件,解析所述网页文件的源代码;
12)用第1级定位域的数据匹配模型对所述网页文件的源代码进行数据匹配,依次获取相匹配的部分源代码;
13)从步骤12)所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出第1级定位域的定位提取部分;
c2)第n级定位步骤,2≤n≤N,包括:
n1)获取第n-1级定位域的定位提取部分;
n2)用第n级定位域的数据匹配模型对第n-1级定位域的定位提取部分进行数据匹配,依次获取相匹配的部分源代码;
n3)从步骤n2)所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出第n级定位域的定位提取部分;
其中,第N级定位步骤提取出的定位提取部分,即为待抓取的网页数据;
D)对第N级定位步骤提取出的网页数据进行存储处理。
在第二种方案中,所述由正则表达式构建的每一级定位域的数据匹配模型,均是由结构匹配字符和捕获组构成;所述结构匹配字符用于匹配定位域中的数据结构特征部分;所述捕获组用于定位域中的定位提取部分;不同级定位域的数据匹配模型中的捕获组,通过不同的编号或命名加以区分识别。
在第二种方案中,所述步骤13)中“从步骤12)所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出第1级定位域的定位提取部分”,是通过正则表达式语法规则中的捕获组对步骤12)所述相匹配的部分源代码中第1级定位域的定位提取部分进行捕获并存储于缓存区中,从而屏蔽结构匹配字符匹配的数据结构特征部分;再从缓存区中提取第1级定位域的定位提取部分;
所述步骤n3)中“从步骤n2)所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出第n级定位域的定位提取部分”,是通过正则表达式语法规则中的捕获组对步骤n2)所述相匹配的部分源代码中第n级定位域的定位提取部分进行捕获并存储于缓存区中,从而屏蔽结构匹配字符匹配的数据结构特征部分;再从缓存区中提取第n级定位域的定位提取部分。
在第二种方案中,所述待抓取的网页数据有多组,每组待抓取的网页数据匹配于第N级定位域的数据匹配模型中的一个捕获组,且不同的捕获组通过不同的编号或命名加以区分识别。
在第二种方案中,所述步骤D)中“对第N级定位步骤提取出的网页数据进行存储处理”,是计算第N级定位步骤提取出的网页数据的MD5值,并查找数据库中是否存在相同的MD5值;若是,则放弃存储操作;否则,将第N级定位步骤提取出的网页数据连同其MD5值一起存入数据库,并建立该网页数据与其MD5值的对应关系。
相比于现有技术,本发明具有如下有益效果:
1、本发明利用待抓取的网页数据在网页文件中呈现的数据结构特征,对网页文件进行源代码语法规则分析,再通过正则表达式构建具有数据结构特征的数据匹配模型,对网页文件源代码进行数据匹配,并从中匹配的部分源代码提取出需要抓取的网页数据,解决了网页数据的定向抓取问题。
2、运用正则表达式进行字符段匹配的技术在网络技术领域中应用成熟,本发明方法采用正则表达式作为匹配工具,对本领域技术人员而言具有很强的可操作性,有利于本发明方法的普及应用。
3、利用正则表达式语法规则中的捕获组对待抓取得网页数据或定位域中的定位提取部分进行捕获提取,充分利用正则表达式的语法规则,且操作简便;还可采用多个不同命名的捕获组分别匹配捕获多组待抓取得网页数据,应用灵活。
4、针对一些数据结构特征较为复杂、提取难度较高的网页数据,本发明还提出了一种通过多级定位逐级提取待抓取的网页数据的定向抓取方案,体现了本发明方法具有较强适应能力,应用范围广泛。
5、通过MD5摘要效验的存储处理方式,可以避免数据库中重复存储所抓取的相同的网页数据,节省数据库的存储资源。
具体实施方式
下面结合附图和实施例对本发明的技术方案作进一步的说明。
由于标题、文本、图像、链接、表格等各类型的网页数据,其呈现于网页中,必定具备一定的数据结构特征,如不同类型数据的组合结构、同类型数据的排列结构、数据内容的描述结构等等。本发明的网页数据定向抓取方法,就是利用网页数据呈现的数据结构特征,对网页文件进行源代码分析,通过正则表达式匹配得到具备待抓取网页数据的数据结构特征的部分源代码,进而提取出待抓取的网页数据,达到网页数据定向抓取的目的。下面通过实施例对本发明的实际应用和效果做进一步说明。
实施例1:
为了向用户提供蔬菜价格信息服务业务,提供相应业务的服务器需要从某专业的物价信息网站中定向抓取蔬菜价格数据。该物价信息网站中包含的网页文件均为HTML(Hyper Text Markup Language,超文本语言)格式;包含蔬菜价格信息的网页的URL(Uniform Resource Locator,统一资源定位符)地址为“http://www.feinno.com/commodity-price/016”,该网页中蔬菜价格呈现为如表1所示的表格结构:
表1
在表1中,“蔬菜价格”所在单元格为表头单元格,其它单元格为数据单元格。现在,需要为用户专项的提供“青椒”价格报价服务,因此服务器需要从该网页中定向的抓取青椒的价格数据,忽略掉网页中的其它网页数据;采用本发明方法进行定向抓取,其流程框图如图1所示,具体的方法如下:
1)根据待抓取的网页数据在网页文件中具有的数据结构特征以及网页文件的源代码语法规则,编译由正则表达式构建的数据匹配模型;
待抓取的青椒价格数据,在网页文件中呈现为表格结构,且表格为多行多列排列结构,根据表格结构在HTML源代码语法规则,至少应当包含表格标签“<table>”、表行标签“<tr>”、数据单元格标签“<td>”;但仅仅有表格结构特征还不够,注意到该表格中还存在其它的蔬菜价格数据,且与青椒价格数据呈现的表格结构特征相同,因此还需要将“青椒”作为数据内容特征;因此,根据HTML源代码语法规则已经可以确定,在由正则表达式构建的数据匹配模型中,必定包含匹配语句“<tr> <td> 青椒 </td> <td> …… </td> </tr>”。前述的匹配语句中,省略号的位置即为青椒价格数据在HTML网页文件源代码中的位置,但该数据可能会随时变动,为尚不能确定的内容;对于匹配过程中尚不能确定的内容,在本实施例中,由通过正则表达式编译定义的通配符来代替,该通配符的标记定义为“/Wildcard/”。
由此,编译得到的青椒价格数据的数据匹配模型,其正则表达式形式为:
“<tr> <td> 青椒 </td> <td> /Wildcard/ </td> </tr>”。
2)根据URL地址获取包含待抓取网页数据的网页文件,解析所述网页文件的源代码;
由包含蔬菜价格信息的网页的URL地址“http://www.feinno.com/commodity-price/016”,可以通过万维网获取到该HTML格式的网页文件,然后通过文件解析获得网页文件的源代码。HTML格式的网页文件的源代码解析技术是非常成熟的技术,可以通过专用的HTML解析工具来实现;此外,借助现有网页浏览器(例如Windows系统自带的IE浏览器)具备的“查看源文件”功能,也能够获取到网页文件的源代码。通过HTML解析,解析到该包含蔬菜价格信息的网页文件中含有如下的表格数据源代码:
“……
<table width="30%" border="1">
<tr> <th colspan="2">蔬菜价格</th> </tr>
<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>
<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>
<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>
</table>
……
……”。
3)用所述数据匹配模型对所述网页文件的源代码进行数据匹配,依次获取相匹配的部分源代码;
根据正则表达式的匹配规则,用数据匹配模型“<tr> <td> 青椒 </td> <td> /Wildcard/ </td> </tr>”匹配上述步骤2)中解析得到的网页文件源代码,获取的相匹配的部分源代码如下:
“<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>”。
4)从所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出待抓取的网页数据;
在匹配获得的部分源代码中,青椒的价格数据“1.50元/500克”才是需要抓取的网页数据;“<tr> <td> 青椒 </td> <td>”以及“</td> </tr>”只是青椒价格数据的数据结构特征部分,需要被屏蔽掉。现有技术中常用的数据屏蔽方法有很多,例如,可以将上述的部分源代码“<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>”与数据匹配模型“<tr> <td> 青椒 </td> <td> /Wildcard/ </td> </tr>”进行字符对比运算,去除掉相同的字符串,最终部分源代码中剩余的部分“1.50元/500克”即为需要抓取的青椒价格数据。
5)对提取出的网页数据进行存储处理;
直接将提取到的青椒价格数据“1.50元/500克”存入数据库中备用。从而,在向用户提供专项的青椒价格报价服务时,只需要从数据库中提取当前的青椒价格数据“1.50元/500克”发送给用户即可。
在服务业务应用中,可以采用上述的方法,周期性地从物价信息网站的相应网页中定向抓取青椒价格数据,为用户提供实时的青椒价格数据的业务。但是,在网页中被提取的相应数据没有发生改变的情况下,周期性的提取的同一网页数据可能存在数据重复的情况,例如可能很长一段时间内周期性的提取的青椒价格数据都是“1.50元/500克”;若对所提取的相同数据都不加区分的进行直接存储,必然导致存储资源的浪费。为此,作为本实施例技术方案的一种改进,在步骤5)的存储处理过程中,可采用MD5摘要效验的方式避免相同数据的重复存储。MD5(Message-Digest Algorithm 5,消息摘要算法第五版)是将一段数据当作一个文本信息整体,通过一种不可逆的字符串变换算法,对该文本信息整体进行运算产生一个唯一对应的信息摘要,即MD5摘要。相同的数据内容会生成相同的MD5值,而且MD5摘要的信息量要比其对应的数据原始信息量小很多,便于进行效验运算。在改进方案中,步骤5)的存储处理具体是,计算提取出的青椒价格数据的MD5值,并查找数据库中是否存在相同的MD5值;若是,则放弃存储操作;否则,将提取出的青椒价格数据连同其MD5值一起存入数据库,并建立该青椒价格数据与其MD5值的对应关系。运用该存储处理,当周期性的提取到的青椒价格数据未发生变化时,即放弃存储,仅当取到的青椒价格数据变化后才存入数据库,节省了数据库的存储资源;并且对应存储其MD5值,便于后期的效验的数据调取处理。
在本实施例中,步骤4)采用了字符对比运算的方式对数据结构特征部分进行数据屏蔽。作为本实施例的又一种改进方案,可以利用正则表达式语法规则中的捕获组,让步骤4)的数据屏蔽操作更加的简化。捕获组在正则表达式语法规则中用左、右圆括号“(”、“)”进行标示,其功能是将左、右圆括号之间的子表达式所匹配的内容进行捕获并存储于缓存区中。为了从数据匹配模型匹配的部分源代码中获取青椒价格数据,可以在步骤1)中将由正则表达式构建数据匹配模型编译为:
“<tr> <td> 青椒 </td> <td> (/Wildcard/) </td> </tr>”;
该数据匹配模型由结构匹配字符“<tr> <td> 青椒 </td> <td>”、“</td> </tr>”和捕获组“(/Wildcard/)”构成;结构匹配字符用于匹配待抓取的青椒价格数据的数据结构特征,捕获组用于匹配待抓取的青椒价格数据。在步骤3)中,应用该数据匹配模型对所述网页文件的源代码进行数据匹配,在相匹配的部分源代码“<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>”中,匹配于捕获组的部分“1.50元/500克”即被捕获存储于缓存区中。从而在步骤4)提取青椒价格数据时,只需从缓存区中提取匹配于捕获组的“1.50元/500克”,从而达到屏蔽数据结构特征部分的目的,不再需要再单独的进行字符对比运算等数据屏蔽处理,通过充分利用正则表达式的语法规则实现了步骤4)中运算处理流程的简化。
实施例2:
为了向用户提供蔬菜价格信息服务业务,提供相应业务的服务器需要从实施例1所述的物价信息网站的网页“http://www.feinno.com/commodity-price/016”中定向抓取蔬菜价格数据,该网页中蔬菜价格呈现方式如表1所示。现要为用户提供该表格中罗列的蔬菜名称数据以及各种蔬菜相应的价格数据,因此网页中的蔬菜名称“西红柿”、“青椒”、“胡萝卜”以及三者对应的蔬菜价格“3.50元/500克”、“2.50元/500克”、“1.50元/500克”即为待抓取的网页数据;采用本发明方法进行定向抓取,其流程框图如图1所示,具体的方法如下:
i)根据待抓取的网页数据在网页文件中具有的数据结构特征以及网页文件的源代码语法规则,编译由正则表达式构建的数据匹配模型;
待抓取的蔬菜名称数据和蔬菜价格数据,在网页文件中呈现为具有表头的表格结构,且表格为4行2列排列结构,根据表格结构在HTML源代码语法规则,至少应当包含表格标签“<table>”、表行标签“<tr>”、表头标签“<th>”、数据单元格标签“<td>”;匹配过程中尚不能确定的内容由通配符“/Wildcard/”来代替,并通过结构匹配字符匹配上述的数据结构特征部分,通过正则表达式语法规则中的捕获组对待抓取的蔬菜名称数据和蔬菜价格数据进行匹配捕获;由于存在多组待抓取的网页数据,需要多个捕获组分别匹配捕获,为加以区分,借助正则表达式语法规则中的捕获组命名规则对不同的捕获组分别命名;从而得到由正则表达式构建的数据匹配模型:
“<tr> <td> (?’name1’/Wildcard/) </td> <td> (?’price1’/Wildcard/) </td> </tr>”;
其中“name1”、“price1”分别为数据匹配模型中两个捕获组的命名。
ii)根据URL地址获取包含待抓取网页数据的网页文件,解析所述网页文件的源代码;
由包含蔬菜价格信息的网页的URL地址“http://www.feinno.com/commodity-price/016”,可以通过万维网获取到该HTML格式的网页文件,然后通过文件解析获得网页文件的源代码:
“……
<table width="30%" border="1">
<tr> <th colspan="2">蔬菜价格</th> </tr>
<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>
<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>
<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>
</table>
……
……”。
iii)用所述数据匹配模型对所述网页文件的源代码进行数据匹配,依次获取相匹配的部分源代码;
根据正则表达式的匹配规则,用上述步骤i)中的数据匹配模型匹配上述步骤ii)中解析得到的网页文件源代码,依次获取到相匹配的部分源代码有三组,分别为:
第一组:“<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>”;
第二组:“<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>”;
第三组:“<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>”。
iv)从所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出待抓取的网页数据;
根据正则表达式语法规则中捕获组的定义,捕获组所匹配捕获的内容会按照其出现的先后顺序依次被编号存储于缓存区中,编号默认为从“0”开始;因此,通过数据匹配模型中两个捕获组对数据结构特征部分的屏蔽,捕获并存储于缓存区中的内容如表2所示:
表2
编号 | 命名 | 捕获内容 |
0 | name1 | 西红柿 |
1 | price1 | 3.50元/500克 |
2 | name1 | 青椒 |
3 | price1 | 1.50元/500克 |
4 | name1 | 胡萝卜 |
5 | price1 | 2.50元/500克 |
根据不同捕获组的编号进行区分识别,分别提取缓存区中存储的待抓取的蔬菜名称数据“西红柿”、“青椒”、“胡萝卜”以及三者对应的蔬菜价格数据“3.50元/500克”、“2.50元/500克”、“1.50元/500克”。
v)对提取出的网页数据进行存储处理;
本实施例中,采用实施例1改进方案中的MD5摘要效验的存储处理方式,对提取的三组蔬菜名称数据和三组蔬菜价格数据分别进行MD5效验,避免数据库中重复存储相同的网页数据;对于MD5值在数据库中不存在的蔬菜名称数据或/和蔬菜价格数据,则连同其MD5值一起存入数据库。
在本实施例中,通过上述方法实现了网页中多组网页数据的定向抓取。在具体操作时,编译由正则表达式构建的数据匹配模型,也可采用六个不同命名的捕获组来分别匹配捕获三组蔬菜名称数据和三组蔬菜价格数据,即步骤i)中的数据匹配模型也可以为:
“<tr> <td> (?’name1’/Wildcard/) </td> <td> (?’price1’/Wildcard/) </td> </tr>
<tr> <td> (?’name2’/Wildcard/) </td> <td> (?’price2’/Wildcard/) </td> </tr>
<tr> <td> (?’name3’/Wildcard/) </td> <td> (?’price3’/Wildcard/) </td> </tr>”;
其中“name1”、“price1”、“name2”、“price2”、“name3”和“price3”分别为数据匹配模型中六个捕获组的命名。在数据匹配模型对网页文件的源代码进行数据匹配时,该六个捕获组所匹配捕获的内容及其命名则被存储于缓存区中;于是步骤iv)中六个捕分别捕获并存储于缓存区中的内容如表3所示:
表3
编号 | 命名 | 捕获内容 |
0 | name1 | 西红柿 |
1 | price1 | 3.50元/500克 |
2 | name2 | 青椒 |
3 | price2 | 1.50元/500克 |
4 | name3 | 胡萝卜 |
5 | price3 | 2.50元/500克 |
由于每个捕获组的命名各不相同,从而通过命名可以对不同捕获组匹配的内容进行区分识别和提取。
实施例3:
在物价信息网站中,URL地址为“http://www.feinno.com/commodity-price/016”的网页内容有所变化,网页中不仅提供了如表1所示的蔬菜价格信息,还提供了另一个与表1的表格结构完全相同的粮食价格信息表格,如表4所示:
表4
现依然为用户提供蔬菜价格信息表格(如表1所示)中罗列的蔬菜名称数据以及各种蔬菜相应的价格数据,需要从上述网页中定向抓取蔬菜名称数据“西红柿”、“青椒”、“胡萝卜”以及三者对应的蔬菜价格数据“3.50元/500克”、“2.50元/500克”、“1.50元/500克”。
根据表1的表格结构特征和HTML源代码语法规则,可以确定待抓取的蔬菜名称数据和蔬菜价格数据在网页文件中的源代码至少应当包含表格标签“<table>”、表行标签“<tr>”、表头标签“<th>”、数据单元格标签“<td>”。但仅仅有上述的表格行列结构特征还不够,因为网页中还存在另一个具有相同表格结构的粮食价格信息表格(如表4所示),若采用实施例2中编译的数据匹配模型进行定向抓取,很可能抓取到粮食价格信息表格中的数据;因此还需要通过表头特征来区分网页文件中的两个表格。为此,本实施例中采用了同一发明构思的另一技术方案,对上述网页中的蔬菜名称和蔬菜价格数据进行定向抓取,其流程框图如图2所示,具体方法如下:
A)将待抓取的网页数据在网页文件中具有的数据结构特征拆分为N级,划分N级定位域;每一级定位域包含至少一个待抓取的网页数据的数据结构特征,以及除数据结构特征部分的定位提取部分;其中,第N级定位域的定位提取部分即为待抓取的网页数据,N≥2;
本实施例中,针对待抓取的蔬菜名称数据和蔬菜价格数据所具有的数据结构特征,划分了2级定位域;第1级定位域以蔬菜价格信息表格的表头数据内容作为数据结构特征,以蔬菜价格信息表格的数据单元格作为定位提取部分;第2级定位域以蔬菜价格信息表格数据单元格的表格结构特征作为数据结构特征,以数据单元格中的蔬菜名称数据和蔬菜价格数据作为定位提取部分;从而通过2级定位域逐级定位至待抓取的网页数据。
B)根据网页文件的源代码语法规则,分别编译由正则表达式构建的每一级定位域的数据匹配模型;
对第1级定位域而言,由于蔬菜价格信息表格的表头单元格的跨度为2列,因此第1级定位域的数据匹配模型中,除了以HTML源代码语法规则中的表格标签“<table>”、表行标签“<tr>”、表头标签“<th>”作为数据结构特征部分以外,还应当包含表格的列跨度属性“clospan”以及用于区分蔬菜价格信息表格的表头数据内容“蔬菜价格”,只是表格的单元格宽度属性系数“width”和边框宽度属性系数“border”尚不能确定;匹配过程中尚不能确定的内容由通配符“/Wildcard/”来代替,并通过结构匹配字符匹配上述的数据结构特征部分,通过正则表达式语法规则中的捕获组对作为第1级定位域中定位提取部分的蔬菜价格信息表格的数据单元格进行匹配捕获;从而,由正则表达式构建的第1级定位域的数据匹配模型为:
“<table /Wildcard/>
<tr> <th colspan="2">蔬菜价格</th> </tr>
(/Wildcard/)
</table>”;
对第2级定位域而言,获取蔬菜价格信息表格的数据单元格后,其中的蔬菜名称数据和蔬菜价格数据的定向匹配完全可以采用实施例2中所述的匹配方式,因此由正则表达式构建的第2级定位域的数据匹配模型,可与实施例2相同,即:
“<tr> <td> (?’name1’/Wildcard/) </td> <td> (?’price1’/Wildcard/) </td> </tr>”;
其中“name1”、“price1”分别为第2级定位域的数据匹配模型中两个捕获组的命名。
C)通过多级定位的方式逐级提取待抓取的网页数据;该步骤具体为:
c1)第1级定位步骤包括:
11)根据URL地址获取包含待抓取网页数据的网页文件,解析所述网页文件的源代码;
由包含蔬菜价格信息的网页的URL地址“http://www.feinno.com/commodity-price/016”,可以通过万维网获取到该HTML格式的网页文件,然后通过文件解析获得网页文件的源代码:
“……
<table width="30%" border="1">
<tr> <th colspan="2">蔬菜价格</th> </tr>
<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>
<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>
<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>
</table>
……
……
<table width="30%" border="1">
<tr> <th colspan="2"> 粮食价格 </th> </tr>
<tr> <td> 大米 </td> <td> 3.80元/500克 </td> </tr>
<tr> <td> 玉米 </td> <td> 2.70元/500克 </td> </tr>
<tr> <td> 小麦 </td> <td> 1.12元/500克 </td> </tr>
</table>
……”;
12)用第1级定位域的数据匹配模型对所述网页文件的源代码进行数据匹配,依次获取相匹配的部分源代码;
根据正则表达式的匹配规则,用第1级定位域的数据匹配模型匹配上述步骤11)中解析得到的网页文件源代码,获取的相匹配的部分源代码如下:
“<table width="30%" border="1">
<tr> <th colspan="2">蔬菜价格</th> </tr>
<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>
<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>
<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>
</table>”;
13)从步骤12)所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出第1级定位域的定位提取部分;
通过第1级定位域的数据匹配模型的一个捕获组对数据结构特征部分的屏蔽,捕获并存储于缓存区中的定位提取部分为:
“<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>
<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>
<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>”;
可从缓存区中提取得到第1级定位域的定位提取部分。
c2)第2级定位步骤包括:
n1)获取第1级定位域的定位提取部分:
“<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>
<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>
<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>”;
n2)用第2级定位域的数据匹配模型对第1级定位域的定位提取部分进行数据匹配,依次获取相匹配的部分源代码;
该步骤与实施例2中步骤iii)的过程完全一致,依次获取到相匹配的三组部分源代码分别为:
第一组:“<tr> <td> 西红柿 </td> <td> 3.50元/500克 </td> </tr>”;
第二组:“<tr> <td> 青椒 </td> <td> 1.50元/500克 </td> </tr>”;
第三组:“<tr> <td> 胡萝卜 </td> <td> 2.50元/500克 </td> </tr>”;
n3)从步骤n2)所述相匹配的部分源代码中屏蔽数据结构特征部分,提取出第2级定位域的定位提取部分;
通过第2级定位域的数据匹配模型中两个捕获组对数据结构特征部分的屏蔽,捕获并存储于缓存区中的内容如表5所示:
表5
编号 | 命名 | 捕获内容 |
0 | name1 | 西红柿 |
1 | price1 | 3.50元/500克 |
2 | name1 | 青椒 |
3 | price1 | 1.50元/500克 |
4 | name1 | 胡萝卜 |
5 | price1 | 2.50元/500克 |
根据不同捕获组的编号进行区分识别,分别提取缓存区中存储的待抓取的蔬菜名称数据“西红柿”、“青椒”、“胡萝卜”以及三者对应的蔬菜价格数据“3.50元/500克”、“2.50元/500克”、“1.50元/500克”。
D)对第N级定位步骤提取出的网页数据进行存储处理。
本实施例中,采用实施例1改进方案中的MD5摘要效验的存储处理方式,对提取的三组蔬菜名称数据和三组蔬菜价格数据分别进行MD5效验,避免数据库中重复存储相同的网页数据;对于MD5值在数据库中不存在的蔬菜名称数据或/和蔬菜价格数据,则连同其MD5值一起存入数据库。
从实施例3可以看到,在一些数据结构特征较为复杂、提取难度较高等特殊情况的网页数据,若通过一个数据匹配模型不便于准确的定向抓取网页数据,可采用本发明的多级定位的方式逐级提取待抓取的网页数据;并且,采用多级定位、逐级提取的方式,可以针对每一级的定位步骤和数据匹配模型进行独立的编程,通过逐级调用相应程序段的方式实现多级定位提取功能,能够使得定向抓取程序的管理、维护和修改更加方便。
通过上述三个实施例能够看到,本发明方法利用待抓取的网页数据在网页文件中呈现的数据结构特征,对网页文件进行源代码语法规则分析,再通过正则表达式构建具有数据结构特征的数据匹配模型,对网页文件源代码进行数据匹配,并从中匹配的部分源代码提取出需要抓取的网页数据,解决了网页数据的定向抓取问题。本发明方法采用正则表达式作为匹配工具,而运用正则表达式进行字符段匹配的技术在网络技术领域中应用成熟,对本领域技术人员而言具有很强的可操作性,有利于本发明方法的普及应用。作为改进方案,可利用正则表达式语法规则中的捕获组对待抓取得网页数据或定位域中的定位提取部分进行捕获提取,充分利用正则表达式的语法规则,且操作简便;还可采用多个不同命名的捕获组分别匹配捕获多组待抓取得网页数据,应用灵活。针对一些数据结构特征较为复杂、提取难度较高的网页数据,本发明还提出了一种通过多级定位逐级提取待抓取的网页数据的定向抓取方案,体现了本发明方法具有较强适应能力,应用范围广泛。
本发明方法不仅可以针对HTML格式的网页文件进行网页数据定向抓取,只要是本领域技术人员公知公用的网页文件源代码语法规则,如XML、WML等源代码语法规则,其相应格式网页文件中的网页数据都可以采用本发明方法进行定向抓取。本发明方法也不仅仅可以实现上述实施例中表格类型的网页数据的定向抓取,也可以对标题、文本、图像、链接等其它类型的网页数据进行定向抓取,因为这些类型的网页数据在网页文件中都存在一些能够被匹配的数据结构特征。本发明方法不仅仅可以运用于物品价格信息服务,针对天气预报、金融数据分析等专业化的行业信息数据服务,可以通过本发明方法从天气预报网站、金融数据网站等相关行业信息网站的网页中定向的抓取相关的网页数据信息,再通过综合、分析、转发等不同的方式提供给用户,实现相应行业信息数据服务。
最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。