基于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
php判断字符以及字符串的包含方法属性
Aug 30 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 PHP
php实现异步数据调用的方法
Dec 24 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
php短信接口代码
May 13 PHP
PHP中Array相关函数简介
Jul 03 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
详解阿里云视频直播PHP-SDK接入教程
Jul 09 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删除HTMl标签的三种解决方法
2013/06/30 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
理解javascript对象继承
2016/04/17 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
python仿抖音表白神器
2019/04/08 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
python实现单链表的方法示例
2019/09/03 Python
Python3常用内置方法代码实例
2019/11/18 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
英语专业应届生求职信范文
2013/11/15 职场文书
经理管理专业自荐信范文
2013/12/31 职场文书
先进党员事迹材料
2014/12/24 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
初中地理教学反思
2016/02/19 职场文书