基于curl数据采集之正则处理函数get_matches的使用


Posted in PHP onApril 28, 2013

根据前两篇的博文:

基于curl数据采集之单页面采集函数get_html的使用

基于curl数据采集之单页面并行采集函数get_htmls的使用

已经可以得到了我们需要的html文件,现在需要处理得到的文件获取到我们需要的采集的数据。

对于html文档的解析,没有像XML那样的解析类,因为HTML文档有很多不成对的标签,很不严格。这个时候就需要采用其他的一些辅助类了,simplehtmldom是一个类似于JQuery方式操作HTML文档的解析类。可以很方便的得到想要的数据,可惜速度慢。这里不是我们这里讨论的重点,我主要使用正则来匹配我所需要的采集的数据,可以很快速的得到我需要采集的信息。

考虑到get_html可以判断返回的数据,但是get_htmls没有办法判断,为了方便调式和调用写了如下两个函数:

function get_matches($pattern,$html,$err_msg,$multi=false,$flags=0,$offset=0){
     if(!$multi){
         if(!preg_match($pattern,$html,$matches,$flags,$offset)){
             echo $err_msg."! 错误信息: ".get_preg_err_msg()."\n";
             return false;
         }
     }else{
         if(!preg_match_all($pattern,$html,$matches,$flags,$offset)){
             echo $err_msg."! 错误信息: ".get_preg_err_msg()."\n";
             return false;
         }
     }
     return $matches;
 }
 function get_preg_err_msg(){
     $error_code = preg_last_error();
     switch($error_code){
         case PREG_NO_ERROR :
             $err_msg = 'PREG_NO_ERROR';
             break;
         case PREG_INTERNAL_ERROR:
             $err_msg = 'PREG_INTERNAL_ERROR';
             break;
         case PREG_BACKTRACK_LIMIT_ERROR:
             $err_msg = 'PREG_BACKTRACK_LIMIT_ERROR';
             break;
         case PREG_RECURSION_LIMIT_ERROR:
             $err_msg = 'PREG_RECURSION_LIMIT_ERROR';
             break;
         case PREG_BAD_UTF8_ERROR:
             $err_msg = 'PREG_BAD_UTF8_ERROR';
             break;
         case PREG_BAD_UTF8_OFFSET_ERROR:
             $err_msg = 'PREG_BAD_UTF8_OFFSET_ERROR';
             break;
         default:
             return '未知错误!';
     }
     return $err_msg.': '.$error_code;
 }

可以这样调用:
$url = 'http://www.baidu.com';
 $html = get_html($url);
 $matches = get_matches('!<a[^<]+</a>!',$html,'没有找到链接',true);
 if($matches){
     var_dump($matches);
 }

或者这样调用:
$urls = array('http://www.baidu.com','http://www.hao123.com');
 $htmls = get_htmls($urls);
 foreach($htmls as $html){
     $matches = get_matches('!<a[^<]+</a>!',$html,'没有找到链接',true);
     if($matches){
         var_dump($matches);
     }
 }

就可以得到所需的信息,无论单页面采集还是多页面采集,最终PHP还是只能处理一个页面,由于使用get_matches了,可以对返回的值进行判断真假,得到正确的数据,由于使用正则的时候遇到了超过正则回溯的问题,增加get_preg_err_msg来提示正则信息。

由于采集数据的时候,经常是采集列表页,根据列表页得到的内容页链接再采集内容页,或者更多的层次,那么循环嵌套会很多,对于代码的控制会感觉力不从心。那我们是否可以把采集列表页的代码和采集内容页的代码,或者更多的层次的采集代码分离开,甚至循环都简化呢?

PHP 相关文章推荐
php中用文本文件做数据库的实现方法
Mar 27 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
PHP中抽象类和抽象方法概念与用法分析
May 24 PHP
php解析base64数据生成图片的方法
Dec 06 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP依赖注入原理与用法分析
Aug 21 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 #PHP
基于curl数据采集之单页面采集函数get_html的使用
Apr 28 #PHP
基于php上传图片重命名的6种解决方法的详细介绍
Apr 28 #PHP
PHP基础学习之流程控制的实现分析
Apr 28 #PHP
PHP基础之运算符的使用方法
Apr 28 #PHP
PHP数据类型之整数类型、浮点数的介绍
Apr 28 #PHP
PHP数据类型之布尔型的介绍
Apr 28 #PHP
You might like
php类声明和php类使用方法示例分享
2014/03/29 PHP
PHP chr()函数讲解
2019/02/11 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
Python中字典映射类型的学习教程
2015/08/20 Python
Python 类的继承实例详解
2017/03/25 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
Python中itertools的用法详解
2020/02/07 Python
python生成任意频率正弦波方式
2020/02/25 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
金融专业应届生求职信
2013/11/02 职场文书
教师档案管理制度
2014/01/23 职场文书
科研先进个人典型材料
2014/01/31 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电