基于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连接access数据库
Mar 27 PHP
优化php效率,提高php性能的一些方法
Mar 24 PHP
php上传文件,创建递归目录的实例代码
Oct 18 PHP
PHP实现取得HTTP请求的原文
Aug 18 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
php实现curl模拟ftp上传的方法
Jul 29 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
PHP微商城开源代码实例
Mar 27 PHP
PHP命名空间用法实例分析
Sep 04 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实现文件下载实例分享
2014/06/02 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
用cssText批量修改样式
2009/08/29 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
centos下更新Python版本的步骤
2013/02/12 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
浅析Python中元祖、列表和字典的区别
2016/08/17 Python
python编程实现希尔排序
2017/04/13 Python
python cs架构实现简单文件传输
2020/03/20 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
python实现代码统计程序
2019/09/19 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
毕业生求职信的经典写法
2014/01/31 职场文书
演讲稿格式
2014/04/30 职场文书
幼儿教师求职信
2014/05/24 职场文书
教师四风问题对照检查材料
2014/09/26 职场文书
模范教师材料大全
2014/12/16 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
初中团委工作总结
2015/08/13 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书