CMSware采集/正则及函数学习
导航:返回上一页
第一课:基础[ ]
待采集的内容链接列表页,一般是网站的2级或3级栏目列表页.(我们在此以下面的为例)
采集索引页URL:
http://www.enet.com.cn/elady/fashion/inforcenter/articlelist.jsp?_current_group=1&_current_page=2&acid=4542
- 采集索引页有效区域定位规则:
用来定位有效的内容链接位置,如下图.(就是我们要采的列表的区块,如下面,可能除了本身的列表外,还有其他栏目的调用列表,所以我们只取中间的,其他的都不要。当然有些栏目本身就一个列表,那这时留空,不用正则)
然后我们右键-查看源文件(这儿要注意下,最好在线用IE右键直接查看,不要另存下来,再用DW或editplus 打开,会有变化),找到一个开始符,一个结束符。
开始符、 结束符必须:从整个源文件最开始,从上到下第一个,不一定非得是惟一的。
如下图:
由上图,我们得到了开始、结束符。
采集索引页有效区域定位规则:
<table width="90%" border="0" cellspacing="0" cellpadding="0" align="center">{DATA}<table width="100%" border="0" cellspacing="0" cellpadding="10" align="center">
第二课:正则[ ]
要采集,就要用到正则,什么是正则?
按我最通俗的解释就是:用固定的语句,来对应不固定的内容
CMSware 用的正则的地方有:
- 有效内容页URL过虑规则
- 内容页分页采集自动检测规则
就以上两处,其他的地方都不需要正则。
正则语法:
所有采集正则必须以/开始, /isU结束.格式.即:
- /头标识{DATA}尾标识/isU
- 头/尾标识中的所有/符号必须加个\转义符,也就是</html>你要写成<\/html>
- 头/尾标识中的所有"符号必须加个\转义符,也就是你要写成
- [\s]*代表0个或多个空格,
- [^\"><\s]*代表除了",<,>,空格外的所有字符
- [0-9]+代表任意的数字组合:
实例:
有效内容页URL过虑规则:
<a href="/life/xiuxian/cultrue/200609/20060913146162_1.shtml" class="blackbiglist" target="_blank">不可思议的天然的风景</a>
我们按上面的正则语法,来写下,那就是:
/<a[\s]*href=\"([^\"><\s]*[0-9]+_[0-9]+.shtml)/isU
大家可以对比下。
内容页分页采集自动检测规则:
以 www.enet.com.cn/life/xiuxian/cultrue/200609/20060913146162_1.shtml 内容页为例:
IE上右键-查看源文件。得到分页地址:
<a href="/life/xiuxian/cultrue/200609/20060913146162_2.shtml"> 下一页</a>
我们将他改为正则,这时会发现跟上面的 有效页URL正则差不多。
/<a[\s]*href=\"([^\"><\s]*[0-9]+_[0-9]+.shtml)\"> 下一页<\/a>/isU
总结下就是:
有空格的地方用:
- [\s]*
- " 双引号
- ' 单引号
- / 斜杠 等符号前 各加一个 \
- 用() 号将 引号中间的内容围起来
/life/xiuxian/cultrue/200609/ 改用正则 [^\"><\s]*
20060913146162_2 改用正则 [0-9]+_[0-9]+ 注:这是两个语法的,中间用_ 分开了,最后,在开头 加个 / ,结尾加上 /isU 注:注意大小写
注:有些 下一页 是用 [下一页] 带[] 符号的,那就在符号前加 \ ,就是 \[下一页\]
第三课:取内容页的标题及内容[ ]
通过上面的学习,我已经解决了最麻烦的正则。以前部分,不需要正则了,也是跟上面的 采集索引页有效区域定位规则: 一样: 开始符{DATA}结束符。就OK了
- title 标题:
查看 www.enet.com.cn/life/xiuxian/cultrue/200609/20060913146162_1.shtml 页,右键-查看源文件。
最最上面,我们会看到
<title>不可思议的天然的风景休闲</title>
改后就是
<title>{DATA}</title>
不用任何正则,也不用 在 / 等前面加 \ ,直接用。很简单吧?有的说了。title 很不规则。那简单,我们取正文中的标题。接着查看源文件,得到
<font color="515151" class="p24"><b>不可思议的天然的风景</b></font>
改后就是:
<font color="515151" class="p24"><b>{DATA}</b></font>
这样就行了。标题有了,下面是作者,来源,关键字等信息。这些可以不要。也可以要。我们要:
- 作者: ( 这个对方是空,就不写源码了 )
作者:{DATA}来源:
- 来源网站: ( 来源:猫扑网 )
- 来源:{DATA}
- 关键字: ( <meta name="keywords" content="不可思议, 天然,风景,奇观"> )
<meta name="keywords" content="{DATA}">
- 内容:( 这个太长了,不帖了,大家根据下面的规则,自己看下源码里的显示吧 )
<td class="p14h">{DATA}<tr><td align=center>
因为有分页,所以我们要在内容的规则后面加上 ==>[localizeImg]==>[page]
==>[localizeImg] 图片本地化
==>[page] 采集内容分页
完整的就是:
<td class="p14h">{DATA}<tr><td align=center>==>[localizeImg]==>[page]
这时大家再点 测试,解析一个个的新闻查看,就会发现:标题、内容等各字段,都已经正确的取出了要采下来的内容,如果没有显示出来,或取多了,把非内容里的也取出来了,那就是你取的 开始、结束符 不准,再找,直到测试的结果满意为止。
第四课:采集过滤函数的写法,替换与过滤掉不想要的HTML标签[ ]
在采集中,我们常会遇见,内容中有广告,或HTML的各种标签,或某段内容,是我们不想要的,这时我们就要用到 采集过滤函数 了,把这些不想要的过滤掉,或替换成我们想要的某些效果。
后台-函数管理-采集过滤函数,或打开setting/crawler.ini.php ,来添加过滤函数。
我们先打开 crawler.ini.php 文件,看里面的内容。我们看里面系统自带的过滤函数 ==>[clearRubbish] 是怎么样的。
function crawler_clearRubbish($str) { $clear_pattern = array( '1' => array( 'pattern'=>"/<OBJECT[\S|\s]*<\/OBJECT>/isU" ,'replace'=>"" ), '2' => array( 'pattern'=>"/<IFRAME[\S|\s]*<\/IFRAME>/isU" ,'replace'=>"" ), '3' => array( 'pattern'=>"/<SCRIPT[\S|\s]*<\/SCRIPT>/isU" ,'replace'=>"" ), '4' => array( 'pattern'=>"/<A HREF=[\S|\s]*>([\S|\s]*)<\/A>/isU" ,'replace'=>"\\1" ), '5' => array( 'pattern'=>"/<map[\S|\s]*>([\S|\s]*)<\/map>/isU" ,'replace'=>"" ), '6' => array( 'pattern'=>"/<!--[\S|\s]*-->/isU" ,'replace'=>"" ), ); foreach($clear_pattern as $key=>$var) { $str = preg_replace($var['pattern'],$var['replace'], $str); } return $str; }
上面是 6 组过滤,是一般广告常用的格式,如:flash/iframe/js 等。我们来说解上面的一组,如第一组:
'1' => array( 'pattern'=>"/<OBJECT[\S|\s]*<\/OBJECT>/isU" ,'replace'=>"" ),
- 'pattern'=>"/<OBJECT[\S|\s]*<\/OBJECT>/isU" :这段是指要取片段或范围,也就是我们要过滤掉的内容。
- 'replace'=>"" :这是替换的意思,默认是空,也就成了我们俗称的过滤掉了。如果你需要将范围内的内容,替换成你自己的,请在这里添加,普通的HTML语法就行了,但要在 / " [ ] 符号前加 \
详解:
- /isU :是正则的开始与结束符。这与采集时URL的正则是一样的用法。
- [\S|\s]* :这个就是重点了,是正则,意思就是:匹配任何符号
- <OBJECT : 这是FLASH的HTML标签的开始符。这里没有用 > 关闭标签,这是因为FLASH的这个标签里,还有其他的一些参数标签,所以这后面,要紧跟着用 [\S|\s]* 正则来包括这些参数的标签。
- <\/OBJECT> : FLASH的HTML标签的结束符。同采集时的规则一样,要在 / " [ ] 符号前加 \,
下面我们就添加一个自定义的过滤。如: SELECT 标签吧。
我们复制一组过滤 (每组过滤4 行,一般改动的只有第一行开头的 “1” 数字,表示一个过滤,一个个排下来就行了,上面已经有6 个了,那我们下面再添加的,就是 “7” 了 )
'6' => array( 'pattern'=>"/<!--[\S|\s]*-->/isU" ,'replace'=>"" ),
就COPY最后这组过滤,是过滤 的。我们copy ,并紧跟着帖到下面,就是:
'6' => array( 'pattern'=>"/<!--[\S|\s]*-->/isU" ,'replace'=>"" ), '6' => array( 'pattern'=>"/<!--[\S|\s]*-->/isU" ,'replace'=>"" ),
上面红字部分,就是我们要改的。改后就是一组新的过滤了。
改后就是:
'7' => array( 'pattern'=>"/<SELECT[\S|\s]*<\/SELECT>/isU" ,'replace'=>"" ),
这些只用到1组的过滤函数 只适合一部分即开即合并的标签,如JS的:<SCRIPT src="test/test.js"></SCRIPT>,如果用在别的标签上过滤的范围就太大了,如表格的 table 如果我们直接用 <table[\S|\s]*<\/table> ,那就会将整个表格过滤掉,如果表格中间正好是我们要的内容,那内容也将过滤掉了。
(注:
<table[\S|\s]*><\/table> <table[\S|\s]*<\/table>
这两开始符是不一样的, 第一个是 标签开始后就马上结束的,开始与结束中间没有内容,第二个没有“>“进行关合标签,那他的范围就是很大了,包括了标签中间的所有内容。所以这儿一定要注意。)
所以,这些中间还有要取的内容的部分,我们就要将要过滤的标签,分成2组来过滤,只将HTML的 开始符与结束符 过滤,而这中间的内容,则保留。
那就是(我们接着第7组,往下添加):
'8' => array( 'pattern'=>"/<table[\S|\s]*>/isU" ,'replace'=>"" ), '9' => array( 'pattern'=>"/<\/table>/isU" ,'replace'=>"" ),
这样,就过只过滤掉HTML标签了。
然后table 标签中间又有必须的 tr td ,我们接着加上。
'10' => array( 'pattern'=>"/<tr[\S|\s]*>/isU" ,'replace'=>"" '11' => array( 'pattern'=>"/<\/tr>/isU" ,'replace'=>"" '12' => array( 'pattern'=>"/<td[\S|\s]*>/isU" ,'replace'=>"" ), '13' => array( 'pattern'=>"/<\/td>/isU" ,'replace'=>"" ),
这样就完成了表格HTML标签的过滤,大家可以按自己需要,再添加别的。
操作步骤也很简单,总结下就是:
- COPY 4行一组的过滤,帖下面,然后改第一行的 数字,再改第二行的 标签。