基于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创建动态图像
Oct 09 PHP
E路文章系统PHP
Dec 11 PHP
php 正则 过滤html 的超链接
Jun 02 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
正确的PHP匹配UTF-8中文的正则表达式
May 13 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
php文件后缀不强制为.php的实操方法
Sep 18 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/06/23 PHP
ThinkPHP路由详解
2015/07/27 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
关于js datetime的那点事
2011/11/15 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
python简单读取大文件的方法
2016/07/01 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
Python celery原理及运行流程解析
2020/06/13 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
我的大学生活演讲稿
2014/04/25 职场文书
鉴定评语大全
2014/05/05 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
写景作文评语集锦
2014/12/25 职场文书
体育个人工作总结
2015/02/09 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
老乡会致辞
2015/07/28 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript