基于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&amp;&amp;mysql)六
Oct 09 PHP
PHP生成静态页面详解
Dec 05 PHP
PHP集成FCK的函数代码
Sep 27 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
php抓取页面的几种方法详解
Jun 17 PHP
PHP5.3与5.5废弃与过期函数整理汇总
Jul 10 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php适配器模式简单应用示例
Oct 23 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
php中一个完整表单处理实现代码
2011/11/10 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
javascript 时间比较实现代码
2009/10/28 Javascript
jquery中实现标签切换效果的代码
2011/03/01 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
整理Javascript数组学习笔记
2015/11/29 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
vue集成chart.js的实现方法
2019/08/20 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
详解python pandas 分组统计的方法
2019/07/30 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
Python操作Excel的学习笔记
2021/02/18 Python
几个Linux面试题笔试题
2012/12/01 面试题
一套比较完整的软件测试人员面试题
2012/05/13 面试题
老总助理工作岗位职责
2014/02/06 职场文书
转让协议书范本
2014/04/15 职场文书
公务员培的训心得体会
2014/09/01 职场文书
python xlwt模块的使用解析
2021/04/13 Python
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript