cURL常用功能

来源:互联网 发布:淘宝放单主持挣钱吗 编辑:程序博客网 时间:2024/06/10 19:18

我用php ,curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是登录以后的页面就比较困难了。

POST数据:

假设我们有一个处理表单的网址http://www.example.com/sendSMS.php,其可以接受两个表单域,一个是电话号码,一个是短信内容。

﹤?php$phoneNumber = '13912345678';$message = 'This message was generated by curl and php';$curlPost = 'pNUMBER='  . urlencode($phoneNumber) . '&MESSAGE=' . urlencode($message) . '&SUBMIT=Send';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/sendSMS.php');curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec();curl_close($ch);?﹥

关于SSL和Cookie

关于SSL也就是HTTPS协议,你只需要把CURLOPT_URL连接中的http://变成https://就可以了。当然,还有一个参数叫CURLOPT_SSL_VERIFYHOST可以设置为验证站点。

关于Cookie,你需要了解下面三个参数:

CURLOPT_COOKIE,在当面的会话中设置一个cookie

CURLOPT_COOKIEJAR,当会话结束的时候保存一个Cookie

CURLOPT_COOKIEFILE,Cookie的文件。



HTTP服务器认证

﹤?php $ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);curl_setopt(CURLOPT_USERPWD, '[username]:[password]')$data = curl_exec();curl_close($ch);?﹥

抓取无访问控制文件

<?php   $ch = curl_init();   curl_setopt($ch, CURLOPT_URL, "http://localhost/mytest/phpinfo.php");   curl_setopt($ch, CURLOPT_HEADER, false);   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话,就会直接输出   $result=curl_exec($ch);   curl_close($ch);   ?>  

使用代理进行抓取

为什么要使用代理进行抓取呢?以google为例吧,如果去抓google的数据,短时间内抓的很频繁的话,你就抓取不到了。google对你的ip地址做限制这个时候,你可以换代理重新抓。

<?php   $ch = curl_init();   curl_setopt($ch, CURLOPT_URL, "http://blog.51yip.com");   curl_setopt($ch, CURLOPT_HEADER, false);   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);   curl_setopt($ch, CURLOPT_PROXY, 125.21.23.6:8080);   //url_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');如果要密码的话,加上这个   $result=curl_exec($ch);   curl_close($ch);   ?> 

post数据后,抓取数据
单独说一下数据提交数据,因为用 curl的时候,很多时候会有数据交互的,所以比较重要的。

<?php   $ch = curl_init();   /*在这里需要注意的是,要提交的数据不能是二维数组或者更高  *例如array('name'=>serialize(array('tank','zhang')),'sex'=>1,'birth'=>'20101010')  *例如array('name'=>array('tank','zhang'),'sex'=>1,'birth'=>'20101010')这样会报错的*/   $data = array('name' => 'test', 'sex'=>1,'birth'=>'20101010');   curl_setopt($ch, CURLOPT_URL, 'http://localhost/mytest/curl/upload.php');   curl_setopt($ch, CURLOPT_POST, 1);   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);   curl_exec($ch);   ?>  // 在 upload.php文件中,print_r($_POST);利用curl就能抓取出upload.php输出的内容Array ( [name] => test [sex] => 1 [birth] => 20101010 )

抓取一些有页面访问控制的页面
<?php   $ch = curl_init();   curl_setopt($ch, CURLOPT_URL, "http://club-china");   /*CURLOPT_USERPWD主要用来破解页面访问控制的  *例如平时我们所以htpasswd产生页面控制等。*/   //curl_setopt($ch, CURLOPT_USERPWD, '231144:2091XTAjmd=');   curl_setopt($ch, CURLOPT_HTTPGET, 1);   curl_setopt($ch, CURLOPT_REFERER, "http://club-china");   curl_setopt($ch, CURLOPT_HEADER, 0);   $result=curl_exec($ch);   curl_close($ch);   ?>  

模拟登录到sina
我们要抓取数据,可能是登录以后的内容,这个时候我们就要用到curl的模拟登录功能了。

<?php     function checklogin( $user, $password )   {   if ( emptyempty( $user ) || emptyempty( $password ) )   {   return 0;   }   $ch = curl_init( );   curl_setopt( $ch, CURLOPT_REFERER, "http://mail.sina.com.cn/index.html" );   curl_setopt( $ch, CURLOPT_HEADER, true );   curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );   curl_setopt( $ch, CURLOPT_USERAGENT, USERAGENT );   curl_setopt( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );   curl_setopt( $ch, CURLOPT_TIMEOUT, TIMEOUT );   curl_setopt( $ch, CURLOPT_URL, "http://mail.sina.com.cn/cgi-bin/login.cgi" );   curl_setopt( $ch, CURLOPT_POST, true );   curl_setopt( $ch, CURLOPT_POSTFIELDS, "&logintype=uid&u=".urlencode( $user )."&psw=".$password );   $contents = curl_exec( $ch );   curl_close( $ch );   if ( !preg_match( "/Location: (.*)\\/cgi\\/index\\.php\\?check_time=(.*)\n/", $contents, $matches ) )   {   return 0;   }else{   return 1;   }   }      define( "USERAGENT", $_SERVER['HTTP_USER_AGENT'] );   define( "COOKIEJAR", tempnam( "/tmp", "cookie" ) );   define( "TIMEOUT", 500 );      echo checklogin("zhangying215","xtaj227");   ?>  

打开/tmp下面的cookie文件看一下
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
mail.sina.com.cn    FALSE    /    FALSE    0    SINAMAIL-WEBFACE-SESSID    65223c4bd8900284ed463d2a3e1ac182
#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SUE    es%3D8d96db0820c6c79922ad57d422f575e8%26ev%3Dv0%26es2%3Dcddfb8400dc5ca95902367ddcd7f57dd
.sina.com.cn    TRUE    /    FALSE    0    SUP    cv%3D1%26bt%3D1286900433%26et%3D1286986833%26lt%3D1%26uid%3D1445632344%26user%3D%25E5%25BC%25A0%25E6%2598%25A02001%26ag%3D2%26name%3Dzhangying20015%2540sina.com%26nick%3D%25E5%25BC%25A0%25E6%2598%25A02001%26sex%3D1%26ps%3D0%26email%3Dzhangying20015%2540sina.com%26dob%3D1982-07-18
#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SID    BihcallomxMx-QZxzGrOlcSQx%2F0B%2F0cmr.NyQ%2F0B%2FcmGGalmarlmcHrcGlSmrmxmfxal_CBZ%2F_afugCmmGirBYHm0Bc%40fr5ciZiGG5i
#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SPRIAL    bfb4102951fd5892a3fd5b42d442cd26
#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SINA_USER    %D5%C5%D2001


原创粉丝点击