curl多线程抓取数据

curl模拟多线程,传入一维数组url
/** 
* curl模拟多线程
*
* @access public
* @author 2017.4
* @param array
* @return array
*/ 
function getCurlObject($urls = array()){
    $queue = curl_multi_init(); //允许并行地处理批处理cURL句柄。
foreach($urls as $url) {    
  $ch = curl_init();    
  
  curl_setopt($ch,  CURLOPT_URL, $url);           //这个curl只是说明了它是要干嘛,但是一直到 curl_multi_add_handle 都啥也没有去干,也就是说没有去模拟访问
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
  curl_setopt($ch,  CURLOPT_TIMEOUT, 65000);//超时
  curl_setopt($ch,  CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0'); //指明你的浏览器,这是我的
  //curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie); // 如果是需要登陆才能采集的话,需要加上你登陆后得到的cookie文件  
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_NOSIGNAL, true);


  
  curl_multi_add_handle($queue,$ch);  //向批处理句柄中,添加句柄   后面批量的去模拟访问,抓取回资源


  //$curlInfo[] = curl_getinfo($ch);  
}
$responses = array();   //声名一个数组
do{
  while(($code = curl_multi_exec($queue,$active)) == CURLM_CALL_MULTI_PERFORM);   //返回值如果是0,那就得继续
}while($active);    //一直到资源里还有0条为止
//经过了刚才的循环指抓取 此时 $queue 就是一个批量的资源集了 
$i=0;
while($done = curl_multi_info_read($queue)){// 用这个专门读取批量资源集的函数,可以把这个资源集的内容一条条的读出来
  $info = curl_getinfo($done['handle']);
  //$responses[$i]['content'] = curl_multi_getcontent($done['handle']); 
  //要读取资源集的资源条抓取回来的内容,还得用专门的curl_multi_getcontent函数才能完成
  $responses[$i]['content'] = mb_convert_encoding(curl_multi_getcontent($done['handle']), 'utf-8', 'GBK,UTF-8,ASCII');
  curl_multi_remove_handle($queue,$done['handle']);   //读取了资源,别忘记把该资源从资源集中移除
  curl_close($done['handle']);                        //也别忘记把这个资源句柄关闭,减小内存开销
  $responses[$i]['url'] = $info['url'];
  $i++;
}
curl_multi_close($queue);   //总句柄关闭
    return $responses;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值