PHP编程之【CURL应用篇】实例分享

PHPABC PHP开发 1,186 次浏览 , 没有评论

提要:PHP有个重要的函数CRUL,它有file_get_contents()函数的功能——即可获取页面内容,但是又有比他强大很多的其它功能
用途

            1、编写应用接口模拟POST请求。

            2、采集AJAX的内容。

            3、获取远程图片到本地。

            4、设置cookie模拟页面登陆获取隐藏内容(重要)。
分析:下面我就如上CRUL的用法按照用途来详细讲解一下。

——————————————————————————————————————–

在此之前,先介绍一下PHP中的CURL的函数库:
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be “selected”
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

———————————————————————————————————————

 

废话不多说,给出案例吧,请往下看~


1、【模拟POST请求编写应用接口】   /**   * Json 格式获取数据方法   * 作者 蜗牛   * $arr => 给出数组需求格式  */  function getJsonRequest($arr, $timeout=30)  {          //执行时间统计          $mtime = explode(' ', microtime());          $starttime = $mtime[1] + $mtime[0];       //执行时间统计     $params = json_encode($arr);    $url = APIURL_JSON;                              //接口请求路径地址   $ch = curl_init();                               //开启句柄   curl_setopt($ch, CURLOPT_URL,$url);         curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);       curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  //超时时间    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);   //将此字符串加入到POST请求里   $result = curl_exec($ch);                  //curl返回的内容JSON格式    curl_close($ch);                   //关闭此句柄   //执行时间统计   $mtime = explode(' ', microtime());    $log_message = number_format(($mtime[1] + $mtime[0] - $starttime), 6).'秒';   //执行时间统计   $result = json_decode($result,TRUE);             //将Json内容转换为数组格式返回     return $result;  }
2、【利用curl采集AJAX内容】  我上一篇利用simple_html_dom采集的案例只适用于直接输出的DOM对象, 对于Ajax异步获取的内容,必须借助强大的curl才可完成。 下面我利用curl将某某彩票网站的最新开奖信息获取到。   $result = array();  //下面是异步获取开奖信息的请求地址  $url = "http://www.wozhongla.com/sp2/act/data.resultsscTen.htm?type=107&d=".time();   $proxy = get_proxy();  $ch = curl_init($url);   if($proxy){       curl_setopt($ch,CURLOPT_PROXY,"http://$proxy");  }   curl_setopt($ch, CURLOPT_POST, TRUE);  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  curl_setopt($ch, CURLOPT_REFERER,"http://www.wozhongla.com/115/"); //页面来源  $result = curl_exec($ch);  curl_close($ch);  unset($ch);  $return = json_decode($result,true);  print_r($return);    //应该输出如下格式内容就对了   //处理url的函数  $proxy_ips_ar = array('222.77.14.55:8088','91.143.58.1:9000');   function get_proxy(){   if($proxy_ips_ar){      shuffle($proxy_ips_ar);    $proxy = $proxy_ips_ar[0];    return $proxy;   }else{    return '';   }  }

PHP编程之【CURL应用篇】实例分享

3、【根据图片链接,利用curl获取远程图片到本地(采集图片)】  下面给出案例:   <?php  header("Content-Type:text/html;charset=utf-8");  set_time_limit(0);//设置脚本执行时间无限长  define('DIR_ROOT', dirname(__FILE__));   /*  *@通过curl方式获取制定的图片到本地  *@ $url:完整的图片链接地址  *@ 类似@ http://g3.happimg.com/2013/0724/15/s2_105307.jpg  *@ $filename:要存储的文件名绝对路径  *@ 类似@ D:/AppServ/www/test/erweima/curl/07/_original.jpg  */  function getImg($url = "", $filename = "") {   if(is_dir(basename($filename))) {        echo "The Dir was not exits";        Return false;          }   $hander = curl_init();   $fp = fopen($filename,'wb');   curl_setopt($hander,CURLOPT_URL,$url);   curl_setopt($hander,CURLOPT_FILE,$fp);   curl_setopt($hander,CURLOPT_HEADER,0);   curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);   curl_setopt($hander,CURLOPT_TIMEOUT,60);    curl_exec($hander);   curl_close($hander);   fclose($fp);   Return true;  }   //远程图片链接  $imgUrl = "http://qzapp.qlogo.cn/qzapp/221352/10901875A3A3B7DB76843F62712F2785/100";  //采集后图片名称随机  $nameType = time()."_".mt_rand(100, 1000);  $photos = $nameType."_original.jpg";  //根据日期生成图片存储文件路径  $dir_num = date("m",time());  $root = DIR_ROOT."/".$dir_num;  if(!file_exists($root)){     mkdir($root);  }  $filenames = $root."/".$photos;   $return = getImg($imgUrl, $filenames);  if($return ===TRUE){    echo "采集完毕!";   }
4、【利用curl模拟登陆(重要)】 以前做数据采集的时候,有个需求是要把某菜谱网站做菜步骤内容采集下来。我还是利用《利用simple_html_dom【采集新浪天气】- 案例分享》这篇文章中介绍的方法,来采集需要的步骤,但是有个问题是,这网站菜谱展示页面的部分步骤内容是隐藏的需要登录后才给显示。这时我的解决方案如下:   //---利用curl设置cookie模拟登陆页面,获取隐藏内容----//  function getCookieCurl($url){   $useragent = $_SERVER['HTTP_USER_AGENT'];          //下面的cookie信息可以用自己的账号登陆之后获得(涉及网站安全方面)          //火狐下:工具->页面信息->安全->查看cookie->然后可看见所有的cookie      $cookie = "HDSSID=lklh45fbjpgn2d6kpv0ok3lp73;";          $cookie .= "_wconn=-1;_cid=2|北京;rcp_cookie_str=null1379084/253538:";          $cookie .= "1350459587/253409:1350455480/253494:1350453053;";          $cookie .= "Hm_lvt_06a54a6e8150679f4839ee359171f563=1350445274153,";          $cookie .= "1350448884368,1350455468543,1350459516085;";          $cookie .= "Hm_lpvt_06a54a6e8150679f4839ee359171f563=1350459588621;";          $cookie .= "__auth=ece07f97cf00066241a02ca5e5f8ed4213818308314734064d94c526d750f592;";          $cookie .= "__uid=1379084";   $ch= curl_init();    curl_setopt($ch, CURLOPT_URL,$url);    curl_setopt($ch, CURLOPT_COOKIE, $cookie);   curl_setopt($ch, CURLOPT_REFERER, $url);   curl_setopt($ch, CURLOPT_HEADER, false);   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   curl_setopt ($ch, CURLOPT_USERAGENT, $useragent);   curl_exec($ch);   $tempCn = curl_multi_getcontent($ch);   curl_close($ch);   return $tempCn;  }   //调用上述方法获取隐藏步骤内容。完毕  $curlContent = getCookieCurl($detailUrl);







 

 

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Go