基于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的面试题集,附我的答案和分析(一)
Nov 19 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
php_screw 1.5:php加密: 安装与使用详解
Jun 20 PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 PHP
php对称加密算法示例
May 07 PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 PHP
如何使用GDB调试PHP程序
Dec 08 PHP
Yii框架分页实现方法详解
May 20 PHP
php实现微信企业转账功能
Oct 02 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采集相关教程之一 CURL函数库
2010/02/15 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
PHP自定义多进制的方法
2016/11/03 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
javascript数组详解
2014/10/22 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python查询mysql,返回json的实例
2018/03/26 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
python判断元素是否存在的实例方法
2020/09/24 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
宝宝周岁宴答谢词
2014/01/26 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
2019教师的学习计划
2019/06/25 职场文书