基于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
PHP数字格式化
Dec 06 PHP
用PHP代码给图片加水印
Jul 01 PHP
js代码实现微博导航栏
Jul 30 PHP
PHP会话处理的10个函数
Aug 11 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
php 生成Tab键或逗号分隔的CSV
Sep 24 PHP
PHP 中常量的知识整理
Apr 14 PHP
在PHP中输出JS语句以及乱码问题的解决方案
Feb 13 PHP
一次因composer错误使用引发的问题与解决
Mar 06 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 PHP
如何在PHP中生成随机数
Jun 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
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
php查看网页源代码的方法
2015/03/13 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
Python中shutil模块的学习笔记教程
2017/04/04 Python
实例详解Python模块decimal
2019/06/26 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
车间班组长岗位职责
2013/11/13 职场文书
物业客服专员岗位职责
2013/11/30 职场文书
入党自我评价范文
2014/02/02 职场文书
精彩广告词大全
2014/03/19 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
安全口号大全
2014/06/21 职场文书
女儿满月酒致辞
2015/07/29 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
Python内置数据类型中的集合详解
2022/03/18 Python
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL