JAVA爬取学校教务处课表_sssszr的博客-程序员秘密

技术标签: Java  java  get  post请求  

小白JAVA爬取学校教务处课表

闲来无事- -就爬取了学校的教务处系统的课表试试水
如果有不懂的可以先了解post,get请求

  • 利用java自定义发送post请求模拟登陆

  • 利用java自定义发送get请求获取学校课表并保存


目录

[TOC]来生成目录:

post

利用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;
    }

}

post

cookie

~~

get

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();
    }
}

GET

COOKIE

参数

保存为HTML

~~~~:

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();
        }
    }

}

结果图
这里写图片描述

这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sssszr/article/details/78754348

智能推荐

查看GPU的nvidia-smi命令_amd怎么看nvidia-smi_赵YN的csdn的博客-程序员秘密

【注】转载 我转载的那个人好像也是转载的,但是似乎并没有标注原文的出处,我就把我转的那篇博客的地址贴出来吧https://blog.csdn.net/csdnofzyk/article/details/80187919了解GPU从nvidia-smi命令开始2018年05月03日 21:55:36阅读数:151前言相信各位在安装完NVIDIA GRID软件以后,官方建议...

springboot整合kafka消息发送失败问题-版本不匹配问题_kafkatemplate旧版本发送_yala说的博客-程序员秘密

今天测试kafka,发现高版本的springboot整合kafka消息发送失败,低版本就可以,刚看是查了好久,就是没找到问题,查到有人说是版本不匹配问题,于是更换成springboo 1.5.13,成功了,亲测springboot2.1.0也可以先测试的是boot2.0.1的版本,同样的代码使用boot的1.5.13就是ok的,具体什么原因不清楚,debug页面也买看到错误iserver...

java根据标点英文分词_weixin_34148456的博客-程序员秘密

最近学习java字符串部分,用正则表达式做了一个简单的统计单词出现次数的小程序,目前只能统计英文。整个程序包括三个包,分别为output,run,wordcountwordCount包执行单词统计逻辑的工具包,使用HashMap存储某个字符串出现的次数。setPattern用来在类外部设置不同的正则表达式,从而使用不同的分词规则(策略模式的一个变种吧),默认使用[a-zA-Z]+...

【多目标优化算法】基于分解的多目标进化算法智能电网电力调度决策方法(Matlab代码实现)_wlz249的博客-程序员秘密

MOPF的最优解集对应于不同的权衡水平,通常被称为帕累托最优解(PoSs)[8],其中每个PoS对应于由不同目标形成的目标空间中的一个点,所有这些点的形状称为帕累托锋(PF)。近几十年来,越来越需要快速解决多目标最优潮流(MOPF)问题[2],[3],以便在现代电力系统中更有效地运行和规划[4]。MOPF可以理解为约束单目标最优功率流(OPF)[5]的扩展,旨在最大限度地降低电力系统的总发电成本,同时满足供需之间功率平衡的需求,但受制于发电机有功和无功功率的运行限制[6], 以及整个系统的安全性。

【BZOJ3450】Easy [期望DP]_weixin_30265103的博客-程序员秘密

EasyTime Limit: 10 SecMemory Limit: 128 MB[Submit][Status][Discuss]Description  某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(  我们来简化一下这个游戏的规则  有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,...

计算机网络(八):传输层与用户数据报协议——UDP_tpdu是谁提交的_快乐肥柴的博客-程序员秘密

计算机网络(八):传输层与用户数据报协议——UDP一、传输层传输层位于网络层和应用层之间。传输层负责向应用层提供服务,接收来自网络层的服务。传输层的基本功能传输层协议的首要任务是提供进程到进程通信。其根本目的在于在网络层提供的数据通信服务基础上,实现主机进程间可靠服务。传输层与应用层、网络层之间的关系传输层与应用层、网络层之前的关系以及报文格式如下图所示。网络环境中的应用进程标识...

随便推点

关于MFC_Kupakeep的博客-程序员秘密

MFC的类向导是一个很实用的东西,但是仅限于VC6.0VS2010、VS2012中的类向导所构造的函数,其参数无法像VC6.0中那样自定义它所支持的参数仅限于int、short、char这种,连指针都不支持……这样的类向导有何用?不如手动输入另一个好的办法是先用类向导构造出函数,再手动去修改,用转到定义、转到声明之类的东西------------------------------

Maven中设置阿里云中央仓库__Sirius的博客-程序员秘密

把Maven中央仓库换成阿里云后,下载速度快了很多!配置如下:修改maven根目录下的conf文件夹中的setting.xml文件,内容如下:&lt; !-- 在mirrors 中配置 mirror --&gt;&lt;mirrors&gt; &lt;mirror&gt; &lt;id&gt;alimaven&lt;/id&gt; &lt;name&gt;aliyun maven&lt;/name&gt; &lt;url&gt;

NET C# 增量发布流程(基于蓝鲸平台也适用于Jenkins)_c# 增量包_Berters的博客-程序员秘密

欢迎使用Markdown编辑你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验...

【Python】输入一行字符(20 个以上字符),分别统计出其中英文字母、空格、数字和其它字 符的个数。_python输入一行字符_famur的博客-程序员秘密

输入一行字符(20 个以上字符),分别统计出其中英文字母、空格、数字和其它字 符的个数。运行结果如下:请输入一个字符串:45se r,d5d~ s58*英文字母=6 个,空格=4 个,数字=5 个,其他=3 个s=input('请输入一个字符串:\n')letters=0space=0digit=0others=0for c in s: if c.isalpha():...

PostgreSQL 13 新特性之 FETCH FIRST WITH TIES_十&年的博客-程序员秘密

原文地址目录测试数据PostgreSQL 12 之前的实现PostgreSQL 13 的增强功能注意事项总结PostgreSQL 全球开发组于 2020 年 9 月 24 日宣布 PostgreSQL 13正式发布。接下来我会通过一系列文章为大家解析这个新版本带来的功能增强,本文先给大家介绍一个与 SQL 开发相关的新特性:FETCH FIRST 子句增加了WITH TIES 选项,可以用于返回更多排名相同的数据行。如果觉得文章有用,欢迎关注️、评论????、点赞????

python算法基础教程_Python程序设计与算法基础教程(第2版)-微课版_weixin_39991055的博客-程序员秘密

第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扩...

推荐文章

热门文章

相关标签