學了大半年 Node.JS 不知道學了點什么罢杉,眼看著這學期就快要過去了,即將迎來期末考試的審判贡歧,心慌滩租。寫幾行代碼靜靜,所以這幾天用 Node 寫了個查成績系統(tǒng)利朵。等期末考完試就能用自己的程序查自己成績看看掛了幾科律想,想想也是很刺激的。
查成績說到底還是爬蟲哗咆,寫爬蟲有個趁手的工具還是很方便的蜘欲,就是這兩個:
// 用來發(fā)送http請求
const request = require('request');
// 用來用 jquery 語法解析 html 格式文件
const cheerio = require('cheerio');
現(xiàn)在可以發(fā)送 http 請求了,那還需要來看一下教務處的路由晌柬。
通過觀察姥份,首先要登錄一下郭脂,登錄還需要填個二維碼。通過觀察澈歉,驗證碼請求路徑就是這個:
/validateCodeAction.do?random="+Math.random();
驗證碼這個東西展鸡,請求它的時候它還會返回一個 cookie 所以需要把這個 cookie 存一下:
var cookie = res.headers['set-cookie'];
然后還有表單內(nèi)容:
用戶名:zjh
密碼:mm
驗證碼:v_yzm
然后帶著 cookie 去 POST 登錄表單,就可以登錄成功啦埃难,沒有 cookie 登錄的話會返回服務器繁忙莹弊。登錄失敗涡尘!
最后的請求參數(shù):
let opts = {
// 登錄路徑
url: "http://教務處網(wǎng)址/loginAction.do",
headers: {
'User-Agent': `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36`,
Cookie: cookie, //這里是請求二維碼返回的cookie,(重點)
},
encoding: null, // 關鍵代碼
method: 'POST',
// 攜帶 cookie 再 POST 表單
form: {
zjh: username, // 學號
mm : password, // 密碼
v_yzm : yzm // 驗證碼
},
};
哦忍弛,對了。登錄路徑是這個:
/loginAction.do
然后就登錄成功啦考抄,經(jīng)過一頓探索發(fā)現(xiàn)细疚。得知,查詢成績頁面是這個路由:
/gradeLnAllAction.do?type=ln&oper=fa
然后通過 request 請求這個路徑川梅,在返回的 body 中得到 html 文件疯兼。
這里有一個問題,就是中文亂碼問題贫途,這里可以通過設置 request 請求的 encoding 參數(shù)設置為 null 返回二進制文件吧彪,再通過
const gbk = require('GBK');
這個模塊,將二進制文件轉(zhuǎn)為 GBK 編碼丢早。
var data = gbk.toString('utf-8',body1);
然后就可以愉快的從文件中獲取成績信息了姨裸。先用 cheerio 模塊加載 html 文件。
var $ = cheerio.load('data');
然后用 jquery 語法分析
var temp = [];
var data = {
score:[],
};
$(".odd td").each(function(index,el){
temp[index] = $(el).text().trim();
data['score'][index] = temp[index];
})
分析網(wǎng)頁源碼發(fā)現(xiàn)怨酝,成績信息儲存在 .odd 下的 td 標簽中啦扬,遍歷 td 標簽,trim 方法去掉空格回車將結(jié)果儲存在 data 對象的 score 數(shù)組中凫碌。
res.render('score',data);
返回 data 數(shù)據(jù)。
好啦胃榕,后臺內(nèi)容基本就寫完盛险。前端接收數(shù)據(jù)顯示即可。
很多學校的教務處可能都是類似的勋又,看了這篇文章相信每個人都可以自己寫一個專屬的查成績系統(tǒng)苦掘,或者是女朋友私人訂制版?