爬虫之模拟强智系统登录
介绍
以强智教务系统为例,模拟登录,在登录成功后得到学号、姓名、学院等信息。使用 HttpClient+JSoup 完成。
简介
趁着周末有空,最近又在做爬虫相关的功能,就研究了一下 强智教务系统 ,模拟登录,在登录成功后得到学号、姓名、学院等信息。将写好的 Demo 也一起放在了码云。
分析强智系统
以广东培正学院强智教务系统为例: http://qzjw.peizheng.edu.cn/jsxsd/ 嗯,只有一个账户框和密码框,不需要去处理验证码。试着输入学号密码等,打开 F12 调试 需要找到一个叫 LoginToXk 的请求,这个是登录的 POST 请求,把登录信息提交后都在这里处理请求,成功后就会重定向到后台正确的地址。
往下翻,可以找到账户和密码的 key 值 需要的两个值的名称都有了。 请求地址: http://qzjw.peizheng.edu.cn/jsxsd/xk/LoginToXk 请求方式:PSOT 分别为:userAccount 、userPassword
还有一个不知道用途的 encoded
当然,我们还需要找一个后台的正确地址,因为这个仅仅是判断登录信息的 POST 请求,当请求成功之后后台就会重定向到强智教务系统的个人中心。
继续 F12 找,找到请求: xsMain_new.jsp?t1=1,调到 Response,查看响应结果。 要的信息都在这个请求了。 请求地址: http://qzjw.peizheng.edu.cn/jsxsd/framework/xsMain_new.jsp?t1=1 请求方式:GET
测试
既然要的信息都有了,先用 PostMan 来测试一下,如果 PostMan 测试通过的话那写代码才是正确的,如果 PostMan 都无法成功,那就肯定不行的。
步骤: 1.根据账户密码,去发起登录请求 请求地址: http://qzjw.peizheng.edu.cn/jsxsd/xk/LoginToXk 请求方式:PSOT 2.因为强智还使用的 JSP,所以基本都是 后端 Session 来存储用户信息,浏览器存入用户的 cookie,在下一次请求当中将 Cookie 放入请求头。
此处找到 PostMan 的 heade 信息:找到 Set-Cookie
3.如果登录成功的话,这一串就是后端返回的 Cookie 信息了。 拿到这个信息去继续请求: 请求地址: http://qzjw.peizheng.edu.cn/jsxsd/framework/xsMain_new.jsp?t1=1 请求方式:GET 但是结果... 返回来的信息,我仔细的对比了一下,跟登录页面是一模一样的。
失败了。
分析原因
基本思路是没有问题的,所以可能是漏了什么参数,或者是登录机制是采用了别的验证方式。 继续查看重定向的参数: 此处的 encoded 很可疑。
查看登录页面的源代码: encode 是一个隐藏域。
继续它的取值:
可以看到 encoded 的值是经过加密的,加密的方法为 encodeInp(obj)
推测就是此处的参数没明白,所以失败。
继续查看,发现 encodeInp(obj)方法在一个 js 里,具体的处理加密机制在 common.js
行叭,破解是不可以破解的,这辈子都不会破解的。
但是: 这个 encoded 的 = ,之前貌似看过是 Base64 的加密方式。
找一个 base64 在线加密试了一下,确实是这个。 行,一模一样。
为了测试方便,我把在浏览器的 encoded 复制到 postman,结果证明这个尝试是正确的,这里就不演示了。
代码部分
1.创建一个 maven 工程,导入坐标
java
<!--Jsoup-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
<!--Lang3工具类-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!--HttpClient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<!--阿里巴巴 json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
准备工具类用于进行 Base64 加密。
```java package com.xiaomoyu.pz.utils;
import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;
/* * 基于Base64的加密和解密工具类 / public class Base64EncodeUtils {
/**
* 示例使用
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String str = "学号";
String pass = "密码";
String username = encryptBASE64(str.getBytes());
String password = encryptBASE64(pass.getBytes());
System.out.println(username+"%%%"+password);
}
/**
* BASE64解密
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* BASE64加密
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
}
```
登录方法:
```java package com.xiaomoyu.pz;
import com.xiaomoyu.pz.utils.Base64EncodeUtils; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair;
import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
/*
* 登录
/
public class LoginPz {
public static void main(String[] args) {
Map
param.put("encoded",encoded);
List<URI> redirectLocations = null;
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost("http://qzjw.peizheng.edu.cn/jsxsd/xk/LoginToXk");
//请求头
httpPost.addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
httpPost.addHeader("Cookie","application/x-www-form-urlencoded; charset=UTF-8");
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模拟表单登录
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
// 执行http请求
HttpClientContext context = HttpClientContext.create();
response = httpClient.execute(httpPost,context);
//获取Cookie信息,得到两个参数 JSESSIONID 、 BIGipServerpool_qzjw
List<Cookie> cookies = context.getCookieStore().getCookies();
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("name:"+name+","+value);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
为了方便,都写在主方法当中。 当运行这个方法时,可以得到两个参数: JSESSIONID 、 BIGipServerpool_qzjw
有了这两个参数,就相当于有了强智服务器识别你身份的钥匙,后续需要的各种操作,如查成绩,查信息,查课表,抢课,考勤等都可以使用。
只需要再后续的操作中,加入到请求头即可。
得到 JSESSIONID 、 BIGipServerpool_qzjw 后的使用实例: 注意此处需要修改 JSESSIONID 、和 BIGipServerpool_qzjw
```java package com.xiaomoyu.pz;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements;
/* * 登录后获取用户信息 * 相关解析HTMl的操作不是固定的 * 需要结合自己的需求来操作 * 此处仅作为演示。 / public class GetUserInfo {
public static void main(String[] args) {
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
HttpGet httpGet = new HttpGet("http://qzjw.peizheng.edu.cn/jsxsd/framework/xsMain_new.jsp?t1=1");
//增加头信息
//注意此处需要修改为正确的JSESSIONID 和 BIGipServerpool_qzjw
httpGet.addHeader("Cookie","JSESSIONID=; BIGipServerpool_qzjw=");
httpGet.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36");
httpGet.addHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
httpGet.addHeader("Connection","keep-alive");
//执行
CloseableHttpResponse response = httpClient.execute(httpGet);
String html = EntityUtils.toString(response.getEntity(), "utf8");
System.out.println("结果:"+html);
//解析html
Document parse = Jsoup.parse(html);
Elements select = parse.select("div.middletopttxlr");
Elements select1 = select.select("div.middletopdwxxcont");
String text = select1.text();
String[] s = text.split(" ");
String name = s[1];//姓名
String studentId = s[2];//学号
String department = s[3];//院系
String major = s[4];//专业
String stClass = s[5];//班级
System.out.println(name+","+studentId+","+department+","+major+","+stClass);
}catch (Exception e){
}
}
}
```
参考文献
- 基于Spark Streaming的反爬虫系统的设计与实现(西安电子科技大学·郭晋豫)
- 复合规则驱动聚焦爬虫系统的设计与实现(哈尔滨工业大学·刘强)
- 面向特定网页的Web爬虫的设计与实现(吉林大学·马慧)
- 分布式智能网络爬虫的设计与实现(中国科学院大学(工程管理与信息技术学院)·何国正)
- 基于增量式爬虫的搜索引擎系统的设计与实现(东北大学·韩逸)
- 基于Scrapy技术的数据采集系统的设计与实现(南京邮电大学·杨君)
- 基于网络爬虫的搜索引擎的设计与实现(湖北工业大学·冯丹)
- 分布式网络爬虫技术的研究与实现(哈尔滨工业大学·苏旋)
- 网络爬虫技术在云平台上的研究与实现(电子科技大学·刘小云)
- 面向应用商店的主题爬虫设计与实现(东南大学·韩进宾)
- 基于增量式爬虫的搜索引擎系统的设计与实现(东北大学·韩逸)
- 基于P2P的被动式网络爬虫系统(哈尔滨工业大学·马天明)
- 基于Docker集群的分布式爬虫系统设计与实现(哈尔滨工业大学·闵江松)
- 网络流量统计分析系统(吉林大学·石景龙)
- 搜索引擎中通用爬虫系统的研究与设计(吉林大学·高龙)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码导航 ,原文地址:https://bishedaima.com/yuanma/35968.html