基于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中的数组操作函数整理
Aug 18 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
php中jQuery插件autocomplate的简单使用笔记
Jun 14 PHP
解析PHP中$_FILES的使用以及注意事项
Jul 05 PHP
smarty学习笔记之常见代码段用法总结
Mar 19 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
Mar 15 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
PHP生成随机数的方法总结
Mar 01 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 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文件上传原理简单分析
2011/05/29 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
python调用新浪微博API项目实践
2014/07/28 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python any()函数的使用方法
2019/10/28 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
生态学毕业生自荐信
2013/10/27 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
节约粮食标语
2014/06/18 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
护士业务学习心得体会
2016/01/25 职场文书
Go 内联优化让程序员爱不释手
2022/06/21 Golang