爬取学校教务网课表与成绩 java版
爬取學校教務網的課表與成績java版
? 這是安卓課設時本人做的一個簡單的app里面所涉及到的爬蟲部分,由于android編程是用java語言來寫的,為了兼容,本人也使用了java來寫爬蟲。
cookie
cookie 在存儲上是一段鍵值對信息,服務器本身無法判斷用戶身份,cookie便是用來讓服務器鑒別身份狀態(tài)的。在這里服務器就會根據(jù)cookie的內容來辨別用戶有沒有登錄,如果我們想獲取我們自己的教務網信息,我們只需要拿到能夠標識自己身份的cookie和請求放一起提交到服務端,便能拿到自己的信息。
請求頭中的 Referer
referer 是 Http 請求header的一部分,它一般標識從哪一個地址發(fā)出的本次請求,我們可以通過Referer來找到發(fā)出本次的請求來進行分析
Jsoup
一種java第三方包,用來解析HTML,對于數(shù)據(jù)爬取有很大的幫助
尋找自己的身份標識 cookie(從后向前)
登陸成功的主界面,通過檢查 Network,我們找到了里面兩個我們比較關心的數(shù)據(jù) referer 和 cookie(此時的cookie已經可以標識我們的身份了)
可以注意到cookie 里面有兩個jsessionid。但我們并不知道原因,我們便將注意力先放在Referer上。
訪問 referer 網址,再次進行檢查時,我們再次找到了cookie,對比上面的cookie,我們可以發(fā)現(xiàn)這次的cookie比之前的少了一個 jsessionid,我們便可以大膽的猜測,這個缺失的jsessionid便是對身份標識的關鍵。
試圖獲取關鍵的jsessionid
? 既然是表示身份的jsessionid,那必定與輸入的密碼與賬戶有關,我們現(xiàn)在可以看一下登錄時發(fā)生了什么,下面為點擊登錄的函數(shù),遺憾的是并沒有發(fā)現(xiàn)什么有用的線索。
我們現(xiàn)在變換思路從前往后看,我們檢查一下NetWork從登錄界面到主界面?zhèn)鬟^來的doc文檔,發(fā)現(xiàn)前兩個doc是第一步我們檢查沒有發(fā)現(xiàn)的界面
我們觀察到第一個doc的cookie并沒有標識身份的jsessionid
第二個doc卻出現(xiàn)了身份標識的jsessionid,并且Referer是第一個doc,我們可以猜測肯定是第二個doc從第一個里面獲取到了什么數(shù)據(jù)。
再次觀察第一個doc,發(fā)現(xiàn)里面有form表單,里面有三個數(shù)據(jù),用戶名,密碼以及encoded,傳過去的密碼為空,賬戶為明碼,這兩個跡象表明傳過去的encoded才是真正的有用的東西,可能是通過加密將密碼賬戶加密成encoded,我們現(xiàn)在就可以開始找endcoded相關的東西了
通過搜索encoded 我們很快的找到了一個比較可疑的函數(shù),這是一個局部刷新的函數(shù),大致意思是向一個網址請求數(shù)據(jù),返回的數(shù)據(jù)再進行一系列操作。其中,里面用到了我們所輸入的賬戶以及密碼。并進行了一系列的加密。
? 通過對loginajax()函數(shù)的搜索,發(fā)現(xiàn)這里原來就是login()函數(shù)所調用的一個函數(shù),之前沒有仔細的觀察,尷尬了QAQ。現(xiàn)在我們可以確定上面的加密函數(shù)確實是對密碼賬戶以及對strUrl進行訪問獲取的一段string,共同加密得到的encoded。
獲得jsessionid
當我們獲得endcoded 之后我們便可以訪問第二個doc,通過觀察,我們可以發(fā)現(xiàn)第一個doc中的location便是第二個doc的url,這樣就好辦了,我們這樣通過訪問第二個doc便可以獲得那個可以真正標識我們身份的cookie了。
通過獲取到的cookies我們便可以對學校教務網的任意一個網頁進行訪問,結合Jsoup來對數(shù)據(jù)進行爬取!
獲取cookie:
package spiderMethod;import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element;import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map;public class getCookies {public static String LOGIN_URL = "http://kdjw.hnust.edu.cn/";public static String url1 = "http://kdjw.hnust.edu.cn/Logon.do?method=logon&flag=sess";public static String url2 = "http://kdjw.hnust.edu.cn/Logon.do?method=logon";public static String url3 = "http://kdjw.hnust.edu.cn/jsxsd/xskb/xskb_list.do";public static String USER_AGENT = "User-Agent";public static String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36";public static String user;public static String password;public static Map<String, String> cookies = new HashMap<>();public static int flag; // 標志是否拿取成功,可用于登錄密碼是否正確,也可直接判斷cookies的值public getCookies(String user, String password) {this.user = user;this.password = password;}public int getFlag() {return flag;}public Map getCookies() throws IOException {return log(user, password);}//獲得dataStringpublic static String get_dataString(Connection.Response response) throws IOException {String s = response.header("Set-Cookie"); //獲得Set-CookieString[] array = s.split(";| |,|=|/"); // System.out.println(s);String JSESSIONID = "", SERVERID = "";for (int i = 0; i < array.length; i++) {System.out.println(array[i]);if (array[i].equals("SERVERID")) {SERVERID = array[i + 1];i++;}if (array[i].equals("JSESSIONID")) {JSESSIONID = array[i + 1];i++;}}//存入新的cookies中cookies.put("JSESSIONID", JSESSIONID);cookies.put("SERVERID", SERVERID);System.out.println(cookies);Connection connection = Jsoup.connect(url1);connection.header(USER_AGENT, USER_AGENT_VALUE);Connection.Response rs = connection.cookies(cookies).execute();Document doc = Jsoup.parse(rs.body());System.out.println(doc.select("body").text());return doc.select("body").text();}public static Map log(String user, String password) throws IOException {try {Connection connection1 = Jsoup.connect(LOGIN_URL);//print(LOGIN_URL);connection1.header(USER_AGENT, USER_AGENT_VALUE); // 配置模擬瀏覽器Connection.Response rs = connection1.execute(); // 獲取響應String dataString = get_dataString(rs);String encoded = get_code.get_encoded(dataString, user, password);Document d1 = Jsoup.parse(rs.body()); // 通過Jsoup將返回信息轉換為Dom樹List<Element> eleList = d1.select("form"); // 獲取提交form表單,可以通過查看頁面源碼代碼得知// 獲取cooking和表單屬性Map<String, String> datas = new HashMap<>();for (int i = 0; i < eleList.size(); i++) {for (Element e : eleList.get(i).getAllElements()) {// 設置用戶名if (e.attr("name").equals("userAccount")) {e.attr("value", user);}// 設置用戶密碼if (e.attr("name").equals("userPassword")) {e.attr("value", "");}if (e.attr("name").equals("encoded")) {e.attr("value", encoded);}// 排除空值表單屬性if (e.attr("name").length() > 0 && !e.attr("name").equals("loginForm")) {datas.put(e.attr("name"), e.attr("value"));}}}Connection con2 = Jsoup.connect(url2);con2.header(USER_AGENT, USER_AGENT_VALUE);System.out.println(cookies);// 設置cookie和post上面的map數(shù)據(jù)Connection.Response login = con2.followRedirects(false).method(Connection.Method.POST).data(datas).cookies(cookies).header("ContentType", "application/x-www-form-urlencoded").execute(); // System.out.println(login.body()); // System.out.println(login.cookies());String location = login.header("Location");//空System.out.println(location);Connection connection3 = Jsoup.connect(location);Connection.Response cdx = connection3.followRedirects(false).method(Connection.Method.GET).header("ContentType", "application/x-www-form-urlencoded").cookies(cookies).execute();// 打印,登陸成功后的信息if (cdx.statusCode() != 302)System.out.println("登陸失敗");else {System.out.println(cdx.cookies());Map<String, String> map = cdx.cookies();for (String s : map.keySet()) {System.out.println(s + " : " + map.get(s));}Connection con7 = Jsoup.connect(url3);cdx.cookies().put("SERVERID", cookies.get("SERVERID"));}System.out.println(cdx.cookies());flag = 1;return cdx.cookies();} catch (Exception e) {Map<String, String> st = new HashMap<String, String>();flag = 0;return st;}} }這里給出獲取cookie 的步驟,加密函數(shù)就不給出了哈~
我把具體代碼放在GitHub上了,大家有興趣自取
里面包含了對自己四六級,課程成績,考試安排等方面的爬取,歡迎大家學習交流
下面給出jsoup以及其他的依賴包:
https://pan.baidu.com/s/1CxzKc3o7_RzrRfAYt71lLw 提取碼: 6qms
總結
以上是生活随笔為你收集整理的爬取学校教务网课表与成绩 java版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乐谱管理软件SheetAble
- 下一篇: 以下哪些python数字是合法的_3 4