叛逆的孩子,叛逆的无可奈何! 注册 | 登陆

读吧.net采集规则编写入门教程

举例中涉及到的采集地址:
http://www.fmx.cn/data/book/111/book111.html


就以本人今天发的规则为范例,向大家说一下编写采集规则的一般方法。

前面大概大家都会写,主要难点的地方,应该是章节列表地址 和 章节列表内容的匹配正则,以及章节内容地址。

XML/HTML代码
  1.   
  2. 章节列表地址:    http://www.fmx.cn/data/book/{read8bid}/book{read8bid}.html   
  3. 匹配正则 - 取得章节列表内容的变量组:   |<a href=book(d+)_(d+).html>(.*)</a>|isU   
  4. 上面变量组中为章节标题的变量组序号:read8b2cvar3   
  5. 章节内容地址:http://www.fmx.cn/data/book/{read8bid}/book{read8bid}_{read8b2cvar2}.html   

上面的{read8bid}变量,是重头戏,代表的是小说ID--这个看变量名字就看的出:read8 book id  声明此变量是读吧的,代表书籍ID。这个变量可以在任何不涉及到匹配正则的规则里用到,用来代表小说ID,也就是你要指定默认1-500书号的那个“书号”。理解了这个,一些简单的地址大家就都会写了。

这里是原来的样子;

XML/HTML代码
  1. 章节列表地址:http://www.fmx.cn/data/book/111/book111.html   
  2. 匹配正则 - 取得章节列表内容的变量组:|<a href=book111_1.html>第一章</a>|isU   
  3. 上面变量组中为章节标题的变量组序号:read8b2cvar3   
  4. 章节内容地址:http://www.fmx.cn/data/book/111/book111_1.html  

在本例中,小说ID=111,也就是说111={read8bid},或者反过来说。

匹配正则也是读吧采集规则里的重头,大部分人的跌倒都是在这里。首先要理解所谓“匹配”这个概念。
在读吧规则中,凡是用()括起来的,就代表需要匹配——说白了就是读取并纪录这个数值,把它指定给已经规定好的正则变量。
在本例中,<a href=book111_1.html>第一章</a> 这个是查原文件得到的——任何采集都是依靠读取原文件,就是说只有明文写在原文件里的内容才能被读到,而用JAVA或者IFRAME等等调用的内容采集器是读不到的,虽然你可以在前台看到。这也是为什么有的地址需要匹配二次的原因——比如起点,你在看小说的页面察看原文件不会看到内容,只有靠分析得到它调用的真正页面——一个TXT文件。
下面就是匹配正则的写法了。书生有一个帖子其实已经说的很明白了,我可以引在下面大家看一下:


首先说明一下读吧采集规则中正则表达式的基本结构。
以“|<a href="view_book.asp?id=(d+)" title=.*>(.*)</a>|isU”为例。

开始和末尾的“|”和“|isU”,是起始符和结束符,必须得跟上,其含义无需了解。

中间部分,就是相应的字符串了。字符串含义:

CODE:

小括号((和))括起来的,就是要匹配出来的内容,不括就不匹配。

点号(.)表示任意字符。

d 表示数字。

星号(*)表示任意长度0个到无数个。

加号(+)表示任意长度1个到无数个。

问号(?)表示任意长度0个到1个。




如上所言的字符串或字符由于都有特定含义,所以如果在要匹配的字符串中出现上述字符,就需要转义,即用转义符“”放在前面表示后面跟着的是一个符号。
而3.3中,细心的朋友可以发现“/”前面不再需要转义符了,因为起始结束符使用了“|”而不是原来的“/”,所有不会和内容里面的“/”冲突了,就不再需要進行转义了。

看起来很简单,但是因为语言太精炼,新手理解起来可能有点障碍,下面我通俗一点说明一下。

简单来说,一个匹配章节正则的组成应该是这个样子:

XML/HTML代码
  1. |(HTML代码)(章节名称)(HTML代码)|isU  

 

那个|和|isU  ,是读吧内部用来区别这段代码的,可以理解成是用来声明两个||中间的部分是正则-|| is U 嘛。
有一点需要理解的就是,我们用这个正则的目的是用来得到章节名称。也许会有人不大明白这个是干嘛的——至少我开始的时候就不知道。比如我就不知道这里为什么不用其他规则一样的用标签来表示,非要用匹配正则。但就是这么规定的,咱不是书生,不能改变规定,只有适应这个规定。
明确了正则的作用,下面就好办了,就是找到含有每个章节名称的HTML代码。在本例中是这样的:

XML/HTML代码
  1. ……<a href=book111_1.html>第一章</a></td><td align=center width=50%><a href=book111_2.html>第二章</a></td></tr><tr><td align=center width=50%><a href=book111_3.html>第三章</a>……   

 

提炼出来,就是这一部分:<a href=book111_1.html>第一章</a>
当然你也可以说是这部分:<tr><td align=center width=50%><a href=book111_2.html>第二章</a></td></tr>
或者这样:href=book111_1.html>第一章</a>
总之,和标签规则一样,只要考虑到这个语法结构的唯一性就可以了。我个人的习惯是两边各取一个完整的<>。

<a href=book111_1.html>第一章</a>

下一步就是针对它写正则。仔细研究一下书生说的代码含义,再多看看例子——自带的起点和翠微居采集规则就是最好的例子,可以通过后台 修改规则 察看。
我这里总结出常用的几种代码,当然也是通过观察大量正则得出的。

XML/HTML代码
  1. .*                 (.*)                     d+              (d+)  

 

简单吧?就两种:

 

XML/HTML代码
  1. .*和(.*)就代表所有字符,(类似火车头中的(*),用过火车头采集器的会理解)除了数字外都用这个代表。   
  2. d+和(d+)代表的是所有数字,不包括0。想包括0的话就用d* 。  

 

分析代码:

XML/HTML代码
  1. <a href=book111_1.html>第一章</a>,解体得:<a href=book(数字)_(数字).html>(任意字符)</a>  

 

伪正则:

 

XML/HTML代码
  1. <a href=book(d+)_(d+).html>(.*)</a>  

 

因为.也是一种正则符号,所以上面的 .html为了不冲突(不被服务器理解为正则),所以在前面加。同时正则需要用||isU装起来```^o^
得到最终正则:

 

XML/HTML代码
  1. |<a href=book(d+)_(d+).html>(.*)</a>|isU  

 

至于这里的d+为什么用带括号的,或者怎么判断需要不需要带括号,我在下面再详细说明。这里大家要注意.*一定要带括号,因为这是我们要得到的部分——章节名称。

至此章节列表的匹配正则解决了一半。下面还要说明上面的哪个是章节名。
上面变量组中为章节标题的变量组序号:
这个看起来莫名其妙,其实很简单,就是数一数你上面刚写的正则里,第几个带括号的变量是章节名称。这里很明显是第3个,所以选择read8b2cvar3。具体我也会在下面说明。
选好,章节的问题就完全解决了。

下面说到的也是不大容易理解的部分:
章节内容地址:http://www.fmx.cn/data/book/111/book111_1.html
这部分代码怎么写。根据开头我说明的,这里大家知道了可以把111替换为{read8id},得到下面的形式:
http://www.fmx.cn/data/book/{read8id}/book{read8id}_1.html
难题出来了:那个_1.html里的1,怎么办?
我们先来分析一下这个地址。这个地址的排列是很规则的,很明显,这里说的是111这本书的第1页,至于这第1页是序还是第一章我们不去考虑。那这个第一页的这个连接是怎么得出来的呢?
我们回过头看刚才的章节列表可以知道,这个连接是从

 

XML/HTML代码
  1. <a href=book111_1.html>第一章</a>  

 

得到的。
也就是说,我们点击了章节列表中的 第一章 ,跳转到了
http://www.fmx.cn/data/book/111/book111_1.html    这个地址。

这里我们暂时放下,说一下所谓“变量组”的概念。具体的我没学过,高中没毕业就下来了;所以我只能按我自己的理解通俗地说一下。如果有说错的地方,还请高人指点。虽然一堆高人都憋着不出来指点一下我们这些新手,但我对高人的智慧还是很佩服的。

所谓 变量组 ,我们可以理解为是一个容量组,这个容量组由一个抽屉和一个带锁的盒子组成。变量组有两种用法(或者说两种形式),加括号的和不加括号的,可以理解为加括号的就是锁进盒子里自己用的,不加括号的就是放在抽屉里大家随便用的。

象我们上面的章节列表正则表达式:

XML/HTML代码
  1. |<a href=book(d+)_(d+).html>(.*)</a>|isU  

 

里边,(d+),(d+),(.*)都是我们锁进盒子里的,分别代表的是111,1,第一章。
刚才可能大家有疑问,我们明明只要 第一章 这个就可以了,其他的为什么也锁进盒子里?
确实是这样。因为章节列表匹配正则主要就是为了得到“第一章”这个值,其他两个对这个没什么意义。

那么分析一下具体的内容地址,刚才我们不知道怎么表达的_1.html。
http://www.fmx.cn/data/book/111/book111_1.html
因为这个是由章节列表跳转得到的,很明显,

XML/HTML代码
  1. book111_1.html   
  2. book(d+)_(d+).html>(.*)</a>|isU   

 

这样有没有清楚一点?
对应的,_1.html中的1,就是我们刚刚锁进盒子里的第2个变量。这个变量的表达式就应该是{read8b2cvar2}


总结一下。

XML/HTML代码
  1. .*和(.*)         代表所有字符,除了数字外都用这个代表。   
  2. d+和(d+)       代表的是所有数字,不包括0。想包括0的话就用d* 。   
  3. {read8id}        代表书号,小说编号。   
  4. {read8b2cvar2}   代表变量组,也就是我们正则里用()括起来的,把值依次指定给了{read8b2cvar1}-{read8b2cvar5}  


这些主要的弄懂了,剩下的,关于地址里该用哪个变量调用也就知道了。今天的课程到此结束。

BTW:其实还应该有一点疑问的,正如我刚才所说,我们下面用到的只是变量2,那上面文章列表正则干嘛把111那个d+也用括号括起来?
呵呵,因为我在写章节列表正则的时候并不知道下面将用到哪个变量——当然很大一部分原因只是个人习惯而已。因为本例即使用到也可以用{read8id}代替。很明显在本例中{read8b2cvar1}={read8id}。

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):