基于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 相关文章推荐
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
Memcached常用命令以及使用说明详解
Jun 27 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
php三种实现多线程类似的方法
Oct 30 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP判断是否是json字符串
Apr 01 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 whois查询API制作方法
2011/06/23 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
JQuery toggle使用分析
2009/11/16 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
python保存数据到本地文件的方法
2018/06/23 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
农救科工作职责
2013/11/27 职场文书
年终总结会主持词
2014/03/25 职场文书
2014年冬季防火方案
2014/05/21 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
对照检查剖析材料
2014/09/30 职场文书
中标通知书范本
2015/04/17 职场文书
道歉的话语大全
2015/05/12 职场文书
永远是春天观后感
2015/06/12 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书