php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统

原创 2015年11月21日 01:35:32

cookie维持客户端和服务器端的交互

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

登录过程

当我们打开登录界面时服务器便分配了一个session_id给浏览器来维持会话
这里写图片描述
输入用户名,密码以及验证码点击登录时,网页会把我们填的数据POST到服务器的一个地址中,服务器会先验证验证码是否正确,然后再验证用户名和密码。但是post的数据除了我们所填的数据,还存在一些隐藏的数据。我们用抓包工具把登录时post的数据抓来看看

这里写图片描述
这里写图片描述
当然我们也可以查看网页html代码来分析
这里写图片描述

验证码问题

当我们模拟登录时,我们需要post验证码,对于如何提交验证码
1.做验证码的图像识别
2.使用第三方的打码平台
3.把验证码分离出来,让用户自己填写
这里我采用第三种方式
这里写图片描述
我们很快便能发现验证码图片的链接,因此我们便可以轻易的分离出来使用,到此处,我们便可以开始编码进行模拟登录了

<?php
$act='';
define('SCRIPT_ROOT',dirname(__FILE__).'/');
if (isset($_REQUEST['act'])) {
   $act = trim($_REQUEST['act']);
}
$user = '';//用户名
$password = '';//密码
switch($act)
{
  case 'login':
      // 获取验证码
      $code = trim($_REQUEST['code']);       
      // $loginParams为curl模拟登录时post的参数
      $loginParams['__VIEWSTATE'] = 'dDwyODE2NTM0OTg7Oz6XQwtkC4IPj2mY5bsI42qRkaJNzw==';
      $loginParams['RadioButtonList1'] = '学生';
      $loginParams['TextBox2'] = $password;
      $loginParams['txtUserName'] = $user;
      $loginParams['Button1'] = '';
      $loginParams['lbLanguage'] = '';
      $loginParams['hidPdrs'] = '';
      $loginParams['hidsc'] = '';
      $loginParams['txtSecretCode'] = $code;        
      // $cookieFile 为加载验证码时保存的cookie文件名 
      $cookieFile = SCRIPT_ROOT.'cookie.tmp';
      // $targetUrl curl 提交的目标地址
      $targetUrl = 'http://202.116.160.170/default2.aspx';  
      // 参数重置
      $content = curlLogin($targetUrl, $cookieFile, $loginParams);
      echo $content;
      break;
      case 'authcode':
      // Content-Type 验证码的图片类型
      header('Content-Type:image/png charset=gb2312');
      showAuthcode('http://202.116.160.170/CheckCode.aspx');
      exit;
     break;
}


function curlLogin($url, $cookieFile, $loginParams)
{   
    $user = '';//用户名
    $password = '';//密码
    $ch = curl_init($url);
    curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile); //同时发送Cookie
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);//设定返回的数据是否自动显示
    curl_setopt($ch, CURLOPT_HEADER, 0);//设定是否显示头信 息
    curl_setopt($ch, CURLOPT_NOBODY, false);//设定是否输出页面 内容
    curl_setopt($ch,CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch,CURLOPT_POSTFIELDS, $loginParams); //提交查询信息
    curl_exec($ch);//返回结果
    curl_close($ch); //关闭
    $curl2=curl_init();
    curl_setopt ($curl2,CURLOPT_REFERER,'http://202.116.160.170/xs_main.aspx?xh='.$user.'#a');
    curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookieFile); 
     curl_setopt($curl2, CURLOPT_HEADER, false); 
     curl_setopt($curl2, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl2, CURLOPT_TIMEOUT, 20); 
     curl_setopt($curl2, CURLOPT_AUTOREFERER, true); 
     curl_setopt($curl2, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($curl2, CURLOPT_URL, 'http://202.116.160.170/xskbcx.aspx?xh='.$user);//登陆后要从哪个页面获取信息
     $en_contents=mb_convert_encoding( curl_exec($curl2),'utf-8', array('Unicode','ASCII','GB2312','GBK','UTF-8')); 
     preg_match_all('/<span id="Label[^>]*>(.*)<\/span>/isU',$en_contents,$out);
     var_dump($out);
     $student = explode(':', $out[1][6]);
     $studentInfo[0] = $student[1];
     $student = explode(':', $out[1][5]);
     $studentInfo[1] = $student[1];
     $student = explode(':', $out[1][2]);
     $studentInfo[2] = substr(trim($student[1]), 0,4);
     var_dump($studentInfo);
     preg_match_all('/<table id="Table1"[\w\W]*?>([\w\W]*?)<\/table>/',$en_contents,$out);
     $table = $out[0][0]; 
     preg_match_all('/<td [\w\W]*?>([\w\W]*?)<\/td>/',$table,$out);
     $td = $out[1];
     $length = count($td);
     //获得课程列表
     for ($i=0; $i < $length; $i++) {
       $td[$i] = str_replace("<br>", "", $td[$i]);
       $reg = "/{(.*)}/";
       if (!preg_match_all($reg, $td[$i], $matches)) {
         unset($td[$i]);
       }
     }
     $td = array_values($td); //将课程列表数组重新索引
     $tdLength = count($td);
     //将课表转换成数组形式
     echo "<pre>";
     var_dump($td);
     curl_close($curl2);
}

/**
 * 加载目标网站图片验证码
 * string $authcode_url 目标网站验证码地址
 */
function showAuthcode( $authcode_url )
{
    $cookieFile = SCRIPT_ROOT.'cookie.tmp';
    $ch = curl_init($authcode_url);
    curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile); // 把返回来的cookie信息保存在文件中
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $content =curl_exec($ch);
    var_dump($cookieFile);
    curl_close($ch);
}
?>
<iframe src="?act=authcode" style='width: 100px; height:40px ' frameborder=0 ></iframe>
<form>
<input type="hidden" name="act" value="login">
<input type="text" name="code" />
<input type="submit" name="submit" >
</form>

这里写图片描述
这里写图片描述

个人博客:http://www.javaknowledge.cn/?p=59

【CURL】模拟登录网站并获取用户信息

模拟登录网站并获取用户信息前言这次来做的是通过代码的方式,模拟登录秒拍官网,获取登录用户的信息。前后端分离本文的标题是CURL,传统的网站是PHP代码直接渲染项目视图,通过表单提交到控制器直接进行数据...

php:curl 模拟ajax登陆53后台 -1(模拟登陆)

登陆53后台,利用curl模拟ajax请求登陆,主要需要在头信息中添加ajax的标识和操作cookie...

php模拟登陆正方管理系统

因为毕设需要学生和老师的数据,所以研究了一下正方系统的爬取,使用的是tp框架,所以源代码就以tp为例,如果你用的不是tp,那也只需要修改几个地方就可以.如果看完这篇博客后,还有什么疑问,可以在下方留言...

php后台“爬虫”模拟登录第三方系统(一)---cURL的介绍

一.相关知识介绍在服务器后台使用爬虫对第三方进行模拟登录,登录后可进行数据收集。也可以作为第三方登录,用处之多,我便不做细讲。 所具备的的知识: 1.curl知识 2.sesson和cookie...
  • liu_c_y
  • liu_c_y
  • 2015年11月20日 13:00
  • 2704

PHP通过CURL模拟登录并获取数据

/*通过CURL模拟登录并获取数据 一些网站需要权限认证,必须登录网站后,才能有效地抓取网页并采集内容, 这就需要curl来设置cookie完成模拟登录网页,php的curl在抓取网页内容方 面...

php简单爬虫使用登录账号密码爬取列表(爬虫二篇)

php简单爬虫使用登录账号密码爬取列表关于思路1.定义一个变量$data用来存放你想爬取网站的登录账号和密码以及是否‘记住密码’,此篇我以博客园为例 $data='input1=Dco4FpN...

浅谈方正教务模拟登录实现

关于模拟登录教务系统抓取成绩存在的问题及解决措施。

python爬虫 模拟登陆

最近在学习python爬虫,前几天接触到模拟登陆这一块,其实之前就有接触过,但时间有点久远就遗忘了。在看了汪海的[Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)这篇文章后...

用curl模拟登陆获取页面信息以及相关知识点

今天使用curl做了模拟登陆,之前没有接触过curl,也并不知道有这个东西,下面简要谈谈我在做这个模拟登陆过程中get 到的技能以及了解到的知识:      1、CURL:curl是利用URL语法...
  • v587_lu
  • v587_lu
  • 2016年01月11日 16:33
  • 1803

PHP_CURL1之模拟POST登陆

CURL简介: CURL允许你与各种的服务器使用各种类型的协议进行连接和通讯,目前支持的协议包括:http、https、ftp、gopher、telnet、dict、file、ldap,同时也支持HT...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统
举报原因:
原因补充:

(最多只允许输入30个字)