数字化技能提升教程,数字化时代生存宝典

数字化百科 / 词条 / CMSware采集/正则及函数学习

CMSware采集/正则及函数学习

查看全部词条命名空间:Main

导航:返回上一页


第一课:基础


采集索引页面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

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

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


{DATA}
align="center">

第二课:正则

要采集,就要用到正则,什么是正则?

按我最通俗的解释就是:用固定的语句,来对应不固定的内容

CMSware 用的正则的地方有:


  • 有效内容页URL过虑规则

  • 内容页分页采集自动检测规则

就以上两处,其他的地方都不需要正则。

正则语法:

所有采集正则必须以/开始, /isU结束.格式.即:

  • /头标识{DATA}尾标识/isU
  • 头/尾标识中的所有/符号必须加个\转义符,也就是你要写成<\/html>
  • 头/尾标识中的所有"符号必须加个\转义符,也就是你要写成
  • [\s]*代表0个或多个空格,
  • [^\"><\s]*代表除了",<,>,空格外的所有字符
  • [0-9]+代表任意的数字组合:

实例

有效内容页URL过虑规则:


不可思议的天然的风景

我们按上面的正则语法,来写下,那就是:

/<\s]*[0-9]+_[0-9]+.shtml)/isU

大家可以对比下。

内容页分页采集自动检测规则:

以 www.enet.com.cn/life/xiuxian/cultrue/200609/20060913146162_1.shtml 内容页为例:

IE上右键-查看源文件。得到分页地址:


cmsware128.gif


下一页

我们将他改为正则,这时会发现跟上面的 有效页URL正则差不多。

/<\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 页,右键-查看源文件。

最最上面,我们会看到


不可思议的天然的风景休闲

改后就是

{DATA}

不用任何正则,也不用 在 / 等前面加 \ ,直接用。很简单吧?有的说了。title 很不规则。那简单,我们取正文中的标题。接着查看源文件,得到

不可思议的天然的风景

改后就是:

{DATA}

这样就行了。标题有了,下面是作者,来源,关键字等信息。这些可以不要。也可以要。我们要:

  • 作者: ( 这个对方是空,就不写源码了 )
作者:{DATA}来源:
:来源网站: ( 来源:猫扑网
) :来源:{DATA}
:关键字: ( )

:内容:( 这个太长了,不帖了,大家根据下面的规则,自己看下源码里的显示吧 )
{DATA}
因为有分页,所以我们要在内容的规则后面加上 ==>[localizeImg]==>[page]

==>[localizeImg] 图片本地化

==>[page] 采集内容分页

完整的就是:


{DATA}
==>[localizeImg]==>[page]

这时大家再点 测试,解析一个个的新闻查看,就会发现:标题、内容等各字段,都已经正确的取出了要采下来的内容,如果没有显示出来,或取多了,把非内容里的也取出来了,那就是你取的 开始、结束符 不准,再找,直到测试的结果满意为止。

第四课:采集过滤函数的写法,替换与过滤掉不想要的HTML标签

采集中,我们常会遇见,内容中有广告,或HTML的各种标签,或某段内容,是我们不想要的,这时我们就要用到 采集过滤函数 了,把这些不想要的过滤掉,或替换成我们想要的某些效果。

后台-函数管理-采集过滤函数,或打开setting/crawler.ini.php ,来添加过滤函数。

我们先打开 crawler.ini.php 文件,看里面的内容。我们看里面系统自带的过滤函数 ==>[clearRubbish] 是怎么样的。


function crawler_clearRubbish($str)
{
$clear_pattern = array(
'1' => array(
'pattern'=>"//isU"
,'replace'=>""
),
'2' => array(
'pattern'=>"//isU"
,'replace'=>""
),
'3' => array(
'pattern'=>"//isU"
,'replace'=>""
),
'4' => array(
'pattern'=>"/([\S|\s]*)<\/A>/isU"
,'replace'=>"\\1"
),
'5' => array(
'pattern'=>"/([\S|\s]*)<\/map>/isU"
,'replace'=>""
),
'6' => array(
'pattern'=>"//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'=>"//isU"
,'replace'=>""
),


  • 'pattern'=>"//isU" :这段是指要取片段或范围,也就是我们要过滤掉的内容。

  • 'replace'=>"" :这是替换的意思,默认是空,也就成了我们俗称的过滤掉了。如果你需要将范围内的内容,替换成你自己的,请在这里添加,普通的HTML语法就行了,但要在 / " [ ] 符号前加 \

详解

  • /isU :是正则的开始与结束符。这与采集时URL的正则是一样的用法。
  • [\S|\s]* :这个就是重点了,是正则,意思就是:匹配任何符号
  • FLASH的HTML标签的开始符。这里没有用 > 关闭标签,这是因为FLASH的这个标签里,还有其他的一些参数标签,所以这后面,要紧跟着用 [\S|\s]* 正则来包括这些参数的标签。
  • <\/OBJECT> : FLASH的HTML标签的结束符。同采集时的规则一样,要在 / " [ ] 符号前加 \,
  • 下面我们就添加一个自定义的过滤。如: SELECT 标签吧。

    我们复制一组过滤 (每组过滤4 行,一般改动的只有第一行开头的 “1” 数字,表示一个过滤,一个个排下来就行了,上面已经有6 个了,那我们下面再添加的,就是 “7” 了 )


    '6' => array(
    'pattern'=>"//isU"
    ,'replace'=>""
    ),

    就COPY最后这组过滤,是过滤 的。我们copy ,并紧跟着帖到下面,就是:

    '6' => array(
    'pattern'=>"//isU"
    ,'replace'=>""
    ),
    '6' => array(
    'pattern'=>"//isU"
    ,'replace'=>""
    ),

    上面红字部分,就是我们要改的。改后就是一组新的过滤了。

    改后就是:


    '7' => array(
    'pattern'=>"//isU"
    ,'replace'=>""
    ),

    这些只用到1组的过滤函数 只适合一部分即开即合并的标签,如JS的:,如果用在别的标签上过滤的范围就太大了,如表格的 table 如果我们直接用 ,那就会将整个表格过滤掉,如果表格中间正好是我们要的内容,那内容也将过滤掉了。

    (注:


    <\/table>


    这两开始符是不一样的, 第一个是 标签开始后就马上结束的,开始与结束中间没有内容,第二个没有“>“进行关合标签,那他的范围就是很大了,包括了标签中间的所有内容。所以这儿一定要注意。)

    所以,这些中间还有要取的内容的部分,我们就要将要过滤的标签,分成2组来过滤,只将HTML的 开始符与结束符 过滤,而这中间的内容,则保留。

    那就是(我们接着第7组,往下添加):


    '8' => array(
    'pattern'=>"//isU"
    ,'replace'=>""
    ),
    '9' => array(
    'pattern'=>"/<\/table>/isU"
    ,'replace'=>""
    ),

    这样,就过只过滤掉HTML标签了。

    然后table 标签中间又有必须的 tr td ,我们接着加上。


    '10' => array(
    'pattern'=>"//isU"
    ,'replace'=>""

    '11' => array(
    'pattern'=>"/<\/tr>/isU"
    ,'replace'=>""

    '12' => array(
    'pattern'=>"//isU"
    ,'replace'=>""
    ),

    '13' => array(
    'pattern'=>"/<\/td>/isU"
    ,'replace'=>""
    ),


    这样就完成了表格HTML标签的过滤,大家可以按自己需要,再添加别的。

    操作步骤也很简单,总结下就是:


    • COPY 4行一组的过滤,帖下面,然后改第一行的 数字,再改第二行的 标签。

    参考来源

    category:CMSware