0 Comments

采集规则管理程序

发布于:2012-11-21  |   作者:广州网站建设  |   已聚集:人围观
内容自动采集器程序实现

采集器模块包含3个部分,即爬虫程序、采集规则管理程序、采集内容管理程序,这些功能模块共同完成采集内容的抓取功能。本节将会以前面介绍的技术原理为基础,详细地介绍这几个组成部分的逻辑管理,以及具体的编码过程,其中涉及的知识点也会逐一详细讲解。广州网站建设

1  采集规则管理程序

采集规则管理程序的核心是基于正则表达式的内容管理程序。了解如何使用正则表达式获得指定的内容信息,是采集规则管理程序的重点。广州网站建设

正则表达式的应用范围非常广泛,涉及的内容也十分庞杂,读者如果感兴趣可以自己对照手册学习,这里不作详细阐述。这里主要介绍正则表达式在内容采集方面的应用。采集器的主要工作是应用正则表达式对页面代码做匹配,进而获得相应的内容。这也是正则表达式在Web方面的主要应用。下面的例子是使用PHP正则表达式提取超链接及其标题,代码如下:

广州网站建设


  1. $str = '<a id="top8" href="http://list.mp3.baidu.com/song/A.htm?top8" class="p14" target="_top">歌曲列表</a> 
  2. <br> 
  3. <a target="_blank" id="bp" href="http://list.mp3.baidu.com/list/bangping. html" class="p14">中文金曲榜</a> 
  4. <br> 
  5. <td nowrap="nowrap">>#8226;>nbsp;<a id="top19" href="qingyinyue.html? top19" class="p14" target="_top">轻音乐</a></td>';  
  6. $pat = '/<a (.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i'; preg_match_all($pat, $str,$m);   
  7. print_r($m);  

 

执行上面一段代码,输出结果如下:
广州网站设计
  1. Array  
  2. (  
  3.     [0] => Array  
  4.         (  
  5.             [0] => <a id="top8" href="http://list.mp3.baidu.com/song/A.                 htm?top8" class="p14" target="_top">歌曲列表</a> 
  6.             [1] => <a target="_blank" id="bp" href="http://list.mp3.baidu.          com/list/bangping.html" class="p14">中文金曲榜</a> 
  7.             [2] => <a id="top19" href="qingyinyue.html?top19" class="p14"           target="_top">轻音乐</a> 
  8.         )  
  9.     [1] => Array  
  10.         (  
  11.             [0] =>  id="top8"   
  12.             [1] =>  target="_blank" id="bp"   
  13.             [2] =>  id="top19"   
  14.         )  
  15.     [2] => Array  
  16.         (  
  17.             [0] => http://list.mp3.baidu.com/song/A.htm?top8  
  18.             [1] => http://list.mp3.baidu.com/list/bangping.html  
  19.             [2] => qingyinyue.html?top19  
  20.         )  
  21.     [3] => Array  
  22.         (  
  23.             [0] =>  class="p14" target="_top" 
  24.             [1] =>  class="p14" 
  25.             [2] =>  class="p14" target="_top" 
  26.         )  
  27.     [4] => Array  
  28.         (  
  29.             [0] => 歌曲列表  
  30.             [1] => 中文金曲榜  
  31.             [2] => 轻音乐  
  32.         )  
  33. )  

【代码解读】

通过上述代码可以了解到,通常的PHP正则表达式提取超链接获得内容的基本步骤。根据前面的需求分析可以知道,采集器模块涉及两个部分规则定制,即页面网址提取规则和页面内容提取规则。本章设定的抓取页面(http://auto.sina.com.cn/news/t/)是一个网站的汽车频道的列表页面。

URL列表页面的链接样式如下:


  1. <li> <a href="/news/2010-05-21/1705605024_4.shtml" title="自主的胜利?" target="_blank" class="fl">自主的胜利?</a><i> 

 

通过观察链接的特征,书写如下正则表达式来获得匹配信息。
广州网站设计
  1. $list_match = '/<li> <a href="(\/news\/.+?\.shtml)" title=".+?" target="_blank" class="fl">/'

 

获得内容页面的正则表达式依据和上面的方法一样,通过观察内容页面模块的部分HTML代码,可以得到正则匹配规则如下:

  1. /<!-- publish_helper(.+?) -->(.+?)<!-- publish_helper_end -->/is 

 

现在打开manage.php文件添加保存规则部分的代码,下面的程序将上面的功能做了整合,这样就可以完成一个完整的功能,代码如下:

  1. <?php 
  2. $con = mysql_connect ( 'localhost', 'root', '198251' ) or die ( 'Could not connect: ' . mysql_error () );  
  3. mysql_query ( "set names gb2312" ); //字符集设定  
  4. //echo 'Connected successfully';  
  5. $db = mysql_select_db ( 'get_content', $con );  
  6. if (! $db) {  
  7.     die ( "Can\'t use download : " . mysql_error () );  
  8. } else {  
  9.     $sql = "SELECT * FROM 'spiders' LIMIT 0 , 30  ;";  
  10.     $result = mysql_query ( $sql, $con );  
  11.     $row = mysql_fetch_array ( $result );  
  12.     if ($_POST ['flag'] == 1) {  
  13.         //更新定义规则  
  14.         $sql1 = "UPDATE 'get_content'.'spiders' SET 'ListPreg' = '" . $_POST        ['ListPreg'] . "','ContentPreg' = '" . $_POST ['ContentPreg'] . "',     'EnterUrl' = '" . $_POST ['EnterUrl'] . "' WHERE 'spiders'.'ID' =4      LIMIT 1 ;";  
  15.         $result1 = mysql_query ( $sql1, $con );  
  16.         mysql_free_result($result1);  
  17.         mysql_close($db);//关闭连接  
  18.         header ( "location:manage.php" );  
  19.     }  
  20. }  
  21. ?> 
  22. <table align=center cellspacing=0 cellpadding=0> 
  23.     <form method="post" action="manage.php"><input type="hidden" 
  24.         name="flag" value="1"> 
  25.  
  26.     <tr class=head> 
  27.         <td colspan="2">采集器管理</td> 
  28.     </tr> 
  29.     <tr class=line> 
  30.         <td width="11%">采集器描述</td> 
  31.         <td width="89%"><input name="Title" type="text" class="input" 
  32.             id="Title" size="40" value="" /></td> 
  33.     </tr> 
  34.     <tr class=line> 
  35.         <td width="11%">所属栏目</td> 
  36.         <td width="89%"><select name="Category"> 
  37.             <option value="1">汽车频道</option> 
  38.  
  39.         </select></td> 
  40.     </tr> 
  41.     <tr class=line> 
  42.         <td valign="top">列表页面地址</td> 
  43.         <td><input name="EnterUrl" type="text" class="input" 
  44.             value="<?php 
  45.             echo $row ['EnterUrl']?>size="60" /></td> 
  46.     </tr> 
  47.     <tr class=line> 
  48.         <td valign="top">列表页匹配描述</td> 
  49.         <td><textarea name="ListPreg" cols="80" rows="4" class="input">         <?php 
  50.         echo $row ['ListPreg']?></textarea></td> 
  51.     </tr> 
  52.     <tr class=line> 
  53.         <td valign="top">内容页匹配描述</td> 
  54.         <td><textarea name="ContentPreg" cols="80" rows="4" class="input">      <?php 
  55.         echo $row ['ContentPreg']?></textarea></td> 
  56.     </tr> 
  57.     <tr class=line> 
  58.         <td colspan="2" align="center"><input name="Submit" type="submit" 
  59.             class="btn" value="提交" /> <input name="Submit" type="button" 
  60.             class="btn" value="返回" onclick="history.go(-1);" /></td> 
  61.     </tr> 
  62.     </form> 
  63. </table> 

【代码解读】

梳理以上代码的执行流程,步骤如下:

(1)在第一次运行manage.php程序时,从数据库中提取spiders表中的规则信息。

(2)以数组的形式,传送值给表单中对应的标签显示出来。广州网站设计

(3)当对表单中的信息做修改之后,再将表单中的信息以POST的方式发送给PHP程序处理,然后更新数据库中的内容。

注意:设置一个隐藏的<input type="hidden" name="flag" value="1">标签,其中标签的值表示程序执行流程的编号,通过判断flag标签的值来实现流程控制,请读者在预读代码的时候注意。

运行manage.php程序,预览效果如图8.3所示,从图中可以看到数据库的规则信息被传到表单中了。广州网站设计

(点击查看大图)图8.3  采集器规则修改
标签:
飞机