收藏个比较方便的curl方法,同时爬取多个url

574次阅读
没有评论
收藏个比较方便的curl方法,同时爬取多个url

来自 https://www.cnblogs.com/chunguang/p/5895179.html

#多线程并发抓取函数mfetch:

function mfetch($params=array(), $method){

    $mh = curl_multi_init(); #初始化一个curl_multi句柄

    $handles = array();

    foreach($params as $key=>$param){

        $ch = curl_init(); #初始化一个curl句柄

        $url = $param["url"];

        $data = $param["params"];

        if(strtolower($method)==="get"){

           #根据method参数判断是post还是get方式提交数据

            $url = "$url?" . http_build_query( $data ); #get方式

        }else{

            curl_setopt( $ch, CURLOPT_POSTFIELDS, $data ); #post方式

        }

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_HEADER, 0);

        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);

        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);

        curl_multi_add_handle($mh, $ch);

        $handles[$ch] = $key;

        #handles数组用来记录curl句柄对应的key,供后面使用,以保证返回的数据不乱序。

    }

    $running = null;

    $curls = array(); #curl数组用来记录各个curl句柄的返回值

    do { #发起curl请求,并循环等等1/100秒,直到引用参数"$running"为0

        usleep(10000);

        curl_multi_exec($mh, $running);

        while( ( $ret = curl_multi_info_read( $mh ) ) !== false ){

#循环读取curl返回,并根据其句柄对应的key一起记录到$curls数组中,保证返回的数据不乱序

            $curls[$handles[$ret["handle"]]] = $ret;

        }

    } while ( $running > 0 );

    foreach($curls as $key=>&$val){

        $val["content"] = curl_multi_getcontent($val["handle"]);

        curl_multi_remove_handle($mh, $val["handle"]); #移除curl句柄

    }

    curl_multi_close($mh); #关闭curl_multi句柄

    ksort($curls);

    return $curls;

}

 

#调用参数:

$keword = "360";

$page = 1;

$params = array();

for($i=0;$i<10;$i++){

    $params[$i] = array(

        "url"=>"http://www.so.com/s",

        "params"=>array('q'=>$keyword,'ie'=>"utf-8",'pn'=>($page1)*10+$i+1)

    );

}

$ret = mfetch($params, 'GET');

print_r($ret);

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-25发表,共计1967字。
新手QQ群:570568346,欢迎进群讨论 Python51学习