这是我项目中一直在用的一个方法
php
if(empty($url))?return?$url;
$curl?=?curl_init();
curl_setopt($curl,?CURLOPT_URL,$url);//请求url地址
curl_setopt($curl,?CURLOPT_HTTPHEADER?,?$header?);?//构造IP
if(!empty($params)?count($params)?0){
curl_setopt($curl,?CURLOPT_POST,?true);
//Request?Payload格式数据
if(isset($params['is_json'])?$params['is_json']?===?true){
unset($params['is_json']);
$params?=?json_encode($params);
}else{
$params?=?http_build_query($params);
}
curl_setopt($curl,?CURLOPT_POSTFIELDS,?$params);??
//curl_setopt($curl,?CURLOPT_HEADER,?true);//是否返回响应头信息
curl_setopt($curl,?CURLOPT_RETURNTRANSFER,?true);//是否将结果返回
curl_setopt($curl,?CURLOPT_FOLLOWLOCATION,?true);//是否重定向
curl_setopt($curl,?CURLOPT_SSL_VERIFYPEER,?false);?//?只信任CA颁布的证书?
//curl_setopt($curl,?CURLOPT_CAINFO,?$cacert);?//?CA根证书(用来验证的网站证书是否是CA颁布)?
//?从证书中检查SSL加密算法是否存在
curl_setopt($curl,?CURLOPT_SSL_VERIFYHOST,?FALSE);
curl_setopt($curl,?CURLOPT_HTTP_VERSION,?CURL_HTTP_VERSION_1_0);?
//curl_setopt($curl,?CURLOPT_HTTPHEADER,?array("Expect:?"));?
curl_setopt($curl,?CURLOPT_CONNECTTIMEOUT,?$timeout);//用来告诉PHP脚本在成功连接服务器前等待多久(连接成功之后就会开始缓冲输出),这个参数是为了应对目标服务器的过载,下线,或者崩溃等可能状况;
curl_setopt($curl,?CURLOPT_TIMEOUT,?$timeout);//用来告诉成功PHP脚本,从服务器接收缓冲完成前需要等待多长时间.如果目标是个巨大的文件,生成内容速度过慢或者链路速度过慢,这个参数就会很有用.
//?自动设置Referer
curl_setopt($curl,?CURLOPT_AUTOREFERER,?1);
//setcookie('cookie_jar',?$cookie_jar);?//保存cookie路径
$data?=?curl_exec($curl);?//执行?
curl_close($curl);
return?$data;
curl_exec
可以参考官方网站范例:
你要用CURL,就跟Session一样,要先初始化 curl_init(),不然PHP部会知道该怎麼运作.初始化完成之後就要开始设定参数,就像是要不要显示出来.当你参数设定完毕,就要开始执行这个CURL.最後就要关闭这个CURL.这就算是一个简单的CURL运用,当然还有更多变化.
实际例子:
//?创建一个cURL资源
$ch?=?curl_init();
//?设置URL和相应的选项
curl_setopt($ch,?CURLOPT_URL,?"
);
curl_setopt($ch,?CURLOPT_HEADER,?0);
//?抓取URL并把它传递给浏览器
curl_exec($ch);
//?关闭cURL资源,并且释放系统资源
curl_close($ch);
如使用mysql一样,首先,我们必须先建立一个「curl」的连线,也所以呢,必须使用到 curl_init() 这个函式.而为了怕建立连线忘了关闭.所以呢,必须先写好关闭的函式,curl_close($ch).
不过大部分HTML标签都可以抓下来,并且显示,可是有部分可能与资料加密性或是转址的部分,就无法正常显示.
/?建立CURL连线
//?设定撷取的URL网址
curl_setopt($ch,?CURLOPT_HEADER,?false);
//将curl_exec()获取的讯息以文件流的形式返回,而不是直接输出.
curl_setopt($ch,?CURLOPT_RETURNTRANSFER,1);
//?执行
$temp=curl_exec($ch);
//?关闭CURL连线
curl_close($ch)
加上curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);之後,他会将curl_exec()获取的讯息以文件流的形式返回传给$temp,而不是直接输出.如果要显示出画面的话就加上 echo $temp;就可以了.
下面先分享一个比较常用的,传递参数的部分.
简易的使用语法(GET):
//?建立CURL连线
Get参数可以直接在网址传递例如网址後面加的?SomeVar=test,但是一旦资料量很大,用POST送还是比较适合.
简易的使用语法(POST):
//设定要传的?变数A=值A?变数B=值B?(中间要用符号串接)
$PostData?=?"a=abcb=def";
//设定CURLOPT_POST?为?1或true,表示要用POST方式传递
curl_setopt($ch,?CURLOPT_POST,?1);?
//CURLOPT_POSTFIELDS?後面则是要传接的POST资料.
curl_setopt($ch,?CURLOPT_POSTFIELDS,?$PostData);
以上的传递方式在某些状况下很好用,譬如说,没有设计完整的会员申请系统,就可以利用上面这些程式码,做一个自动注册申请机
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相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址.
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄.
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄.
前段时间一直在用PHP写些小程序, 为此接触了Curl这个类. 感觉非常的强大, 在此把我遇到的一些功能记录下来;
PHP的curl()在抓取网页的效率方面是比较高的,而且支持多线程,而file_get_contents()效率就要稍低些,当然,使用curl时需要开启下curl扩展.
代码实战
先来看登录部分的代码:
//模拟登录
function
login_post($url,
$cookie,
$post)
{
$curl
=
curl_init();//初始化curl模块
curl_setopt($curl,
CURLOPT_URL,
$url);//登录提交的地址
CURLOPT_HEADER,
0);//是否显示头信息
CURLOPT_RETURNTRANSFER,
0);//是否自动显示返回的信息
CURLOPT_COOKIEJAR,
$cookie);
//设置Cookie信息保存在指定的文件中
CURLOPT_POST,
①.);//post方式提交
CURLOPT_POSTFIELDS,
http_build_query($post));//要提交的信息
curl_exec($curl);//执行cURL
curl_close($curl);//关闭cURL资源,并且释放系统资源
函数login_post()首先初始化curl_init(),然后使用curl_setopt()设置相关选项信息,包括要提交的url地址,保存的cookie文件,post的数据(用户名和密码等信息),是否返回信息等等,然后curl_exec执行curl,最后curl_close()释放资源.注意PHP自带的http_build_query()可以将数组转换成相连接的字符串.
此时此刻呢如果登录成功后,我们要获取登录成功后的页面信息.
//登录成功后获取数据
get_content($url,
$cookie)
$ch
curl_init();
curl_setopt($ch,
$url);
0);
①.);
CURLOPT_COOKIEFILE,
//读取cookie
$rs
//执行cURL抓取页面内容
return
$rs;
函数get_content()中也是先初始化curl,然后设置相关选项,执行curl,释放资源.其中我们设置CURLOPT_RETURNTRANSFER为1即自动返回信息,而CURLOPT_COOKIEFILE可以读取到登录时保存的cookie信息,最后将页面内容返回.
我们的最终目的是要获取到模拟登录后的信息,也就是只有正常登录成功后才能获取的有用信息.此时此刻呢我们以登录开源中国的移动版为例,看看如何抓取到登录成功后的信息.
//设置post的数据
$post
array
(
'email'
'oschina账户',
'pwd'
'oschina密码',
'goto_page'
'/my',
'error_page'
'/login',
'save_login'
'1',
'submit'
'现在登录'
//登录地址
$url
"";
//设置cookie保存路径
$cookie
dirname(__FILE__)
.
'/cookie_oschina.txt';
//登录后要获取信息的地址
$post);
//获取登录页的信息
$content
//删除cookie文件
@
unlink($cookie);
//匹配页面信息
$preg
"/td
class='portrait'(.*)\/td/i";
preg_match_all($preg,
$content,
$arr);
$str
$arr[1][0];
//输出内容
echo
$str;
使用总结
①.、初始化curl;
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!