基于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 相关文章推荐
为查询结果建立向后/向前按钮
Oct 09 PHP
第一节--面向对象编程
Nov 16 PHP
php中支持多种编码的中文字符串截取函数!
Mar 20 PHP
mac下使用brew配置环境的步骤分享
May 23 PHP
php class中self,parent,this的区别以及实例介绍
Apr 24 PHP
php常用Output和ptions/Info函数集介绍
Jun 19 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
PHP和Mysql中转UTF8编码问题汇总
Oct 10 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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的面向对象编程
2006/10/09 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
粗略分析Python中的内存泄漏
2015/04/23 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python实现媒体播放器功能
2018/02/11 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
python3爬取torrent种子链接实例
2020/01/16 Python
Python运行异常管理解决方案
2020/03/09 Python
Python 如何批量更新已安装的库
2020/05/26 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
大学班级计划书
2014/04/29 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
云冈石窟导游词
2015/02/04 职场文书
python 爬取天气网卫星图片
2021/06/07 Python