基于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中动态显示签名和ip原理
Mar 28 PHP
用php+javascript实现二级级联菜单的制作
May 06 PHP
php数组总结篇(一)
Sep 30 PHP
php 全局变量范围分析
Aug 07 PHP
PHP数组及条件,循环语句学习
Nov 11 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
PHP实现随机数字、字母的验证码功能
Aug 01 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 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 购物车的例子
2009/05/04 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
php文件缓存类汇总
2014/11/21 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
js实现点击左右按钮轮播图片效果实例
2015/01/29 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
Python实现多线程抓取妹子图
2015/08/08 Python
Python实例一个类背后发生了什么
2016/02/09 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
对python Tkinter Text的用法详解
2018/10/11 Python
对Python信号处理模块signal详解
2019/01/09 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
python读取mysql数据绘制条形图
2020/03/25 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
嘉年华活动新闻稿
2015/07/17 职场文书
升学宴学生致辞
2015/07/27 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
Python实现排序方法常见的四种
2021/07/15 Python