利用PHP制作简单的内容采集器的原理分析


Posted in PHP onOctober 01, 2008

前几天做了个小说连载的程序,因为怕更新麻烦,顺带就写了个采集器,采集八路中文网的,功能比较简单,不能自定义规则,不过大概思路都在里面了,自定义规则可以自己来扩展。

用php来做采集器主要用到两个函数:file_get_contents()和preg_match_all(),前一个是远程读取网页内容的,不过只在php5以上的版本才能用,后一个是正则函数,用来提取需要的内容的。

下面就一步一步来讲功能实现。

因为是采集小说,所以首先要将书名、作者、类型这三个提取出来,别的信息可根据需要提取。

这里以《回到明朝当王爷》为目标,先打开书目页,链接:http://www.86zw.com/Book/3727/Index.aspx

多打开几本书会发现,书名的基本格式是:http://www.86zw.com/Book/书号/Index.aspx,于是我们可以做一个开始页,定义一个<input type=text name=number>,用来输入需要采集的书号,以后就可以通过$_POST[‘number']这种格式来接收需要采集的书号了。接收到书号,下面要做的就是构造书目页:$url=http://www.86zw.com/Book/$_POST[‘number']/Index.aspx,当然这里是举个例子,主要是为了讲解方便,实际制作的时候最好检查一下$_POST[‘number']的合法性。

构造好URL以后就可以开始采集书籍信息了。使用file_get_contents() 函数打开书目页:$content=file_get_contents($url),这样就能将书目页的内容都读取出来了。接下来就是将书名、作者和类型等信息匹配出来了。这里就以书名为例,其他的都一样。 打开书目页,查看源文件,找到“<span class="booktitle">《回到明朝当王爷》</span>”,这就是要提取出来的书名了。提取书名的正则表达式:/<span class=\"newstitle\">(.*?)\<\/span>/is,使用preg_match_all()函数将书名取出:preg_match_all("/<span class=\"newstitle\">(.*?)\<\/span>/is",$contents,$title);这样$title[0][0]的内容就是我们要的标题了(preg_match_all函数的用法可以去百度查,这里就不详细说明了)。取出了书籍信息,接下来就是取章节内容了,要取章节内容,首先要做的就是找到每一章的地址,然后远程打开章节,用正则将内容取出来,入库或者直接生成html静态文件。这个是章节列表的地址:http://www.86zw.com/Html/Book/18/3727/List.shtm,可以看出这个和书目页一样,是有规律可寻的:http://www.86zw.com/Html/Book/分类号/书号/List.shtm。书号前面已经取得,这里的关键是找到分类号,分类号可以在前面的书目页找到,提取分类号:

preg_match_all("/Html\/Book\/[0-9]{1,}\/[0-9]{1,}\/List\.shtm/is",$contents,$typeid);这样还不够,还需要一个切取函数:
PHP代码如下:

function cut($string,$start,$end){
$message = explode($start,$string);
$message = explode($end,$message[1]); return $message[0];}其中$string为要被切取的内容,$start为开始的地方,$end为结束的地方。取出分类号:

$start = "Html/Book/";
$end
= "List.shtm";
$typeid = cut($typeid[0][0],$start,$end);
$typeid = explode("/",$typeid);[/php]

这样,$typeid[0]就是我们要找的分类号了。接下来就是构造章节列表的地址了:$chapterurl = http://www.86zw.com/Html/Book/.$typeid[0]/$_POST[‘number']/List.shtm。有了这个就能找到每一章节的地址了。方法如下:

$ustart = "\"";
$uend
= "\"";
//t表示title的缩写
$tstart = ">";
$tend
= "<";
//取路径,例如:123.shtm,2342.shtm,233.shtm
preg_match_all("/\"[0-9]{1,}\.(shtm)\"/is",$chapterurl,$url);
//取标题,例如:第一章 九世善人
preg_match_all("/<a href=\"[0-9]{1,}\.shtm\"(.*?)\<\/a>/is",$file,$title);
$count = count($url[0]);
for($i=0;$i<=$count;$i++)
{
$u = cut($url[0][$i],$ustart,$uend);
$t = cut($title[0][$i],$tstart,$tend);
$array[$u] = $t;
}

$array数组就是所有的章节地址了,到这里,采集器就完成一半了,剩下的就是循环打开每个章节地址,读取,然后将内容匹配出来。这个比较简单,这里就不详细叙述了。好了,今天就先写到这吧,第一次写这么长的文章,语言组织方面难免有问题,还请大家多包涵!

PHP 相关文章推荐
在 PHP 中使用随机数的三个步骤
Oct 09 PHP
我用php+mysql写的留言本
Oct 09 PHP
让的PHP代码飞起来的40条小技巧(提升php效率)
Apr 12 PHP
解析htaccess伪静态的规则
Jun 18 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 PHP
yii2 在控制器中验证请求参数的使用方法
Jun 19 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 PHP
php去除deprecated的实例方法
Nov 17 PHP
php数组总结篇(一)
Sep 30 #PHP
PHP EOT定界符的使用详解
Sep 30 #PHP
40个迹象表明你还是PHP菜鸟
Sep 29 #PHP
PHP网站基础优化方法小结
Sep 29 #PHP
10条PHP编程习惯助你找工作
Sep 29 #PHP
PHP生成带有雪花背景的验证码
Sep 28 #PHP
PHP编实现程动态图像的创建代码
Sep 28 #PHP
You might like
PHP 中dirname(_file_)讲解
2007/03/18 PHP
PHP insert语法详解
2008/06/07 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
php身份证号码检查类实例
2015/06/18 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
php pdo操作数据库示例
2017/03/10 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
Python 发送邮件方法总结
2020/08/10 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
工作交流会欢迎词
2014/01/12 职场文书
元宵节主持词
2014/03/25 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
世界遗产导游词
2015/02/13 职场文书
小学副班长竞选稿
2015/11/21 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
2019年教师入党申请书
2019/06/27 职场文书