php使用curl函数采集,PHP利用curl数据单页面并行采集函数get_htmls用法示例

这篇文章主要为大家详细介绍了PHP利用curl数据单页面并行采集函数get_htmls用法示例,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!

用第一篇的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利用curl数据单页面并行采集函数get_htmls用法示例的内容就先介绍到这里,更多相关文章的可以留意512笔记的其他信息。

关键词:

您可能感兴趣的文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值