注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

php curl常用  

2013-03-29 06:32:41|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
来源:http://blog.51yip.com/php/1039.html

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

1,抓取无访问控制文件

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

2,使用代理进行抓取

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

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

3,post数据后,抓取数据

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

  1. <?php  
  2.  $ch = curl_init();  
  3.  /*在这里需要注意的是,要提交的数据不能是二维数组或者更高 
  4.  *例如array('name'=>serialize(array('tank','zhang')),'sex'=>1,'birth'=>'20101010') 
  5.  *例如array('name'=>array('tank','zhang'),'sex'=>1,'birth'=>'20101010')这样会报错的*/  
  6.  $data = array('name' => 'test''sex'=>1,'birth'=>'20101010');  
  7.  curl_setopt($ch, CURLOPT_URL, 'http://localhost/mytest/curl/upload.php');  
  8.  curl_setopt($ch, CURLOPT_POST, 1);  
  9.  curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
  10.  curl_exec($ch);  
  11.  ?>  

upload.php文件中,print_r($_POST);利用curl就能抓取出upload.php输出的内容Array ( [name] => test [sex] => 1 [birth] => 20101010 )

4,抓取一些有页面访问控制的页面

以前写过一篇,页面访问控制的3种方法有兴趣的可以看一下。

如果用上面提到的方法抓的话,会报以下错误

You are not authorized to view this page
You do not have permission to view this directory or page using the credentials that you supplied because your Web browser is sending a WWW-Authenticate header field that the Web server is not configured to accept.

这个时候,我们就要用CURLOPT_USERPWD来进行验证了

  1. <?php  
  2.  $ch = curl_init();  
  3.  curl_setopt($ch, CURLOPT_URL, "http://club-china");  
  4.  /*CURLOPT_USERPWD主要用来破解页面访问控制的 
  5.  *例如平时我们所以htpasswd产生页面控制等。*/  
  6.  //curl_setopt($ch, CURLOPT_USERPWD, '231144:2091XTAjmd=');  
  7.  curl_setopt($ch, CURLOPT_HTTPGET, 1);  
  8.  curl_setopt($ch, CURLOPT_REFERER, "http://club-china");  
  9.  curl_setopt($ch, CURLOPT_HEADER, 0);  
  10.  $result=curl_exec($ch);  
  11.  curl_close($ch);  
  12.  ?>  

5,模拟登录到sina

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

  1. <?php   
  2.   
  3. function checklogin( $user$password )  
  4.  {  
  5.  if ( emptyempty$user ) || emptyempty$password ) )  
  6.  {  
  7.  return 0;  
  8.  }  
  9.  $ch = curl_init( );  
  10.  curl_setopt( $ch, CURLOPT_REFERER, "http://mail.sina.com.cn/index.html" );  
  11.  curl_setopt( $ch, CURLOPT_HEADER, true );  
  12.  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );  
  13.  curl_setopt( $ch, CURLOPT_USERAGENT, USERAGENT );  
  14.  curl_setopt( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );  
  15.  curl_setopt( $ch, CURLOPT_TIMEOUT, TIMEOUT );  
  16.  curl_setopt( $ch, CURLOPT_URL, "http://mail.sina.com.cn/cgi-bin/login.cgi" );  
  17.  curl_setopt( $ch, CURLOPT_POST, true );  
  18.  curl_setopt( $ch, CURLOPT_POSTFIELDS, "&logintype=uid&u=".urlencode( $user )."&psw=".$password );  
  19.  $contents = curl_exec( $ch );  
  20.  curl_close( $ch );  
  21.  if ( !preg_match( "/Location: (.*)\\/cgi\\/index\\.php\\?check_time=(.*)\n/"$contents$matches ) )  
  22.  {  
  23.  return 0;  
  24.  }else{  
  25.  return 1;  
  26.  }  
  27.  }   
  28.   
  29.  define( "USERAGENT"$_SERVER['HTTP_USER_AGENT'] );  
  30.  define( "COOKIEJAR", tempnam( "/tmp""cookie" ) );  
  31.  define( "TIMEOUT", 500 );   
  32.   
  33.  echo checklogin("zhangying215","xtaj227");  
  34.  ?>  

打开/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



页面访问控制的3种方法

来源:http://blog.51yip.com/apachenginx/1051.html

我们经常会看到这种现象,看下图

apache 页面访问控制

apache 页面访问控制

为什么要进行这样的控制呢,给不同的人看不同的东西,对信息进行保护,虽然这种保护比较低级,多多少少还是有点用的。

一,用htpasswd命令,产生权限控制文件

  1. [zhangy@BlackGhost test]$ htpasswd -c ./access tank  //生成一个密码文件 ,-c是新建一个文件  htpasswd -h可查看  
  2. New password:            //提示输入密码  
  3. Re-type new password:        //重复密码  
  4. Adding password for user tank  
  5. [zhangy@BlackGhost test]$ cat access    //查看一下密码文件  
  6. tank:Uj5B3qIF/BNdI      //用户名是明文的,密码是加密的。  

到这儿密码文件是生成好了。

二,页面访问控制方法

1,能过修改httpd.conf或者是httpd-vhosts.conf来进行配置

  1. listen 10004  
  2. NameVirtualHost *:10004  
  3. <VirtualHost *:10004>  
  4.  DocumentRoot "/home/zhangy/www/test"  
  5.  ServerName *:10004  
  6.  BandwidthModule On  
  7.  ForceBandWidthModule On  
  8.  Bandwidth all 1024000  
  9.  MinBandwidth all 50000  
  10.  LargeFileLimit * 500 50000  
  11.  MaxConnection all 2  
  12.   
  13.  ErrorLog "/home/zhangy/apache/blog.51yip.com.com-error.log"  
  14.  CustomLog "/home/zhangy/apache/blog.51yip.com-access.log" common  
  15. //看一下,下面的配置  
  16.  <Directory /home/zhangy/www/test>  
  17.  AuthType Basic  
  18.  AuthName "access test"  
  19.  AuthUserFile /home/zhangy/www/test/access  
  20.  Require valid-user  
  21.  </Directory>  
  22.   
  23. </VirtualHost>  

2,我们可以利用.htaccess文件来进行控制

在test的根目录下面建一个.htaccess的文件

  1. [zhangy@BlackGhost test]$ vi .htaccess   //打开个文件 ,添加权限内容  
  2. [zhangy@BlackGhost test]$ cat .htaccess  //下面就是.htaccess的内容  
  3.  AuthType Basic  
  4.  AuthName "access test"  
  5.  AuthUserFile /home/zhangy/www/test/access  
  6.  Require valid-user  

如果要给很多人设置不同的用户名和密码,使用AuthGroupFile设置选项比较方便

3,不用密码文件,也可以进行访问控制

  1. define('ADMIN_USERNAME','tank');     // Admin Username  
  2. define('ADMIN_PASSWORD','tank');      // Admin Password  
  3.   
  4. //log check  
  5. if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||  
  6.  $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {  
  7.  Header("WWW-Authenticate: Basic realm=\"access test\"");  
  8.  Header("HTTP/1.0 401 Unauthorized");  
  9.   
  10.  echo <<<EOB  
  11.  <html><body>  
  12.  <h1>Rejected!</h1>  
  13.  <big>Wrong Username or Password!</big>  
  14.  </body></html>  
  15. EOB;  
  16.  exit;  
  17. }  

上面用的是php的方法,其他语言我想也有。您可以把上面的这段代码写成一个文件,进行共用包涵,也可以把它封装到底基,这样不管访问什么页面,都可以进行访问控制。

  评论这张
 
阅读(489)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017