提要: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 ''; } }
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);