利用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 minixml详解
Jul 19 PHP
PHP 柱状图实现代码
Dec 04 PHP
有关php运算符的知识大全
Nov 03 PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 PHP
基于PHP中的常用函数回顾
Jul 11 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
PHP微信红包生成代码分享
Oct 06 PHP
yii2 commands模式以及配置crontab定时任务的方法
Aug 19 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 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
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
基于jquery的滑动样例代码
2010/11/20 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
Django框架models使用group by详解
2020/03/11 Python
django教程如何自学
2020/07/31 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
越南综合购物网站:Lazada越南
2019/06/10 全球购物
校园活动宣传方案
2014/03/28 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
python中redis包操作数据库的教程
2022/04/19 Python
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers