利用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 相关文章推荐
Search File Contents PHP 搜索目录文本内容的代码
Feb 21 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
php中jQuery插件autocomplate的简单使用笔记
Jun 14 PHP
phpize的深入理解
Jun 03 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
PHP number_format函数原理及实例解析
Jul 14 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设计模式 Decorator(装饰模式)
2011/06/26 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
PHP中echo和print的区别
2014/08/28 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
js获取class的所有元素
2013/03/28 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
layui实现三级联动效果
2019/07/26 Javascript
vue实现扫码功能
2020/01/17 Javascript
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
Python注释详解
2016/06/01 Python
django中静态文件配置static的方法
2018/05/20 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
利用Python检测URL状态
2019/07/31 Python
python每天定时运行某程序代码
2019/08/16 Python
python实现高斯投影正反算方式
2020/01/17 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
触摸春天教学反思
2014/02/03 职场文书
迎新晚会主持词
2014/03/24 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技