基于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 09 PHP
关于php curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
ThinkPHP之getField详解
Jun 20 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
php中curl使用指南
Feb 05 PHP
php实现encode64编码类实例
Mar 24 PHP
PHP单例模式详细介绍
Jul 01 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP的swoole扩展安装方法详细教程
May 18 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 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 数据库树的遍历方法
2009/02/06 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
yii用户注册表单验证实例
2015/12/26 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
js实现简单页面全屏
2019/09/17 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
Python实现的双色球生成功能示例
2017/12/18 Python
详解Python的三种可变参数
2019/05/08 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
零件设计自荐信范文
2013/11/27 职场文书
入党自我评价范文
2014/02/02 职场文书
八项规定整改方案
2014/02/21 职场文书
母亲节演讲稿
2014/05/27 职场文书
财会专业大学生求职信
2014/09/26 职场文书
党支部承诺书
2015/01/20 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL