cURL通常是指使用URL语法进行数据传递的命令行工具和库,本文所介绍的是其PHP拓展最基本的使用。
cURL主要用来进行数据抓取,当然,还有更多强大的功能,一些复杂的操作,例如处理Cookie、表单数据提交等实现起来也要比其他方法简单。
1.安装与使用
Windows下:修改php.ini的设置,打开php_curl.dll拓展即可。
Linux下: # wget http://curl.haxx.se/download/curl-7.17.1.tar.gz
# tar zxvf curl-7.17.1.tar.gz //解压
#cd curl-7.17.1
# ./configure --prefix=/usr/local/curl
# make
# make install
安装完成后通过phpinfo()来查看是否安装成功。
ps:如果是用的集成包来搭建PHP环境的话,一般而言cURL的功能都是开启的。
2.用cURL抓取网页的基本流程
最基本的抓取网页的步奏主要分为以下几步:
(1)初始化
(2)设置相关选项
(3)执行获取网页文档
(4)释放cURL句柄
例如:我们以抓取百度首页为例,代码示范这个流程:
<?php //初始化一个curl句柄 $ch = curl_init(); //对相关选项进行设置 curl_setopt($ch,CURLOPT_URL,‘www.baidu.com‘); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //执行抓取 $output = curl_exec($ch); //释放curl句柄 curl_close($ch); //输出抓取的数据 echo $output; ?>
在整个流程中,比较重要的步奏其实在于选项设置部分,即curl_setopt()函数,来指定URL请求的细节,具体设置选项的意义在后面介绍。
为了使上述代码具有可调试性,现在增加几行代码,来输出cURL执行后的相关信息。
<?php ...... curl_exec($ch); //获取执行请求后相关信息 $info = curl_getinfo($ch); print_r($info);//打印信息数组 ?>
对于抓取百度首页,打印出的信息数组如下:
Array ( [url] => HTTP://www.baidu.com/ [content_type] => text/html [http_code] => 200 [header_size] => 689 [request_size] => 52 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.016 [namelookup_time] => 0 [connect_time] => 0 [pretransfer_time] => 0 [size_upload] => 0 [size_download] => 14613 [speed_download] => 913312 [speed_upload] => 0 [download_content_length] => 14613 [upload_content_length] => 0 [starttransfer_time] => 0.016 [redirect_time] => 0 [redirect_url] => ......... )
其中,可以通过size_download字段信息来校验下载的信息是否完整:
对抓取的数据的filesize进行大小计算,来对比返回信息中size_download字段。
<?php ...... file_put_contents("D:/temp/test.html", $output); $size = filesize(‘D:/temp/test.html‘); if($size==$info[‘size_download‘]) { echo ‘success‘; } else { echo ‘fail‘; } ?>
3.用cURL伪造头信息
有些网站只允许手机端访问,例如腾讯的手机网(3g.qq.com),当用浏览器直接输入地址访问时,会跳转到http://3gqq.qq.com/,这是因为腾讯会识别访问该网址的UA(User Agent),来判断用户所使用的设备,进而进行相应的跳转,所以可以用cURL模拟手机UA来访问。
在选项设置中添加:
curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0");
来模拟安卓手机登陆访问。
返回的数据截图:
很显然,是手机网页。
4.cURL POST发送数据
有的网页通过form表单向服务器提交数据,当提交的method设置为post时候,我们也可以用cURL来进行提交。例如:
<?php //初始化一个curl句柄 $ch = curl_init(); $postdata = array(‘name‘=>‘dog‘,‘age‘=>‘999‘,‘address‘=>‘china‘); //对相关选项进行设置 curl_setopt($ch,CURLOPT_URL,‘http://localhost/form.php‘); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //设置post选项 curl_setopt($ch, CURLOPT_POST, 1); //绑定post变量 curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); //执行 $output = curl_exec($ch); //释放curl句柄 curl_close($ch); echo $output; ?>
其中,form.php脚本将提交的form数据进行打印输出。
执行脚本后输入如下:
Array ( [name] => dog [age] => 999 [address] => china )
也可以用这个方法向某些安全性较差的网站、留言板进行数据提交或者制作一个灌水机器人。
5.cURL相关设置项
前面曾经说过,cURL中灵魂性的东西就是选项设置,通过设置各种选项来指定cURL的细节。选项过多,不一一罗列,可以参考这里