采集器模块包含3个部分,即爬虫程序、采集规则管理程序、采集内容管理程序,这些功能模块共同完成采集内容的抓取功能。本节将会以前面介绍的技术原理为基础,详细地介绍这几个组成部分的逻辑管理,以及具体的编码过程,其中涉及的知识点也会逐一详细讲解。广州网站建设
1 采集规则管理程序
采集规则管理程序的核心是基于正则表达式的内容管理程序。了解如何使用正则表达式获得指定的内容信息,是采集规则管理程序的重点。广州网站建设
正则表达式的应用范围非常广泛,涉及的内容也十分庞杂,读者如果感兴趣可以自己对照手册学习,这里不作详细阐述。这里主要介绍正则表达式在内容采集方面的应用。采集器的主要工作是应用正则表达式对页面代码做匹配,进而获得相应的内容。这也是正则表达式在Web方面的主要应用。下面的例子是使用PHP正则表达式提取超链接及其标题,代码如下:
广州网站建设
- $str = '<a id="top8" href="http://list.mp3.baidu.com/song/A.htm?top8" class="p14" target="_top">歌曲列表</a>
- <br>
- <a target="_blank" id="bp" href="http://list.mp3.baidu.com/list/bangping. html" class="p14">中文金曲榜</a>
- <br>
- <td nowrap="nowrap">>#8226;>nbsp;<a id="top19" href="qingyinyue.html? top19" class="p14" target="_top">轻音乐</a></td>';
- $pat = '/<a (.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i'; preg_match_all($pat, $str,$m);
- print_r($m);
执行上面一段代码,输出结果如下:
广州网站设计
- Array
- (
- [0] => Array
- (
- [0] => <a id="top8" href="http://list.mp3.baidu.com/song/A. htm?top8" class="p14" target="_top">歌曲列表</a>
- [1] => <a target="_blank" id="bp" href="http://list.mp3.baidu. com/list/bangping.html" class="p14">中文金曲榜</a>
- [2] => <a id="top19" href="qingyinyue.html?top19" class="p14" target="_top">轻音乐</a>
- )
- [1] => Array
- (
- [0] => id="top8"
- [1] => target="_blank" id="bp"
- [2] => id="top19"
- )
- [2] => Array
- (
- [0] => http://list.mp3.baidu.com/song/A.htm?top8
- [1] => http://list.mp3.baidu.com/list/bangping.html
- [2] => qingyinyue.html?top19
- )
- [3] => Array
- (
- [0] => class="p14" target="_top"
- [1] => class="p14"
- [2] => class="p14" target="_top"
- )
- [4] => Array
- (
- [0] => 歌曲列表
- [1] => 中文金曲榜
- [2] => 轻音乐
- )
- )
【代码解读】
通过上述代码可以了解到,通常的PHP正则表达式提取超链接获得内容的基本步骤。根据前面的需求分析可以知道,采集器模块涉及两个部分规则定制,即页面网址提取规则和页面内容提取规则。本章设定的抓取页面(http://auto.sina.com.cn/news/t/)是一个网站的汽车频道的列表页面。
URL列表页面的链接样式如下:
- <li> <a href="/news/2010-05-21/1705605024_4.shtml" title="自主的胜利?" target="_blank" class="fl">自主的胜利?</a><i>
通过观察链接的特征,书写如下正则表达式来获得匹配信息。
广州网站设计
- $list_match = '/<li> <a href="(\/news\/.+?\.shtml)" title=".+?" target="_blank" class="fl">/';
获得内容页面的正则表达式依据和上面的方法一样,通过观察内容页面模块的部分HTML代码,可以得到正则匹配规则如下:
- /<!-- publish_helper(.+?) -->(.+?)<!-- publish_helper_end -->/is
现在打开manage.php文件添加保存规则部分的代码,下面的程序将上面的功能做了整合,这样就可以完成一个完整的功能,代码如下:
- <?php
- $con = mysql_connect ( 'localhost', 'root', '198251' ) or die ( 'Could not connect: ' . mysql_error () );
- mysql_query ( "set names gb2312" ); //字符集设定
- //echo 'Connected successfully';
- $db = mysql_select_db ( 'get_content', $con );
- if (! $db) {
- die ( "Can\'t use download : " . mysql_error () );
- } else {
- $sql = "SELECT * FROM 'spiders' LIMIT 0 , 30 ;";
- $result = mysql_query ( $sql, $con );
- $row = mysql_fetch_array ( $result );
- if ($_POST ['flag'] == 1) {
- //更新定义规则
- $sql1 = "UPDATE 'get_content'.'spiders' SET 'ListPreg' = '" . $_POST ['ListPreg'] . "','ContentPreg' = '" . $_POST ['ContentPreg'] . "', 'EnterUrl' = '" . $_POST ['EnterUrl'] . "' WHERE 'spiders'.'ID' =4 LIMIT 1 ;";
- $result1 = mysql_query ( $sql1, $con );
- mysql_free_result($result1);
- mysql_close($db);//关闭连接
- header ( "location:manage.php" );
- }
- }
- ?>
- <table align=center cellspacing=0 cellpadding=0>
- <form method="post" action="manage.php"><input type="hidden"
- name="flag" value="1">
- <tr class=head>
- <td colspan="2">采集器管理</td>
- </tr>
- <tr class=line>
- <td width="11%">采集器描述</td>
- <td width="89%"><input name="Title" type="text" class="input"
- id="Title" size="40" value="" /></td>
- </tr>
- <tr class=line>
- <td width="11%">所属栏目</td>
- <td width="89%"><select name="Category">
- <option value="1">汽车频道</option>
- </select></td>
- </tr>
- <tr class=line>
- <td valign="top">列表页面地址</td>
- <td><input name="EnterUrl" type="text" class="input"
- value="<?php
- echo $row ['EnterUrl']?>" size="60" /></td>
- </tr>
- <tr class=line>
- <td valign="top">列表页匹配描述</td>
- <td><textarea name="ListPreg" cols="80" rows="4" class="input"> <?php
- echo $row ['ListPreg']?></textarea></td>
- </tr>
- <tr class=line>
- <td valign="top">内容页匹配描述</td>
- <td><textarea name="ContentPreg" cols="80" rows="4" class="input"> <?php
- echo $row ['ContentPreg']?></textarea></td>
- </tr>
- <tr class=line>
- <td colspan="2" align="center"><input name="Submit" type="submit"
- class="btn" value="提交" /> <input name="Submit" type="button"
- class="btn" value="返回" onclick="history.go(-1);" /></td>
- </tr>
- </form>
- </table>
【代码解读】
梳理以上代码的执行流程,步骤如下:
(1)在第一次运行manage.php程序时,从数据库中提取spiders表中的规则信息。
(2)以数组的形式,传送值给表单中对应的标签显示出来。广州网站设计
(3)当对表单中的信息做修改之后,再将表单中的信息以POST的方式发送给PHP程序处理,然后更新数据库中的内容。
注意:设置一个隐藏的<input type="hidden" name="flag" value="1">标签,其中标签的值表示程序执行流程的编号,通过判断flag标签的值来实现流程控制,请读者在预读代码的时候注意。
运行manage.php程序,预览效果如图8.3所示,从图中可以看到数据库的规则信息被传到表单中了。广州网站设计
![]() |
| (点击查看大图)图8.3 采集器规则修改 |




