当前位置:首页 > PHP教程 > php高级应用 > 列表

php中CURL实现模拟登录并采集数据

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-28 11:04:35 浏览: 评论:0 

在php中采集我们用的是简单的采集方式,例如file_get_contents就无法做到了,但是如果想模拟登录用户并采集利用它就没办法了,我们可利用CURL函数来实现模拟登录并采集数据.

这里要说一些,默认情况下,PHP的CURL功能是没有开启的,所以你要自己去开启这个功能,需要在php.ini中把 ;extension= php_curl.dll 前面的  " ; " 号去掉!!!

我讲讲昨天晚上的程序吧,虽然最后没有成功,但是还是学习到一些东西的,代码如下:

  1. $login="http://www.phpfensi.com/index.php?action=login"
  2. $post_file="user=××&pw=××"
  3. $cookie_file    =    tempnam('./temp','cookie');  
  4.  
  5. //创建一个具有唯一文件名的临时文件,若成功,则该函数返回新的临时文件名,若失败,则返回 false,代码如下: 
  6. $ch=curl_init($login_url); /////初始化一个CURL对象 
  7. curl_setopt($ch,CURLOPT_HEADER,0); 
  8. //开源代码phpfensi.com 
  9.  
  10. //如果你想把一个头包含在输出中,设置这个选项为一个非零值。 
  11.  
  12. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); ///设置不输出在浏览器上 
  13. curl_setopt($ch,CURLOPT_POST,1); 
  14.  
  15. //如果你想PHP去做一个正规的HTTP POST,设置这个选  项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。  
  16.  
  17. curl_setopt($ch,CURLOPT_POSTFIELDS,$post_file);  ////传递一个作为HTTP "POST"操作的所有数据的字符串。 
  18. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);  /////把返回来的cookie信息保存在$cookie_jar文件中 
  19. curl_exec($ch);///执行 
  20. curl_close($ch);////关闭 

上面已经完成了模拟登录的过程,下面要做的就是进入具有权限的页面了,要记得你现在已经登录了,你应该把登录的凭证cookie保存了起来,代码如下:

  1. $url="http://www.phpfensi.com/admin/××"
  2. $ch = curl_init($url); 
  3. curl_setopt($ch, CURLOPT_HEADER, 0); 
  4. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); 
  5.  
  6. //把这个页面显示在浏览器上,这里要特别注意!!就是如果把它显示在浏览器上的时候 下面的$contents 就会变成 一个布尔类型 true 
  7.   
  8. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
  9. $contents = curl_exec($ch); 

例2,代码如下:

  1. <?php 
  2.         $cookie_path = './'//设置cookie保存路径 
  3.  
  4.  
  5.         //-----登录要提交的表单数据--------------- 
  6.         $vars['username'] = '张三'
  7.          $vars['pwd'] = '123'
  8.          //------------------------------------- 
  9.         $method_post = true; 
  10.         //登录提交的url地址(表单中的action的绝对地址) 
  11.          $url = 'http://****.com/login'
  12.         //---------------------------- 
  13.  
  14.  
  15.          $ch = curl_init(); 
  16.         $params[CURLOPT_URL] = $url;    //请求url地址 
  17.         $params[CURLOPT_HEADER] = true; //是否返回响应头信息 
  18.         $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回 
  19.         $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向 
  20.         $params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'
  21.      
  22.         $postfields = ''
  23.         foreach ($vars as $key => $value){ 
  24.             $postfields .= urlencode($key) . '=' . urlencode($value) . '&';  
  25.         } 
  26.          
  27.         $params[CURLOPT_POST] = true; 
  28.         $params[CURLOPT_POSTFIELDS] = $postfields
  29.          
  30.         //判断是否有cookie,有的话直接使用 
  31.         if (isset($_COOKIE['cookie_jar']) && ($_COOKIE['cookie_jar'] || is_file($_COOKIE['cookie_jar']))) 
  32.         { 
  33.             $params[CURLOPT_COOKIEFILE] = $_COOKIE['cookie_jar']; //这里判断cookie 
  34.         } 
  35.         else 
  36.         { 
  37.             $cookie_jar = tempnam($cookie_path'cookie'); //产生一个cookie文件 
  38.             $params[CURLOPT_COOKIEJAR] = $cookie_jar//写入cookie信息 
  39.             setcookie('cookie_jar'$cookie_jar); //保存cookie路径 
  40.         } 
  41.         curl_setopt_array($ch$params); //传入curl参数 
  42.         $content = curl_exec($ch); //执行 
  43.  
  44.  
  45.         echo ' 
  46. ';        echo $content//输出登录结果 
  47.         /* 
  48.         //---------登录成功后再次请求其他地址,如果有多个可以循环执行--------- 
  49.         echo ' 
  50. -------------------------------------------------------------------------------- 
  51.  '; 
  52.         $nexturl = 'http://****.com/test'
  53.         $params[CURLOPT_URL] = $nexturl
  54.         $params[CURLOPT_POSTFIELDS] = ''
  55.         curl_setopt_array($ch$params); //传入curl参数 
  56.         $content = curl_exec($ch); //执行 
  57.         echo $content//输出请求结果 
  58.         //------------------------------------------------- 
  59.         */ 
  60.         curl_close($ch); //关闭连接 
  61.          
  62. ?> 

注:如果遇到无法请求https站点的情况,可能是因为无法验证证书或者域名,只要在curl_setopt_array前增加以下两项就可以了,代码如下:

$params[CURLOPT_SSL_VERIFYPEER] = false;

$params[CURLOPT_SSL_VERIFYHOST] = false;

Tags: CURL模拟登录 php采集数据

分享到: