简介

通过HttpClient获取网页数据源,通过Jsoup解析数据。先模拟登录,再获取信息。模拟浏览器正常操作,封装请求头信息获取SESSIONID。模拟登录成功后切勿断开会话,依赖登录请求得到的Cookie进行二次请求。请求信息时需打开谷歌浏览器或Fiddler抓包查看参数及请求头信息。

Maven

        <dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.8.0</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20160810</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.58</version></dependency>

基本步骤

1.获取exponent、modulus生成公钥进行密码加密

2.爬虫爬取csrftoken校验

3.添加Post参数模拟浏览器登录获取Cookie(SESSIONID)

4.二次请求

源代码

Util

package club.zstuca.util;import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;import javax.crypto.Cipher;public class RSAUtil {private static Map<Integer, String> keyMap = new HashMap<Integer, String>();  //用于封装随机产生的公钥与私钥/** * 随机生成密钥对 * @throws NoSuchAlgorithmException */  public static void genKeyPair() throws NoSuchAlgorithmException {  // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  // 初始化密钥对生成器,密钥大小为96-1024位  keyPairGen.initialize(1024,new SecureRandom());  // 生成一个密钥对,保存在keyPair中  KeyPair keyPair = keyPairGen.generateKeyPair();  RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私钥  RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公钥  String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded()));  // 得到私钥字符串  String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded())));  // 将公钥和私钥保存到MapkeyMap.put(0,publicKeyString);  //0表示公钥keyMap.put(1,privateKeyString);  //1表示私钥}  /** * RSA公钥加密 *  * @param str *            加密字符串* @param publicKey *            公钥 * @return 密文 * @throws Exception *             加密过程中的异常信息 */  public static String encryptByX509EncodedKeySpec( String str, String publicKey ) throws Exception{//base64编码的公钥byte[] decoded = Base64.getDecoder().decode(publicKey.getBytes("UTF-8"));RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));return outStr;} /** * RSA公钥加密 *  * @param str *            加密字符串* @param modulus *            模数 * @param publicExponent*            公众指数        * @return 密文 * @throws Exception *             加密过程中的异常信息 */  public static String encryptByRSAPublicKeySpec( String str, String modulus, String publicExponent ) throws Exception{//base64编码的公钥RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger(1,Base64.getDecoder().decode(modulus.getBytes("UTF-8"))),new BigInteger(1,Base64.getDecoder().decode(publicExponent.getBytes("UTF-8")))));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));return outStr;} /** * RSA私钥解密*  * @param str *            加密字符串* @param privateKey *            私钥 * @return 铭文* @throws Exception *             解密过程中的异常信息 */  public static String decryptByPKCS8EncodedKeySpec(String str, String privateKey) throws Exception{//64位解码加密后的字符串byte[] inputByte = Base64.getDecoder().decode(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64.getDecoder().decode(privateKey.getBytes("UTF-8"));  RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));  //RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;}
}

Main 

package cn.edu.newedu;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.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import com.alibaba.fastjson.JSON;import cn.edu.zstu.beans.Grade;
import cn.edu.zstu.beans.Course;
import cn.edu.zstu.beans.Exam;
import cn.edu.zstu.util.RSAUtil;import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;public class ZFsoft {public static void main(String[] args) {ZFsoft zFsoft=new ZFsoft();zFsoft.login("2018329621200","XXXXXX");List<Course>courseList=zFsoft.checkCourse("2019","12");for(Course course:courseList){System.out.println(course);}System.out.println(courseList.size());List<Grade>gradeList=zFsoft.checkScore("","");for(Grade grade:gradeList){System.out.println(grade);}System.out.println(gradeList.size());List<Exam>examList=zFsoft.checkExam("","");for(Exam exam:examList){System.out.println(exam);}System.out.println(examList.size());zFsoft.logout();}//登录URLprivate final String LOGIN_URL="http://XXXXXX.zstu.edu.cn/jwglxt/xtgl/login_slogin.html?language=zh_CN&_t=";//RSA URLprivate final String PUBLICKEY_URL="http://XXXXXX.zstu.edu.cn/jwglxt/xtgl/login_getPublicKey.html?time=";//退出URLprivate final String LOGOUT_URL="http://XXXXXX.zstu.edu.cn/jwglxt/logout?login_type=&t=";//课程URLprivate final String CHECK_COURSE_URL="http://XXXXXX.zstu.edu.cn/jwglxt/kbcx/xskbcx_cxXsKb.html?doType=query&gnmkdm=N2151";//成绩URLprivate final String CHECK_GRADE_URL="http://XXXXXX.zstu.edu.cn/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005";//考试URLprivate final String CHECK_EXAM_URL="http://XXXXXX.zstu.edu.cn/jwglxt/kwgl/kscx_cxXsksxxIndex.html?doType=query&gnmkdm=N358105";private CloseableHttpClient httpClient;private BasicCookieStore basicCookieStore;public ZFsoft(){basicCookieStore=new BasicCookieStore();httpClient= HttpClients.custom().setDefaultCookieStore(basicCookieStore).build();}/*** 密码加密 RSA* @param password* @return*/private String encryp(String password){//一、获取 exponent modulus 生成公钥String exponent=null,modulus=null;HttpGet gpkHttpGet=new HttpGet(PUBLICKEY_URL+new Date().getTime());gpkHttpGet.setHeader("Accept","application/json, text/javascript, */*; q=0.01");gpkHttpGet.setHeader("Accept-Encoding","gzip, deflate");gpkHttpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");gpkHttpGet.setHeader("Connection","keep-alive");gpkHttpGet.setHeader("Host","jwglxt.zstu.edu.cn");gpkHttpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");gpkHttpGet.setHeader("X-Requested-With","XMLHttpRequest");CloseableHttpResponse gpkResponse=null;try {gpkResponse = httpClient.execute(gpkHttpGet);if (gpkResponse.getStatusLine().getStatusCode() == 200) {String emJson = EntityUtils.toString(gpkResponse.getEntity(), "utf8");JSONObject jsonObject = new JSONObject(emJson);exponent = jsonObject.getString("exponent");modulus = jsonObject.getString("modulus");}}catch (Exception e){e.printStackTrace();}finally {try {gpkResponse.close();} catch (IOException e) {e.printStackTrace();}}//二、根据公钥进行密码加密System.out.println(modulus);System.out.println(exponent);System.out.println(password);try {password=RSAUtil.encryptByRSAPublicKeySpec(password, modulus, exponent);} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}System.out.println(password);return password;}/*** 获取Token* @param timestamp* @return*/private String crawlCsrfToken(String timestamp){String csrftoken=null;HttpGet csrftokenHttpGet=new HttpGet(LOGIN_URL+timestamp);CloseableHttpResponse csrftokenResponse=null;try {csrftokenResponse = httpClient.execute(csrftokenHttpGet);if (csrftokenResponse.getStatusLine().getStatusCode() == 200) {Document csrftokenDoc = Jsoup.parse(EntityUtils.toString(csrftokenResponse.getEntity(), "utf8"));csrftoken = csrftokenDoc.select(".col-sm-4").select(".sl_log_rt").select("input[id=csrftoken]").first().attr("value");return csrftoken;}}catch (Exception e){e.printStackTrace();}finally {try {csrftokenResponse.close();} catch (IOException e) {e.printStackTrace();}}return null;}/*** 模拟登录* @param username* @param password* @return*/public ZFsoft login(String username,String password){String timestamp=""+new Date().getTime();HttpPost loginHttpPost=new HttpPost(LOGIN_URL+timestamp);loginHttpPost.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");loginHttpPost.setHeader("Accept-Encoding","gzip, deflate");loginHttpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9");loginHttpPost.setHeader("Cache-Control","max-age=0");loginHttpPost.setHeader("Connection","keep-alive");loginHttpPost.setHeader("Content-Type","application/x-www-form-urlencoded");loginHttpPost.setHeader("Host","jwglxt.zstu.edu.cn");loginHttpPost.setHeader("Origin","http://jwglxt.zstu.edu.cn");loginHttpPost.setHeader("Upgrade-Insecure-Requests","1");loginHttpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");List<NameValuePair> loginParams=new ArrayList<NameValuePair>();password=this.encryp(password);String csrftoken=this.crawlCsrfToken(timestamp);loginParams.add(new BasicNameValuePair("csrftoken",csrftoken));loginParams.add(new BasicNameValuePair("yhm",username));loginParams.add(new BasicNameValuePair("mm",password));loginParams.add(new BasicNameValuePair("mm",password));CloseableHttpResponse loginResponse=null;try {loginHttpPost.setEntity(new UrlEncodedFormEntity(loginParams, "utf8"));loginResponse = httpClient.execute(loginHttpPost);List<Cookie>cookies=basicCookieStore.getCookies();if(cookies.isEmpty()){System.out.println("The Cookie Is None.");}else {for(Cookie cookie:cookies){System.out.println(cookie.getName() + " : " + cookie.getValue());}}}catch (Exception e){e.printStackTrace();}return this;}/*** 退出* @return*/public boolean logout() {String timestamp=""+new Date().getTime();HttpPost loginHttpPost=new HttpPost(LOGOUT_URL+timestamp);loginHttpPost.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");loginHttpPost.setHeader("Accept-Encoding","gzip, deflate");loginHttpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9");loginHttpPost.setHeader("Cache-Control","max-age=0");loginHttpPost.setHeader("Connection","keep-alive");loginHttpPost.setHeader("Content-Type","application/x-www-form-urlencoded");loginHttpPost.setHeader("Host","jwglxt.zstu.edu.cn");loginHttpPost.setHeader("Origin","http://jwglxt.zstu.edu.cn");loginHttpPost.setHeader("Upgrade-Insecure-Requests","1");loginHttpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");CloseableHttpResponse loginResponse=null;try {loginResponse = httpClient.execute(loginHttpPost);List<Cookie>cookies=basicCookieStore.getCookies();if(cookies.isEmpty()){System.out.println("The Cookie Is None.");}else {for(Cookie cookie:cookies){System.out.println(cookie.getName() + " : " + cookie.getValue());}}}catch (Exception e){e.printStackTrace();}return true;}public List<Course> checkCourse(String xnm,String xqm){HttpPost courseHttpPost=new HttpPost(CHECK_COURSE_URL);courseHttpPost.setHeader("Accept","application/json, text/javascript, */*; q=0.01");courseHttpPost.setHeader("Accept-Encoding","gzip, deflate");courseHttpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9");courseHttpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");courseHttpPost.setHeader("Host","jwglxt.zstu.edu.cn");courseHttpPost.setHeader("Origin","http://jwglxt.zstu.edu.cn");courseHttpPost.setHeader("Proxy-Connection","keep-alive");courseHttpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");courseHttpPost.setHeader("X-Requested-With","XMLHttpRequest");List<NameValuePair>courseParams=new ArrayList<NameValuePair>();courseParams.add(new BasicNameValuePair("xnm",xnm));courseParams.add(new BasicNameValuePair("xqm",xqm));List<Course> res = new LinkedList<>();try {courseHttpPost.setEntity(new UrlEncodedFormEntity(courseParams, "utf8"));CloseableHttpResponse courseResponse = httpClient.execute(courseHttpPost);if (courseResponse.getStatusLine().getStatusCode() == 200) {if (courseResponse.getEntity() != null) {String courseJson = EntityUtils.toString(courseResponse.getEntity(), "utf8");System.out.print(courseJson);if(courseResponse==null||courseResponse.equals("")|| !JSON.isValid(courseJson)){return res;}JSONObject jsonObject = new JSONObject(courseJson);JSONArray jsonArray = jsonObject.getJSONArray("kbList");for (int i = 0; i < jsonArray.length(); ++i) {JSONObject item = (JSONObject) jsonArray.get(i);Course course= new Course();course.setDay(item.getString("xqjmc"));course.setPeriod(item.getString("jc"));course.setLength(item.getString("month"));course.setName(item.getString("kcmc"));course.setType("一般课");course.setTeacher(item.getString("xm"));course.setRoom(item.getString("cdmc"));course.setWeek(item.getString("zcd"));res.add(course);}jsonArray = jsonObject.getJSONArray("sjkList");for (int i = 0; i < jsonArray.length(); ++i) {JSONObject item = (JSONObject) jsonArray.get(i);Course course= new Course();course.setName(item.getString("sjkcgs"));course.setType("实践课");course.setTeacher(item.getString("sjkcgs"));res.add(course);}return  res;}}}catch (Exception e){e.printStackTrace();}return null;}/*** 查看成绩* @param xnm* @param xqm* @return*/public List<Grade> checkScore(String xnm,String xqm){HttpPost scoreHttpPost=new HttpPost(CHECK_GRADE_URL);scoreHttpPost.setHeader("Accept","application/json, text/javascript, */*; q=0.01");scoreHttpPost.setHeader("Accept-Encoding","gzip, deflate");scoreHttpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9");scoreHttpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");scoreHttpPost.setHeader("Host","jwglxt.zstu.edu.cn");scoreHttpPost.setHeader("Origin","http://jwglxt.zstu.edu.cn");scoreHttpPost.setHeader("Proxy-Connection","keep-alive");scoreHttpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");scoreHttpPost.setHeader("X-Requested-With","XMLHttpRequest");List<NameValuePair>scoreParams=new ArrayList<NameValuePair>();scoreParams.add(new BasicNameValuePair("xnm",xnm));scoreParams.add(new BasicNameValuePair("xqm",xqm));scoreParams.add(new BasicNameValuePair("_search","false"));scoreParams.add(new BasicNameValuePair("nd",""+new Date().getTime()));scoreParams.add(new BasicNameValuePair("queryModel.showCount","100"));scoreParams.add(new BasicNameValuePair("queryModel.currentPage","1"));scoreParams.add(new BasicNameValuePair("queryModel.sortName",""));scoreParams.add(new BasicNameValuePair("queryModel.sortOrder","asc"));scoreParams.add(new BasicNameValuePair("time","1"));List<Grade> res = new LinkedList<Grade>();try {scoreHttpPost.setEntity(new UrlEncodedFormEntity(scoreParams, "utf8"));CloseableHttpResponse scoreResponse = httpClient.execute(scoreHttpPost);if (scoreResponse.getStatusLine().getStatusCode() == 200) {if (scoreResponse.getEntity() != null) {String scoreJson = EntityUtils.toString(scoreResponse.getEntity(), "utf8");System.out.print(scoreJson);JSONObject jsonObject = new JSONObject(scoreJson);JSONArray jsonArray = jsonObject.getJSONArray("items");for (int i = 0; i < jsonArray.length(); ++i) {Grade grade = new Grade();JSONObject item = (JSONObject) jsonArray.get(i);try {grade.setYear(item.getString("xnmmc"));grade.setTerm(item.getString("xqm"));grade.setCourseName(item.getString("kcmc"));grade.setCredit(item.getString("xf"));String gr = "";// 有补考成绩 则算补考成绩gr = new String(item.getString("ksxz").getBytes("UTF-8")).replace("?","");if(!gr.equals("")) {grade.setGrade(item.getString("cj"));}else {grade.setGrade(item.getString("cj"));}grade.setGpa(item.getString("jd"));res.add(grade);}catch(Exception e) {e.printStackTrace();}}return  res;}}}catch (Exception e){e.printStackTrace();}return null;}public List<Exam> checkExam(String xnm,String xqm){HttpPost examHttpPost=new HttpPost(CHECK_EXAM_URL);examHttpPost.setHeader("Accept","application/json, text/javascript, */*; q=0.01");examHttpPost.setHeader("Accept-Encoding","gzip, deflate");examHttpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9");examHttpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");examHttpPost.setHeader("Host","jwglxt.zstu.edu.cn");examHttpPost.setHeader("Origin","http://jwglxt.zstu.edu.cn");examHttpPost.setHeader("Proxy-Connection","keep-alive");examHttpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");examHttpPost.setHeader("X-Requested-With","XMLHttpRequest");List<NameValuePair>examParams=new ArrayList<NameValuePair>();examParams.add(new BasicNameValuePair("xnm","2019"));examParams.add(new BasicNameValuePair("xqm","3"));examParams.add(new BasicNameValuePair("_search","false"));examParams.add(new BasicNameValuePair("ksmcdmb_id","2019-20201QN"));examParams.add(new BasicNameValuePair("kch",""));examParams.add(new BasicNameValuePair("kc",""));examParams.add(new BasicNameValuePair("ksrq",""));examParams.add(new BasicNameValuePair("nd",""+new Date().getTime()));examParams.add(new BasicNameValuePair("queryModel.showCount","100"));examParams.add(new BasicNameValuePair("queryModel.currentPage","1"));examParams.add(new BasicNameValuePair("queryModel.sortName",""));examParams.add(new BasicNameValuePair("queryModel.sortOrder","asc"));examParams.add(new BasicNameValuePair("time","1"));List<Exam> res = new LinkedList<>();try {examHttpPost.setEntity(new UrlEncodedFormEntity(examParams, "utf8"));CloseableHttpResponse examResponse = httpClient.execute(examHttpPost);if (examResponse.getStatusLine().getStatusCode() == 200) {if (examResponse.getEntity() != null) {String examJson = EntityUtils.toString(examResponse.getEntity(), "utf8");System.out.print(examJson);if(examJson==null||examJson.equals("")|| !JSON.isValid(examJson)){return res;}JSONObject jsonObject = new JSONObject(examJson);JSONArray jsonArray = jsonObject.getJSONArray("items");for (int i = 0; i < jsonArray.length(); ++i) {Exam exam = new Exam();JSONObject item = (JSONObject) jsonArray.get(i);exam.setCourseName(item.getString("kcmc"));exam.setSeatNumber(item.getString("zwh"));exam.setExamPlace(item.getString("cdmc"));exam.setExamTime(item.getString("kssj"));res.add(exam);}return  res;}}}catch (Exception e){e.printStackTrace();}return null;}
}

运行结果

Cookies:

课程:

成绩:

考试:

参考文章

https://www.cnblogs.com/hbsdljz/p/10874099.html

https://shentuzhigang.blog.csdn.net/article/details/103995547

https://shentuzhigang.blog.csdn.net/article/details/103996741

JAVA——基于HttpClient的正方教务系统[1999-2020]模拟登录|模拟退出|课程查询|成绩查询|考试查询基本解决方案相关推荐

  1. JAVA——基于HttpClient的正方教务系统[1999-2020]模拟登录基本解决方案

    简介 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录,再获取信息.模拟浏览器正常操作,封装请求头信息获取SESSIONID.模拟登录成功后切勿断开会话,依赖登录请求得到的C ...

  2. 基于HttpClient的正方教务系统模拟登录(带验证码)

    PS:恩,由于最近在学web和简单的http协议,所以心血来潮想用java写个爬虫来爬取学校官网(正方教务系统)个人主页的基础信息(课程信息.成绩--),其实在之前学过java基础教程的时候就可以写的 ...

  3. 新版正方教务系统Java爬取_正方教务系统成绩爬取(仅个人)+tk可视化

    [JavaScript] 纯文本查看 复制代码var CryptoJS = CryptoJS || function (u, p) { var d = {}, l = d.lib = {}, s = ...

  4. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案

    问题分析 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录统一身份认证平台,再通过单点登录方式登录正方教务系统,最后获取相关信息.模拟浏览器正常操作,封装请求头信息获取SES ...

  5. JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解

    目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...

  6. java模拟登录新版正方_java 模拟登陆正方教务系统

    比较懒,主要说一下思路.. 1.首先正方教务系统的验证码当你不去向服务器申请的时候,可以直接无视它不需要去输入验证码.可以通过浏览器屏蔽学校教务系统的图片就可以直接输入账号密码回车进去.. 2.通过抓 ...

  7. 我的第一个开源项目:Java爬虫爬取旧版正方教务系统课程表、成绩表

    Java爬虫爬取旧版正方教务系统课程表.成绩表 一.项目展示 1.正方教务系统 首页 2.爬虫系统 首页: 成绩查询: 课表查询: 二.项目实现 1.爬取思路描述 无论是成绩查询或课表查询亦或者其它的 ...

  8. Java--使用httpClient模拟登陆正方教务系统获取课表

    最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...

  9. 用java模拟登录正方教务系统,抓取课表和个人成绩等数据

    之前学了一些java web的编程,理解了web应用的原理后,就突然想到,可以用java模拟登录吉珠的教务系统,然后爬取里面的课表.成绩.个人信息等等数据,然后就可以写成一个简易的课表APP. 一.第 ...

最新文章

  1. 配置 L2 Population - 每天5分钟玩转 OpenStack(114)
  2. 在 SQL Server 2K 中实现 大小写敏感的查询条件(WHERE ...),类似 Access(VB) 的 StrComp 函数...
  3. 根据Android架构分层推荐开发书籍
  4. php将中文插入数据库出现乱码
  5. java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别
  6. H5活动产品设计指南基础版
  7. POI导出Word插入复选框
  8. Spring mvc @CookieValue
  9. 数据结构 二叉树的建立,遍历
  10. 申通完美支撑“双11”亿级包裹背后的云基础设施
  11. 关于Oracle的PARALLEL_MAX_SEVERS参数
  12. 计算机主机三短一长,电脑主机出现三短一长响声怎么办
  13. UITextView内边距设置
  14. 来自量子世界的新技术---算法篇
  15. vscode 逗号不换行_苹果手机九宫格怎么换行 苹果手机九宫格换行操作步骤
  16. 51单片机控制小舵机
  17. 从逃离到成为游戏开发,40岁了我才学会编程
  18. 手机app定制开发流程图
  19. 第十三章 使用系统监视器 - 系统监视器
  20. 34.SAP中动态安全库存的计算

热门文章

  1. 蓝牙连接不上车要hfp_科普|蓝牙耳机小知识,这些都不知道难怪你选不到好的蓝牙耳机...
  2. 充电桩服务器协议,充电桩与云服务器通信协议
  3. flink 3-转换
  4. 数组排序思想———选择排序
  5. 虚拟机扩容后mysql无法使用_VMWARE 扩容踩坑记
  6. 大学必须掌握的计算机技巧,大学生必须掌握的电脑办公技巧
  7. 山西省职高计算机分数线,2020年山西五年制高职和普通中专录取分数线
  8. 织梦图集php,织梦图集在首页、列表页、内容页调用图集所有图片及注释的方法...
  9. 十、深入Java字符串(下篇)
  10. 微信小程序学习笔记(六)