利用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 相关文章推荐
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
数据库查询记录php 多行多列显示
Aug 15 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
php图片的裁剪与缩放生成符合需求的缩略图
Jan 11 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 PHP
使用php+swoole对client数据实时更新(一)
Jan 07 PHP
php 获取文件行数的方法总结
Oct 11 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 PHP
php实现获取近几日、月时间示例
Jul 06 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 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
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
python读取html中指定元素生成excle文件示例
2014/04/03 Python
Python不规范的日期字符串处理类
2014/06/10 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
django静态文件加载的方法
2018/05/20 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
幼儿园大班教学反思
2014/02/10 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
普通党员个人整改措施
2014/10/27 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
法律意见书范文
2015/06/04 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
创业计划书之餐饮
2019/09/02 职场文书
Python装饰器详细介绍
2022/03/25 Python