CURL 的主要用途就是命令行自动化工具,如模拟一个使用者在浏览器端访问一个网站,自动登录,或者自动提取网页中的内容或二进制文件或数据。
首先,需要在 php.ini 中打开 php_curl.dll 或 php_curl.so 的扩展:
extension = php_curl.dll
然后重启 apache。
1.获取远程网页内容
PHP代码
- <?php
- //初始化curl
- $ch = curl_init() or die(curl_error());
- //设置url参数
- curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/s?wd=php5");
- //要求curl返回数据
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- //执行请求
- $result = curl_exec($ch) or die(curl_error());
- //取得返回结果并显示
- echo $result;
- echo curl_error($ch);
- //关闭curl
- curl_close($ch);
- ?>
该例将从百度上搜索结果并抓取过来。
2.下载远端文件 该脚本的功能是从某个网址下载文件,然后另存到本地某个目录中。可以看到使用 CURL 实现了下载的自动化。
PHP代码
- <?php
- function curl_download($remote, $local)
- {
- $cp = curl_init($remote);
- $fp = fopen($local, "w");
-
- curl_setopt($cp, CURLOPT_FILE, $fp);
- curl_setopt($cp, CURLOPT_HEADER, 0);
-
- curl_exec($cp);
- curl_close($cp);
- fclose($fp);
- }
- //从远端取得文件,保存在本地硬盘 d:\software 目录下
- curl_down("http://www.skycn.com/downloads/file.zip", "d:/software");
- ?>
3.使用表单自动登录
(1)Cookie 用法
在一些登录表,需要发送 Cookie 内容才能实现正确登录,使用 CURL 非常容易实现,请看下列程序:
PHP代码
- <?php
- /*
- 这个脚本可以实现:
- 在一个表单实现登录,保存在 session 中,登录后下载一个文件
- */
-
- //初始化curl
- $ch = curl_init();
-
- //设置登录表单的 URL 地址
- curl_setopt($ch, CURLOPT_URL, 'http://mis.example.com/index.php');
-
- //使用 POST 方法
- curl_setope($ch, CURLOPT_POST, 1);
-
- //设置 POST 的参数,表单名称和每个表单字段元素
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'USERNAME=administrator&PADDWORD=sodopass&imageField=&Action=Login');
-
- //模信浏览器的行为,并保存 Cookie 内容
- curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
-
- //设置 CURLOPT_RETURNTRANSFER 变量的值为1,表示 curl_exec() 方法返回一个字符串返回值
- curl_setopt($ch, CURLOPT_RETURNFRANSFER, 1);
-
- //开始执行请求(表单登录)
- $store = curl_exec($ch);
-
- //调试用对象,可以关闭
- //print_r($store);
-
- //设置文件下载的参数
- //curl_setopt($ch, CURLOPT_URL, 'http://mis.example.com/secret/file.php?file_id=12');
-
- //执行第二次请求(文件下载)
- $content = curl_exec($ch);
- /*
- $content 表示取得的文件内容,您可以将 $content 变量显示在浏览器,或者直接保存在本地
- */
-
- //关闭 curl 对象
- curl_close($ch);
- ?>
(2)POST 用法
特别要注意:POST 的数据要经过 urlencode 编码。
PHP代码
- <?php
- //要发送 POST 的字段和值
- $_POST['username'] = '1111';
- $_POST['password'] = '1111';
- $ch = curl_init() or die(curl_error());
- //发送的浏览器信息
- curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
- $params = "username=$_POST[username]&password=$_POST[password]";
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
- curl_setopt($ch, CURLOPT_URL, "http://www.docan.net/login.php?act=loginok");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $data1 = curl_exec($ch) or die(curl_error());
- echo '<font color=black face=verdana size=3>'.$data1.'</font>';
- echo curl_error($ch);
- curl_close($ch);
- ?>
DE><?php
set_time_limit(0);
@date_default_timezone_set('Asia/Shanghai');
function curlrequest($url,$postfield,$proxy=""){
$proxy=trim($proxy);
$user_agent ="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
$ch = curl_init(); // 初始化CURL句柄
if(!empty($proxy)){
curl_setopt ($ch, CURLOPT_PROXY, $proxy);//设置代理服务器
}
curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
//curl_setopt($ch, CURLOPT_FAILONERROR, 1); // 启用时显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);//启用时会将服务器服务器返回的“Location:”放在header中递归的返回给服务器
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);// 设为TRUE把curl_exec()结果转化为字串,而不是直接输出
curl_setopt($ch, CURLOPT_POST, 1);//启用POST提交
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfield); //设置POST提交的字符串
//curl_setopt($ch, CURLOPT_PORT, 80); //设置端口
curl_setopt($ch, CURLOPT_TIMEOUT, 25); // 超时时间
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);//HTTP请求User-Agent:头
//curl_setopt($ch,CURLOPT_HEADER,1);//设为TRUE在输出中包含头信息
//$fp = fopen("example_homepage.txt", "w");//输出文件
//curl_setopt($ch, CURLOPT_FILE, $fp);//设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。
curl_setopt($ch,CURLOPT_HTTPHEADER,array(
'Accept-Language: zh-cn',
'Connection: Keep-Alive',
'Cache-Control: no-cache'
));//设置HTTP头信息
$document = curl_exec($ch); //执行预定义的CURL
$info=curl_getinfo($ch); //得到返回信息的特性
//print_r($info);
if($info[http_code]=="405"){
echo "bad proxy {$proxy}\n"; //代理出错
exit;
}
//curl_close($ch);
return $document;
}
//请求URL
$url="http://example.cn/getInfo.php";
//POST提交数据,可用HTTPWATCH查看
$postfield="userName=test&year=2008&passWord=123456&Submit=%CC%E1%BD%BB";
//代理服务器
$proxy = '';
//请求
$str=curlrequest($url,$postfield,$proxy);
//输出结果
echo $str;DE>
评论