【第22期】观点:IT 行业加班,到底有没有价值?

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】php中curl的详细解说

这几天在帮一些同学处理问题的时候,突然发现这些同学是使用file_get_contents()函数来采集页面内容的,貌似都没有curl的概念亦或是对这种工具特别不敏感, 本文我来给大家详细介绍下cU...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

php 使用curl模拟登录人人(校内)网的简单实例

http://www.jb51.net/article/86003.htm $login_url = 'http://passport.renren.com/PLogin.do';...

使用PHP-curl获取验证码并模拟登录教务系统

首先说一下这篇文章的需求,当我们在一些没有提供验证接口的系统中,需要验证用户身份的时候,就可能需要用户登录当前系统,从而确定该用户是当前系统的合法用户,校园的教务系统就是一个典型的例子,我们通过学生自...

PHP CURL模拟登录 获取数据

使用了curl 模拟登录 测试了公司网站 代码记录下来//模拟登录方法 function login_post($url,$cookie,$post){ $curl = curl_init();...

PHP用curl模拟登陆并采集后台数据

PHP用curl模拟登陆并采集后台数据步骤: 1、请求登陆,获取返回的保存身份信息的cookie,并存入指定cookie文件。见类login()方法 2、请求需身份验证的页面,带上cookie文件。见...

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

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

php模拟登陆正方管理系统

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

php curl 模拟登陆https

报错如下: 35-error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)

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

php简单爬虫使用登录账号密码爬取列表关于思路1.定义一个变量$data用来存放你想爬取网站的登录账号和密码以及是否‘记住密码’,此篇我以博客园为例 $data='input1=Dco4FpN...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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