《搜索引擎零距离》第二章 IRS(3)

roki 2009-06-17
3.2.13  次级页面入口语句
互联网上的页面是有层次的,一般是主页->列表页->详细信息页等这样的层次规律,垂直爬虫系统为了能够完整准确地采集到结构化信息,需要具备按照预定义的顺序准确地从一级页面进入下一级页面的能力,在IRS脚本语言中,使用“次级页面入口语句”来实现这样的需求。
以3.2.8“正则模式匹配语句”这一节中的例子为例。这个例子中使用
-----------------------------------------
匹配:'bookinfo' '<a href="/book/[$]">[$bookName]</a><br/>'  '%bookEntrance'
-----------------------------------------


这个“正则模式匹配语句”从页面内容

-------------------------------------------------------------------
<a href="/book/url1">book1</a><br/>
<a href="/book/url2">book2</a><br/>
<a href="/book/url3">book3</a><br/>
-------------------------------------------------------------------

中提取了3个URL,并把这3个URL存入%bookEntrance变量。
假设我们还需要进入详细页来获取更详细的book信息,则可以编写“次级页面语句”如下:
------------------------------------------------
次级 页内 '%bookEntrance' '详细页'
-------------------------------------------------


其中“次级 页内”是代表“次级页面语句”的关键字,没有其他含义, %bookEntrance是引用的URL数组变量,代表需要进入哪些页面,在这个例子中,爬虫系统将进入book/url1, book/url2, book/url3这3个地址进一步抓取信息,‘详细页’代表的是,爬虫使用哪个页面配置进行下一步的操作。
每个页面配置块都有一个名字(在“页面名语句”中声明),这个名字可以被“次级页面语句”所引用,表述了页面之间的层级关系。
假设详细页的内容如下:

----------------------------------------
书名:《诛仙》 <br>
作者:萧鼎  <br>
分类:奇幻.玄幻 <br>
=简介=
兽神陨灭、鬼厉火并鬼王、九尾天狐月夜现真身…<br>
-----------------------------------------

我们可以使用以下的“模式匹配语句”来提取上文中的信息:

--------------------------
匹配:'detail' '书名: 《[$bookName] 》<br>
作者:[$auther]<br>
分类:[$category] <br>
=简介= 
[$brief]<br>' 'NULL'
-------------------------


使用这个“模式匹配语句”可以从详细信息页中提取到如表3.3所示的信息。

表3.3  从详细信息页中提取的信息
bookName author category brief
诛仙 萧鼎 奇幻.玄幻 兽神陨灭、鬼厉火并鬼王、九尾天狐月夜现真身…


由于网络的不稳定性,爬虫在访问一个页面时可能遇到无法正常访问的情况,这时需要多次重试。“次级页面入口语句”中提供了对重试次数的配置支持,如下所示:

------------------------------------------------
次级 页内 '%bookEntrance,#重连{5 1000}' '详细页'
-------------------------------------------------


上述语句中的“#重连{5 1000}”的含义是,在连接失败的情况下,尝试5次重新连接,每次重连之间间隔1000毫秒。
为了避免重复处理已经处理过的页面,需要跳过已经处理过的页面,这样就不会重复保存相同的数据。“次级页面入口语句中”提供对“页面去重”这一特性的支持。另外,如果一个页面已经更新过了, 我们可以重新处理这个页面,以便得到最新的结构化信息,“更新检测”这一特性也在本语句中被支持。
示例1:

------------------------------------------------
次级 页内 '%bookEntrance, #处理条件=未遇到过'  '详细页'
-------------------------------------------------


上述语句中“ #处理条件=未遇到过”这段内容的含义是:判断待进入的页面的URL,如果这个URL是没有访问过的URL,那么就进入这个页面,反之则跳过这个URL。
示例2:

------------------------------------------------
次级页内 '%bookEntrance, #处理条件=更新过'  '详细页'
-------------------------------------------------


上述语句中“ #处理条件=未遇到过”这段内容的含义是:访问每个页面,并检测页面的内容,如果这个页面更新过了,那么处理这个页面。反之,如果该页面从上次访问到这次访问之间没有更新过内容,则不处理。

3.2.14  保存语句
接着上节中的例子,爬虫已经提取到了完整的目标信息,接下来就可以保存进数据库了,IRS语言提供了“保存语句”来实现这个功能。
示例:

-------------------------------------------
保存:'save' 'NULL;
	列表页:P0,
	详细页:P1;
	select   P0->url,P1.bookName,P1.author,P1. category; P1.brief;
	bookDao->insert("siteName"=>"17wap")'
--------------------------------------------


上述“保存语句”将能够把“列表页”上提取到的url字段以及“详细页”上提取到的bookName,author,category,brief字段,另外加上一个常量字段siteName一起存入数据库。事实上,上述“保存语句”将在IRS语言虚拟机内部转化为一条关系型数据库的SQL语句:

Begin SQL------------------------------------------------

INSERT INTO TABLE book('url','bookName','author','category','brief','siteName') 
VALUES("book/url1","诛仙","萧鼎"," 奇幻.玄幻"," 兽神陨灭、鬼厉火并鬼王、九尾天狐月夜现真身…"," 17wap")


End  SQL-------------------------------------------------

上述Begin SQL---和End SQL---之间的SQL语言就是IRS内部转换后的结果,通过这条SQL语言,就能够把结构化信息存入关系型数据库(比如Oracle)里去了。
关于保存语句中各个部分的具体含义与用法,由于比较复杂,将在下面的章节里详细描述。

3.2.15  Ruby控制语句
为了能够更灵活的控制网页爬虫的行为,IRS语言内嵌了JRuby引擎,用于解析内嵌在IRS脚本中的Ruby语句,于是就可以通过Ruby语句来比较灵活地控制爬虫的多种行为。
IRS代码示例:


------------------------------------------------
Ruby:	'
  			$vm.match ("detail");
		    $vm.save("save");	
	     '
---------------------------------------------------


上述语句的意义是,先执行名为detail的模式匹配语句,然后再执行名为save的保存语句,这样就能先把目标结构化信息匹配提取出来,然后存入数据库了。下面分别介绍IRS语言中内嵌的Ruby引擎所支持的一些功能。
1) 普通匹配函数
格式:$vm.match(“regMatchName”)
作用:执行名为regMatchName的正则模式匹配语句,从页面中提取出目标结构化信息。
2) 节点匹配函数
格式:$vm.matchNode(“nodeMatchName”)
作用:执行名为nodeMatchName的节点模式匹配语句,从页面中提取出目标结构化信息。
3) 进入次级页面函数
格式:$vm.enter(“%entranceName”)
作用:进入地址数组变量%entranceName所引用的URL地址列表,从而进入次级页面进行后续处理。
4) 保存函数
格式:$vm.save(“saveName”)
作用:调用名为saveName的保存语句,把数据存入数据库。
5) 调试语句
格式 if(!$vm.match(“regmatch”)) then
$vm.requestMatch();
end
作用:如果名为regmatch匹配失败(没有在页面中找到符合模板格式的信息),那么进入调试窗口,如图3.1所示,上半部分是页面的文本内容,左下部分是IEE表达式,右下部分是匹配结果,单击Check按钮,就可以在右下部分的窗口里看到匹配结果。
调试功能便于用IRS语言编写出正确的模式匹配语句,并且能即时发现现有模式匹配语句无法从页面中找到符合模式的文本的错误。

Global site tag (gtag.js) - Google Analytics