基于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 cookie 作用范围?不要在当前页面使用你的cookie
Mar 24 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
php图像处理类实例
Jul 28 PHP
CI配置多数据库访问的方法
Mar 28 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
php redis setnx分布式锁简单原理解析
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
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
取得父标签
2006/11/14 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
Python模块学习 re 正则表达式
2011/05/19 Python
python开发中range()函数用法实例分析
2015/11/12 Python
对Python 数组的切片操作详解
2018/07/02 Python
python实现自动登录
2018/09/17 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
关于python 跨域处理方式详解
2020/03/28 Python
Django更新models数据库结构步骤
2020/04/01 Python
PyQt5实现登录页面
2020/05/30 Python
Django实现内容缓存实例方法
2020/06/30 Python
python实现图像外边界跟踪操作
2020/07/13 Python
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
顶岗实习接收函
2014/01/09 职场文书
村庄绿化方案
2014/05/07 职场文书
电影建党伟业观后感
2015/06/01 职场文书
Python绘制分类图的方法
2021/04/20 Python