闲来无事- -就爬取了学校的教务处系统的课表试试水
如果有不懂的可以先了解post,get请求
利用java自定义发送post请求模拟登陆
利用java自定义发送get请求获取学校课表并保存
用 [TOC]
来生成目录:
利用java模拟post登陆:
package com.ccu.post;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import com.ccu.bao.write;
/**
* @author Post Method
*/
public class post {
static String ya;
static String cookie;
public static void sendPost1() {
//paramMap post请求参数
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("encoded", ya);
//url post请求网址
String url = "http://cdjwc.ccu.edu.cn/jsxsd/xk/LoginToXk";
//对网址空格的处理
url= url.replaceAll(" ", "%20");
PrintWriter out = null;
BufferedReader in = null;
String result = "";
StringBuffer sb = new StringBuffer();
//获取教务处的cookie进行对账号绑定
ccc cc = new ccc();
cookie = cc.getcookie();
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置请求属性
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
conn.setRequestProperty("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
conn.setRequestProperty("Connection","keep-alive");
conn.setRequestProperty("Content-Length","41");
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
conn.setRequestProperty("Cookie",cookie);
conn.setRequestProperty("Host","cdjwc.ccu.edu.cn");
conn.setRequestProperty("Referer","http://cdjwc.ccu.edu.cn/jsxsd/");
conn.setRequestProperty("Upgrade-Insecure-Requests","1");
conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0");
// conn.setRequestProperty("Charset", "UTF-8");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 设置请求属性
String param = "";
if (paramMap != null && paramMap.size() > 0) {
Iterator<String> ite = paramMap.keySet().iterator();
while (ite.hasNext()) {
String key = ite.next();// key
String value = paramMap.get(key);
param += key + "=" + value + "&";
}
param = param.substring(0, param.length() - 1);
}
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
sb.append(line+"\n");
}
} catch (Exception e) {
System.err.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println("请输入账号");
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine();
System.out.println("请输入密码");
String b = scanner.nextLine();
/**
* 对登陆的账号和密码进行加密处理
*/
BASE64 base64 = new BASE64();
String JIAMI1 = base64.getBase64(a);
String JIAMI2 = base64.getBase64(b);
String acc,acc1;
acc = JIAMI1.concat("%25%25%25");
acc1 = acc.concat(JIAMI2);
if(acc1.endsWith("==")){
ya = acc1.replace("==","%3D%3D");
}
else
ya = acc1;
post p = new post();
//发送post请求
p.sendPost1();
//发送get请求
get g = new get();
String cccc = g.sendGet();
//得到课表保存为HTML网页
write w = new write();
w.writee(cccc, a);
}
}
获取教务处的cookie:
package com.ccu.post;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.List;
public class ccc{
public String getcookie() {
try{
CookieManager manager=new CookieManager();
manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(manager);
URL url=new URL("http://cdjwc.ccu.edu.cn/jsxsd/");
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.getHeaderFields();
CookieStore store = manager.getCookieStore();
List<HttpCookie> lCookies=store.getCookies();
for (HttpCookie cookie: lCookies) {
if(cookie.getName().equals("JSESSIONID")){
System.out.println(cookie.toString());
return cookie.toString();
}
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
ccc c = new ccc();
c.getcookie();
}
}
根据自己学校的加密方式写:
package com.ccu.post;
import java.io.UnsupportedEncodingException;
import sun.misc.*;
public class BASE64 {
// 加密
public static String getBase64(String str) {
byte[] b = null;
String s = null;
try {
b = str.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (b != null) {
s = new BASE64Encoder().encode(b);
}
return s;
}
}
get请求获取网页:
package com.ccu.post;
import java.io.BufferedReader;
public class get {
public static String sendGet() {
//跳转到课程表的URL
String url = "http://cdjwc.ccu.edu.cn/jsxsd/xskb/xskb_list.do?Ves632DSdyV=NEW_XSD_PYGL";
//对网址处理
url= url.replaceAll(" ", "%20");
//get请求数据
String param = "Ves632DSdyV=NEW_XSD_PYGL";
StringBuffer sb = new StringBuffer();
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("Accept", "text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate");
connection.setRequestProperty("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
connection.setRequestProperty("Connection","keep-alive");
connection.setRequestProperty("Cookie",post.cookie);
connection.setRequestProperty("Host","cdjwc.ccu.edu.cn");
connection.setRequestProperty("Referer","http://cdjwc.ccu.edu.cn/jsxsd/framework/main.jsp");
connection.setRequestProperty("Upgrade-Insecure-Requests","1");
connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
InputStream stream = new GZIPInputStream(connection.getInputStream());
in = new BufferedReader(new InputStreamReader(stream,"UTF-8"));
String line;
int k = 0,a = 0;
/*
* 获得自己想获取的源代码段
*/
while ((line = in.readLine()) != null) {
if(line.equals(" <div class=\"Nsb_rights\">Copyright (C) 湖南强智科技发展有限公司 2003-2013 All Rights Reserved 湘ICP 备12010071号</div>")){
k=1;
}
if(line.equals("<body>")&&a==1){
k=0;
}
if(k==0)
sb.append(line+"\n");
if(line.equals("<body>")&&a==0){
a++;
k=1;
}
if(line.equals(" <input type=\"checkbox\" name=\"sfFD\" id=\"sfFD\" value=\"1\" onclick=\"funFD(this.checked)\" checked>放大")){
k=0;
}
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return sb.toString();
}
}
~~~~:
package com.ccu.bao;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class write {
public void writee(String aaa , String bbb) {
String a = "C:/Users/Songzr/Desktop/";
String b = ".html";
a = a.concat(bbb);
a = a.concat(b);
try {
FileWriter writer = new FileWriter(a,true);
writer.write(aaa);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果图
【注】转载 我转载的那个人好像也是转载的,但是似乎并没有标注原文的出处,我就把我转的那篇博客的地址贴出来吧https://blog.csdn.net/csdnofzyk/article/details/80187919了解GPU从nvidia-smi命令开始2018年05月03日 21:55:36阅读数:151前言相信各位在安装完NVIDIA GRID软件以后,官方建议...
今天测试kafka,发现高版本的springboot整合kafka消息发送失败,低版本就可以,刚看是查了好久,就是没找到问题,查到有人说是版本不匹配问题,于是更换成springboo 1.5.13,成功了,亲测springboot2.1.0也可以先测试的是boot2.0.1的版本,同样的代码使用boot的1.5.13就是ok的,具体什么原因不清楚,debug页面也买看到错误iserver...
最近学习java字符串部分,用正则表达式做了一个简单的统计单词出现次数的小程序,目前只能统计英文。整个程序包括三个包,分别为output,run,wordcountwordCount包执行单词统计逻辑的工具包,使用HashMap存储某个字符串出现的次数。setPattern用来在类外部设置不同的正则表达式,从而使用不同的分词规则(策略模式的一个变种吧),默认使用[a-zA-Z]+...
MOPF的最优解集对应于不同的权衡水平,通常被称为帕累托最优解(PoSs)[8],其中每个PoS对应于由不同目标形成的目标空间中的一个点,所有这些点的形状称为帕累托锋(PF)。近几十年来,越来越需要快速解决多目标最优潮流(MOPF)问题[2],[3],以便在现代电力系统中更有效地运行和规划[4]。MOPF可以理解为约束单目标最优功率流(OPF)[5]的扩展,旨在最大限度地降低电力系统的总发电成本,同时满足供需之间功率平衡的需求,但受制于发电机有功和无功功率的运行限制[6], 以及整个系统的安全性。
EasyTime Limit: 10 SecMemory Limit: 128 MB[Submit][Status][Discuss]Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,...
计算机网络(八):传输层与用户数据报协议——UDP一、传输层传输层位于网络层和应用层之间。传输层负责向应用层提供服务,接收来自网络层的服务。传输层的基本功能传输层协议的首要任务是提供进程到进程通信。其根本目的在于在网络层提供的数据通信服务基础上,实现主机进程间可靠服务。传输层与应用层、网络层之间的关系传输层与应用层、网络层之前的关系以及报文格式如下图所示。网络环境中的应用进程标识...
MFC的类向导是一个很实用的东西,但是仅限于VC6.0VS2010、VS2012中的类向导所构造的函数,其参数无法像VC6.0中那样自定义它所支持的参数仅限于int、short、char这种,连指针都不支持……这样的类向导有何用?不如手动输入另一个好的办法是先用类向导构造出函数,再手动去修改,用转到定义、转到声明之类的东西------------------------------
把Maven中央仓库换成阿里云后,下载速度快了很多!配置如下:修改maven根目录下的conf文件夹中的setting.xml文件,内容如下:< !-- 在mirrors 中配置 mirror --><mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>
欢迎使用Markdown编辑你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验...
输入一行字符(20 个以上字符),分别统计出其中英文字母、空格、数字和其它字 符的个数。运行结果如下:请输入一个字符串:45se r,d5d~ s58*英文字母=6 个,空格=4 个,数字=5 个,其他=3 个s=input('请输入一个字符串:\n')letters=0space=0digit=0others=0for c in s: if c.isalpha():...
原文地址目录测试数据PostgreSQL 12 之前的实现PostgreSQL 13 的增强功能注意事项总结PostgreSQL 全球开发组于 2020 年 9 月 24 日宣布 PostgreSQL 13正式发布。接下来我会通过一系列文章为大家解析这个新版本带来的功能增强,本文先给大家介绍一个与 SQL 开发相关的新特性:FETCH FIRST 子句增加了WITH TIES 选项,可以用于返回更多排名相同的数据行。如果觉得文章有用,欢迎关注️、评论????、点赞????
第1章Python概述1.1初识Python语言1.1.1Python语言简介1.1.2Python语言的特点1.1.3Python语言的应用范围1.2Python语言版本和开发环境1.2.1Python语言的版本1.2.2Python语言的实现1.2.3Python语言的集成开发环境1.3下载和安装Python1.3.1下载Python1.3.2安装Python1.3.3安装和管理Python扩...