《搜索引擎零距离》第二章 网页信息挖掘专用程序设计语言IRS(1)

roki 2009-06-17
3.1  IRS语言的简介与设计原则
IRS语言是为了实现上一章中所描述的智能爬虫系统而设计的专用程序设计语言,它的设计目的是为了实现互联网上结构化数据的挖掘与精确采集,它是运行于Java平台的解释性语言,为了便于理解与记忆,主要使用中文作为语法关键字。IRVM(解释运行IRS脚本的虚拟机)内部对“智能网络爬虫系统”所必需的各种特性提供了比较有力的支持。IRS内嵌了两种辅助的脚本解析器,一种是JRuby脚本引擎,一种是模仿SQL设计的IRQL语言。内嵌JRuby引擎是为了灵活实现系统内部的各逻辑判断与流程跳转,内嵌IRQL是为了实现爬虫系统与数据库持久层的无缝连接。
IRS语言的设计原则是简洁的代码与实用的功能,即尽量使得IRS脚本语句,用最少的代码来实现需求,并且提供尽量多的实用功能。
3.2  IRS脚本语法结构
“IRS程序->页面配置块 | 执行块 | 爬虫配置语句 | 系统配置语句。”这句话的意思是:一个IRS程序,是由“页面配置块”、“执行块”、“爬虫配置语句”和“系统配置语句”四种语法单位组成的。
3.2.1  页面配置块
IRS语法单位中,最复杂的是“页面配置块”:

页面配置块->页面名语句 | 爬虫配置声明语句 | 入口声明语句
		| 全文匹配声明语句 | 节点匹配声明语句 | 次级入口声明语句
		| Ruby执行块语句


也就是说,一个页面配置块中,可以包含“->”后的,用“|”分隔的7种语句。下面分别描述这7种语句的具体写法。
3.2.2  页面名语句
一个典型的页面名语句是这样的:

---------------------------------------------	
页面名 'readnovel'
---------------------------------------------


页面名语句的作用是给一个页面配置块起一个名字,上面的readnovel就是这个页面配置块的名字。本语句的结构很简单。
3.2.3  爬虫配置声明语句
一个典型的爬虫配置声明语句如下:

---------------------------------------------	
爬虫配置名 'spiderconf'
---------------------------------------------


本语句的作用是给当前的页面配置块指定爬虫配置。前提是在IRS程序中声明一个名叫spiderconf的爬虫配置,然后这个页面配置块可以通过指定爬虫配置名来引用那个爬虫配置。
3.2.4  入口声明语句
一个典型的入口声明语句如下:
---------------------------------------------	
入口 'http://abc.com/list.jsp?page='  [1..10]  配置:编码=UTF-8
---------------------------------------------


本语句的作用是定义爬虫的入口地址,上述示例语句的作用是让爬虫从

http://abc.com/list.jsp?page=1
http://abc.com/list.jsp?page=2

http://abc.com/list.jsp?page=10

这10个入口开始采集数据,读到页面内容之后,用UTF-8编码来解析页面。
一个更复杂一些的例子如下:

---------------------------------------------	
入口 'http://abc.com/list.jsp?page='  [1..2] '&parm= ' [a..c]  配置:编码=UTF-8
---------------------------------------------


本语句的意思是,爬虫要从以下6个入口地址开始抓取内容:

http://abc.com/list.jsp?page=1&parm=a
http://abc.com/list.jsp?page=1&parm=b
http://abc.com/list.jsp?page=1&parm=c
http://abc.com/list.jsp?page=2&parm=a
http://abc.com/list.jsp?page=2&parm=b
http://abc.com/list.jsp?page=2&parm=c

可以看出,入口定义语句中的静态字符串和动态内容是可以交替使用的,并且可以各自扩展连接在一起,组成最终的目标地址。其中,静态字符串指的是用单引号括起来的内容,动态内容是指用方括号括起来的内容。
另外还有一种动态内容,称作“补齐数字范围”,比如 {1,10}最终会扩展成01, 02, 03, 04, …, 10,而不是1, 2, 3, 4, …, 10。对应地,用方括号括起来的数字对,比如[1..10],称为“非补齐数字范围”。
在上述的例子中,已经涉及4种入口描述表达式,下面分类详细描述所有的入口描述表达式。
1) 静态字符串
由单引号包围的字符序列,比如 http://abc.com。作用是作为入口表达式的一个静态组成部分。
2) 非补齐数字范围
由方括号包围的数字范围,比如[1..9]。作用是把入口地址扩展为1, 2, 3, … , 9的格式。
3) 补齐数字范围
由花括号包围的数字范围,比如{1..10}。作用是把入口地址扩展为01, 02, …, 10的格式。
4) 外部引用的字符串列表
由尖括号和单引号包围的字符串。作用是提供一些特殊功能,比如           <‘file:///C:/word.txt’>,这个式子的意思是,假设硬盘上有C:/word.txt这个文件,并且文件的内容是:

word1
word2
word3
….

那么,把入口地址按照文本文件的内容扩展,如果完整的入口描述表达式是:

----------------------------------------------------
入口 'http://mp3.baidu.com/s?w=' <'file:///C:/word.txt'> 		
-----------------------------------------------------


那么,上述入口将被扩展成:

http://mp3.baidu.com/s?w=word1
http://mp3.baidu.com/s?w=word2
http://mp3.baidu.com/s?w=word3
……

进一步为了更高的灵活性,在文件内容中也可以写范围。如果文件的内容是:

--------------------------
abc[1..2]ef
gh[2..3]m[5..6]n
---------------------------

则入口将扩展成:

http://mp3.baidu.com/s?w=abc1
http://mp3.baidu.com/s?w=abc2
http://mp3.baidu.com/s?w=gh2m5n
http://mp3.baidu.com/s?w=gh2m6n
http://mp3.baidu.com/s?w=gh3m5n
http://mp3.baidu.com/s?w=gh3m6n

单行字符串中最多写两个范围。
3.2.5  编码配置
配置用什么编码来解析页面,比如:
---------------------------------------------	
入口 'http://abc.com/list.jsp'   配置:编码=UTF-8
---------------------------------------------

3.2.6  步长配置
配置在入口描述语句中的数字范围的步长,比如:

---------------------------------------------	
入口 'http://abc.com/list.jsp?page='  [1..3] 
配置:步长[0]=10
---------------------------------------------


上述入口描述将扩展成:

http://abc.com/list.jsp?page=10
http://abc.com/list.jsp?page=20
http://abc.com/list.jsp?page=30

“步长[0]”中的[0]指定这个步长配置是对应于哪一个数字范围的,也就是说,如果入口配置写成这样:
---------------------------------------------	
入口 'http://abc.com/list.jsp?page='  [1..3]  '&parm='  [5..6]
配置:步长[0]=10, 步长[1]=20.
---------------------------------------------


那么最终扩展得到的入口将是:

http://abc.com/list.jsp?page=10&parm=100
http://abc.com/list.jsp?page=10&parm=120
http://abc.com/list.jsp?page=20&parm=100
http://abc.com/list.jsp?page=20&parm=120
http://abc.com/list.jsp?page=30&parm=100
http://abc.com/list.jsp?page=30&parm=120
kqy929 2009-06-17
很好,很强大。
我买了这本书,挺不错的。
但不知是否可提供书中的源码哦?
如果能提供那当然是最好的了。
kqy929#126.com
roki 2009-06-17
源代码我会慢慢帖出来的 ,工作比较忙, 哪些你需要的 我可以先帖
Global site tag (gtag.js) - Google Analytics