基于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初学者头疼十四条问题大总结
Nov 12 PHP
php array_walk() 数组函数
Jul 12 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
Jun 19 PHP
destoon后台网站设置变成空白的解决方法
Jun 21 PHP
thinkphp缓存技术详解
Dec 09 PHP
Laravel 5 框架入门(四)完结篇
Apr 09 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 PHP
PHP的Trait机制原理与用法分析
Oct 18 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 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
第十三节--对象串行化
2006/11/16 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
javascript 面向对象编程基础:封装
2009/08/21 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
React服务端渲染原理解析与实践
2021/03/04 Javascript
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python中qutip用法示例详解
2020/10/02 Python
用Python实现职工信息管理系统
2020/12/30 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
应届生学校辅导员求职信
2013/11/07 职场文书
初级会计求职信范文
2014/02/15 职场文书
三年级评语大全
2014/04/23 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
学习礼仪心得体会
2014/09/01 职场文书
2014年政务公开工作总结
2014/12/09 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
mysql的Buffer Pool存储及原理
2022/04/02 MySQL