基于curl数据采集之单页面并行采集函数get_htmls的使用


Posted in PHP onApril 28, 2013

用第一篇的get_html()实现简单的数据采集,由于是一个一个执行才采集数据的传输时间就会是所有页面下载的总时长,一个页面假设1秒,那么10个页面就是10秒了。所幸curl还提供了并行处理的功能。

要写一个并行采集的函数,先要了解要采集什么样的页面,对采集的页面用什么请求,才能写出一个相对常用的函数。

功能需求分析:

返回什么?

当然每一个页面的html集合成的数组

传递什么参数?

编写get_html()时,我们知道了可以用options数组来传递更多的curl参数,那么多页面同时采集函数的编写这种特性也得保留下来。

什么类型的参数?

无论是请求网页HTML,还是调用互联网api接口,get和post传递参数总是请求同一个页面或者接口,只是参数不同罢了。那么参数的类型是:

get_htmls($url,$options);

$url 是string

$options,是一个二维数组,每一个页面的参数为一个数组。

这样的话,貌似解决了问题。但是我找遍了curl的手册都没有看到get的参数传递在什么地方,所以只能$url 是数组的形式传递并且增加一个method参数

函数的原型就定下来了get_htmls($urls,$options = array, $method = ‘get');代码如下:

function get_htmls($urls, $options = array(), $method = 'get'){
     $mh = curl_multi_init();
     if($method == 'get'){//get方式传值 最常用
         foreach($urls as $key=>$url){
             $ch = curl_init($url);
             $options[CURLOPT_RETURNTRANSFER] = true;
             $options[CURLOPT_TIMEOUT] = 5;
             curl_setopt_array($ch,$options);
             $curls[$key] = $ch;
             curl_multi_add_handle($mh,$curls[$key]);
         }
     }elseif($method == 'post'){//post方式传值 
         foreach($options as $key=>$option){
             $ch = curl_init($urls);
             $option[CURLOPT_RETURNTRANSFER] = true;
             $option[CURLOPT_TIMEOUT] = 5;
             $option[CURLOPT_POST] = true;
             curl_setopt_array($ch,$option);
             $curls[$key] = $ch;
             curl_multi_add_handle($mh,$curls[$key]);
         }
     }else{
         exit("参数出错!\n");
     }
     do{
         $mrc = curl_multi_exec($mh,$active);
         curl_multi_select($mh);//减少CPU压力 注释掉CPU压力变大
     }while($active);
     foreach($curls as $key=>$ch){
         $html = curl_multi_getcontent($ch);
         curl_multi_remove_handle($mh,$ch);
         curl_close($ch);
         $htmls[$key] = $html;
     }
     curl_multi_close($mh);
     return $htmls;
 }

常用的get请求是通过改变url参数来实现的,又因为我们的函数是针对数据采集的。必然是分类采集,所以网址类似于这种:

http://www.baidu.com/s?wd=shili&pn=0&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=10&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=20&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=30&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=50&ie=utf-8

上面五个页面是很有规律的,改变的仅仅是pn的值。

$urls = array();
 for($i=1; $i<=5; $i++){
     $urls[] = 'http://www.baidu.com/s?wd=shili&pn='.(($i-1)*10).'&ie=utf-8';
 }
 $option[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0';
 $htmls = get_htmls($urls,$option);
 foreach($htmls as $html){
     echo $html;//这里得到html 就可以进行数据处理了
 }

模拟常用的post请求:

写一个post.php文件如下:

 if(isset($_POST['username']) && isset($_POST['password'])){
     echo '用户名是: '.$_POST['username'].' 密码是: '.$_POST['password'];
 }else{
     echo '请求错误!';
 }

然后调用如下:
$url = 'http://localhost/yourpath/post.php';//这里是你的路径
 $options = array();
 for($i=1; $i<=5; $i++){
     $option[CURLOPT_POSTFIELDS] = 'username=user'.$i.'&password=pass'.$i;
     $options[] = $option;
 }
 $htmls = get_htmls($url,$options,'post');
 foreach($htmls as $html){
     echo $html;//这里得到html 就可以进行数据处理了
 }

这样这个get_htmls函数也基本能实现一些数据采集的功能了

今天分享就到这里 写的不好的 讲得不清楚的 请多多指教

PHP 相关文章推荐
福利彩票幸运号码自动生成器
Oct 09 PHP
php提示undefined index的几种解决方法
May 21 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
php将字符串转换为数组实例讲解
May 05 PHP
PHP实现简易图形计算器
Aug 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
PHP中最容易忘记的一些知识点总结
Apr 28 #PHP
You might like
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
php验证码实现代码(3种)
2015/09/07 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
Django用户认证系统 Web请求中的认证解析
2019/08/02 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
某公司部分笔试题
2013/11/05 面试题
网站开发实习生的自我评价
2013/12/11 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
企业车辆管理制度
2014/01/24 职场文书
违纪检讨书2000字
2014/02/08 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
商务英语求职信范文
2015/03/19 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
医院消毒隔离制度
2015/08/05 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android