个人工具
名字空间
变换
操作

CMSware采集/正则及函数学习

来自站长百科
跳转到: 导航, 搜索

导航:返回上一页

目录

第一课:基础

采集索引页面URL

待采集的内容链接列表页,一般是网站的2级或3级栏目列表页.(我们在此以下面的为例)

采集索引页URL:

http://www.enet.com.cn/elady/fashion/inforcenter/articlelist.jsp?_current_group=1&_current_page=2&acid=4542
  • 采集索引页有效区域定位规则:

用来定位有效的内容链接位置,如下图.(就是我们要采的列表的区块,如下面,可能除了本身的列表外,还有其他栏目的调用列表,所以我们只取中间的,其他的都不要。当然有些栏目本身就一个列表,那这时留空,不用正则)

Cmsware126.jpg

然后我们右键-查看源文件(这儿要注意下,最好在线用IE右键直接查看,不要另存下来,再用DW或editplus 打开,会有变化),找到一个开始符,一个结束符。

开始符、 结束符必须:从整个源文件最开始,从上到下第一个,不一定非得是惟一的。

如下图:

Cmsware127.gif

由上图,我们得到了开始、结束符。

采集索引页有效区域定位规则:

<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上右键-查看源文件。得到分页地址:

Cmsware128.gif

<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行一组的过滤,帖下面,然后改第一行的 数字,再改第二行的 标签。



参考来源

留言