利用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
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
CI(CodeIgniter)框架介绍
Jun 09 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
thinkPHP5框架中widget的功能与用法详解
Jun 11 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 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使用pack处理二进制文件的方法
2014/07/03 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
python实现梯度下降法
2020/03/24 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
益模软件Java笔试题
2012/03/27 面试题
同学会邀请书大全
2014/01/12 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js