利用PHP制作简单的内容采集器的代码


Posted in PHP onNovember 28, 2007

采集器,通常又叫小偷程序,主要是用来抓取别人网页内容的。关于采集器的制作,其实并不难,就是远程打开要采集的网页,然后用正则表达式将需要的内容匹配出来,只要稍微有点正则表达式的基础,都能做出自己的采集器来的。 

前几天做了个小说连载的程序,因为怕更新麻烦,顺带就写了个采集器,采集八路中文网的,功能比较简单,不能自定义规则,不过大概思路都在里面了,自定义规则可以自己来扩展。 

用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数组就是所有的章节地址了,到这里,采集器就完成一半了,剩下的就是循环打开每个章节地址,读取,然后将内容匹配出来。这个比较简单,这里就不详细叙述了。好了,今天就先写到这吧,第一次写这么长的文章,语言组织方面难免有问题,还请大家多包涵!
本篇文章来源于 站长资讯网 原文链接:http://webdevelop.chinahtml.com/2/2007/php-119440156516960.shtml

PHP 相关文章推荐
一个好用的分页函数
Nov 16 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
PHP根据两点间的经纬度计算距离
Oct 31 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
Mar 19 PHP
php冒泡排序与快速排序实例详解
Dec 07 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
php实现二叉树中和为某一值的路径方法
Oct 14 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 PHP
php a simple smtp class
Nov 26 #PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 #PHP
分页详解 从此分页无忧(PHP+mysql)
Nov 23 #PHP
php Mysql日期和时间函数集合
Nov 16 #PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 #PHP
表单复选框向PHP传输数据的代码
Nov 13 #PHP
实用函数10
Nov 08 #PHP
You might like
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
python自动安装pip
2014/04/24 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
巴西网上药房:onofre
2016/11/21 全球购物
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
蛋糕店的商业计划书范文
2014/01/27 职场文书
大学军训感言1500字
2014/03/09 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
mysql数据库入门第一步之创建表
2021/05/14 MySQL
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server