利用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通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
php 记录进行累加并显示总时长为秒的结果
Nov 04 PHP
理解PHP中的stdClass类
Apr 18 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
php实现上传图片文件代码
Jul 19 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 09 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编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
2016/04/17 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
python结合API实现即时天气信息
2016/01/19 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
python爬取代理ip的示例
2020/12/18 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
工业自动化毕业生自荐信范文
2014/01/04 职场文书
霸王洗发水广告词
2014/03/14 职场文书
2015年少先队活动总结
2015/03/25 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python