【爬蟲】(四)西電研究生教務(wù)系統(tǒng)技術(shù)文檔

date: 2017-02-03 19:59:33

課表

教務(wù)系統(tǒng)爬蟲工作初步完成

關(guān)于教務(wù)系統(tǒng)的一系列爬取工作已經(jīng)初步完成譬胎,Holi爬蟲組的工作也算正式進入優(yōu)化階段观蜗。
我們需要根據(jù)后臺組的需要,轉(zhuǎn)換成CVS或數(shù)據(jù)庫形式荧降。需要和后臺組進行商量妈倔。

實現(xiàn)的功能

模擬登陸

  • 此為爬取數(shù)據(jù)的第一步,之前試過很多方法伪煤,遇到的問題也各種各樣加袋。

問題的解決:

模擬登陸需要很多東西,一定要根據(jù)抓包來進行數(shù)據(jù)分析抱既,分析報頭的組成形式职烧,再模擬報頭所需的東西進行模擬post。

  • 模擬登陸作為爬取教務(wù)系統(tǒng)的第一步,花的時間也比較久蚀之。在學習模擬登陸上也花了很多時間蝗敢。
  • 通過此次模擬登錄的實現(xiàn),了解到了從發(fā)送其請求足删,到瀏覽器解析出的網(wǎng)頁的整個過程寿谴。

魯棒性問題:

之前缺少所需的報頭消息而意外的觸發(fā)了教務(wù)系統(tǒng)的驗證碼機制。現(xiàn)在報頭已經(jīng)完整失受,只要學號密碼正確是不會觸發(fā)驗證碼機制的讶泰。但是,如果學號或密碼輸入錯誤拂到,是會觸發(fā)驗證碼機制的痪署。簡單的驗證碼可以使用Python來進行OCR識別,但是教務(wù)處的驗證碼比較復(fù)雜兄旬。此問題的解決方案暫定為講驗證碼圖片呈現(xiàn)給用戶狼犯,讓其進行手動輸入。

課表的爬取

課表
  • 課表的行列組合比較復(fù)雜领铐,這里只是簡單的把課表消息從HTML中解析出來辜王。
  • 后期的工作重點仍在HTML解析和數(shù)據(jù)處理方面。需要和后臺組溝通罐孝。

  • 課表的技術(shù)文檔在上一次文檔中簡單講過呐馆,現(xiàn)在為了整體閱讀性,將其搬移過來:

1莲兢、init():兩個URL分別為用抓包軟件獲取的實際登錄網(wǎng)址和實際提交賬號密碼的網(wǎng)址汹来。
2、login():用抓包軟件獲取的用Chrome瀏覽器登錄教務(wù)處的head報文改艇,login()為模擬登錄教務(wù)處的所需信息收班。
3、Print():將登錄進去的課程表HTML網(wǎng)頁打印出來谒兄。
4摔桦、使用前請確認安裝BeautifulSoup模塊。請修改里面的學號id和password再進行運行承疲。
5邻耕、后續(xù)將從HTML網(wǎng)頁中提取出有用的信息。
6燕鸽、運行l(wèi)ogin()后便可以登錄進教務(wù)處系統(tǒng)兄世,修改Print()中的URL即可完成不同信息的獲取,比如換成成績網(wǎng)頁的URL啊研、教務(wù)通知的URL等等御滩。

成績查詢

課表
  • 在 Print 函數(shù)中將 get 的網(wǎng)址換成課表的網(wǎng)址即可進行爬取鸥拧。
  • 對返回的HTML進行了簡單的解析,提取了簡單的標簽削解,獲取的數(shù)據(jù)可讀性不是很強富弦。
  • 與課表的問題一樣,后期的重點仍在數(shù)據(jù)處理氛驮。

通知公告的爬取

課表
課表

在西電舆声,最令人煩惱就是你今天去上課了,可是老師翹課了A!碱屁!

  • 一般情況下學生是不會經(jīng)常去刷教務(wù)處網(wǎng)頁的磷脯,但是教務(wù)系統(tǒng)有一個滾動的通知公告。
  • 只要有老師在上面發(fā)布調(diào)課通知或考試通知娩脾,上面就顯示赵誓。
  • 這上面的公告是全校性的。
  • 同理柿赊,這個網(wǎng)頁的解析提取比較簡單俩功,數(shù)據(jù)看起來也很和諧。

我的消息

課表
  • 只要用戶的老師翹課或者出成績碰声,個人就會收到該通知诡蜓。
  • 這個功能的實現(xiàn),也可以解決后臺組一直提倡的個性化推送胰挑,教務(wù)處已經(jīng)幫咱們實現(xiàn)了蔓罚,哈哈哈!
  • 后期我們只需要隔斷時間判斷是否有新的通知產(chǎn)生即可得到最新的消息瞻颂,彈窗通知給用戶即可豺谈。

待解決的問題

數(shù)據(jù)處理!贡这!這個的工作量和爬取來比還是比較大的茬末。

但是已經(jīng)邁出了第一步,后面的路會好走許多盖矫。

come on 丽惭!

附代碼,作備份辈双。

1吐根、課表

#Python35 爬蟲 西電 研究生教務(wù)處 課表
#注:請修改login()學號密碼進行爬取
#肖灑 2017/1/19 V1.0
# -*-encoding:utf-8-*-
# coding=utf-8
__author__ = 'ysc'
import requests
import csv
from bs4 import BeautifulSoup

class ScrapeGrade:
    def __init__(self, auth_url=None, log_url=None):
        if not auth_url:
            self.auth_url = "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp"
            self.log_url = "http://jwxt.xidian.edu.cn/caslogin.jsp"
        else:
            self.auth_url = auth_url
            self.log_url = log_url
        self.session = requests.Session()

    def login(self, id='學號', password='密碼'):
        r = self.session.get(self.auth_url)
        data = r.text
        bsObj = BeautifulSoup(data, "html.parser")
        lt_value = bsObj.find(attrs={"name": "lt"})['value']
        exe_value = bsObj.find(attrs={"name": "execution"})['value']
        params = {'username': id, 'password': password,
                  "submit": "", "lt": lt_value, "execution": exe_value,
                  "_eventId": "submit", "rmShown": '1'}
        headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
           'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
           "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
           "Accept-Encoding": "gzip, deflate",
           "Referer": "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp",
           "Content-Type": "application/x-www-form-urlencoded"}
        s = self.session.post(self.auth_url, data=params, headers=headers)
        s = self.session.get(self.log_url)

    def Print(self):
        grade_page = self.session.get("http://yjsxt.xidian.edu.cn/eduadmin/findCaresultByStudentAction.do")
        bsObj2 = BeautifulSoup(grade_page.text, "html.parser")
        nameList = bsObj2.findAll("td", {"class":"textCenter"})
        for name in nameList:
           print(name.get_text())



if __name__ == '__main__':
    # 初始化爬蟲對象
    sg = ScrapeGrade()
    # 登錄(在此處傳入正確的個人學號與密碼信息)
    sg.login(id='學號', password='密碼')
    sg.Print()

2、通知公告

#Python35 爬蟲 西電研究生教務(wù)處 通知公告
#注:請修改 login()學號密碼進行爬取
#肖灑 2017/1/25 V1.0
# -*-encoding:utf-8-*-
# coding=utf-8
__author__ = 'ysc'
import requests
import csv
from bs4 import BeautifulSoup

class ScrapeGrade:
    def __init__(self, auth_url=None, log_url=None):
        if not auth_url:
            self.auth_url = "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp"
            self.log_url = "http://jwxt.xidian.edu.cn/caslogin.jsp"
        else:
            self.auth_url = auth_url
            self.log_url = log_url
        self.session = requests.Session()

    def login(self, id='學號', password='密碼'):
        r = self.session.get(self.auth_url)
        data = r.text
        bsObj = BeautifulSoup(data, "html.parser")
        lt_value = bsObj.find(attrs={"name": "lt"})['value']
        exe_value = bsObj.find(attrs={"name": "execution"})['value']
        params = {'username': id, 'password': password,
                  "submit": "", "lt": lt_value, "execution": exe_value,
                  "_eventId": "submit", "rmShown": '1'}
        headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
           'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
           "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
           "Accept-Encoding": "gzip, deflate",
           "Referer": "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp",
           "Content-Type": "application/x-www-form-urlencoded"}
        s = self.session.post(self.auth_url, data=params, headers=headers)
        s = self.session.get(self.log_url)

    def Print(self):
        grade_page = self.session.get("http://yjsxt.xidian.edu.cn/info/findAllBroadcastMessageAction.do?flag=findAll")
        bsObj2 = BeautifulSoup(grade_page.text, "html.parser")

        nameList = bsObj2.findAll("td", {"class":"textTop"})
        for name in nameList:
           print(name.get_text())


if __name__ == '__main__':
    # 初始化爬蟲對象
    sg = ScrapeGrade()
    # 登錄(在此處傳入正確的個人學號與密碼信息)
    sg.login(id='學號', password='密碼')
    sg.Print()

3辐马、成績查詢

#Python35 爬蟲 西電研究生教務(wù)處 成績查詢
#注:請修改login()學號密碼進行爬取
#肖灑 2017/02/01 V1.0
# -*-encoding:utf-8-*-
# coding=utf-8
__author__ = 'ysc'
import requests
import csv
from bs4 import BeautifulSoup

class ScrapeGrade:
    def __init__(self, auth_url=None, log_url=None):
        if not auth_url:
            self.auth_url = "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp"
            self.log_url = "http://jwxt.xidian.edu.cn/caslogin.jsp"
        else:
            self.auth_url = auth_url
            self.log_url = log_url
        self.session = requests.Session()

    def login(self, id='學號', password='密碼'):
        r = self.session.get(self.auth_url)
        data = r.text
        bsObj = BeautifulSoup(data, "html.parser")
        lt_value = bsObj.find(attrs={"name": "lt"})['value']
        exe_value = bsObj.find(attrs={"name": "execution"})['value']
        params = {'username': id, 'password': password,
                  "submit": "", "lt": lt_value, "execution": exe_value,
                  "_eventId": "submit", "rmShown": '1'}
        headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
           'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
           "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
           "Accept-Encoding": "gzip, deflate",
           "Referer": "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp",
           "Content-Type": "application/x-www-form-urlencoded"}
        s = self.session.post(self.auth_url, data=params, headers=headers)
        s = self.session.get(self.log_url)

    def Print(self):
        grade_page = self.session.get("http://yjsxt.xidian.edu.cn/queryScoreByStuAction.do")
        bsObj2 = BeautifulSoup(grade_page.text, "html.parser")

        nameList = bsObj2.findAll("td")
        for name in nameList:
           print(name.get_text())


if __name__ == '__main__':
    # 初始化爬蟲對象
    sg = ScrapeGrade()
    # 登錄(在此處傳入正確的個人學號與密碼信息)
    sg.login(id='學號', password='密碼')
    sg.Print()

4拷橘、我的消息

#Python35 爬蟲 西電研究生教務(wù)處 我的消息(系統(tǒng)消息局义、成績提示等)
#注:請修改login()學號密碼進行爬取
#肖灑 2017/02/01 V1.0
# -*-encoding:utf-8-*-
# coding=utf-8
__author__ = 'ysc'
import requests
import csv
from bs4 import BeautifulSoup


class ScrapeGrade:
    def __init__(self, auth_url=None, log_url=None):
        if not auth_url:
            self.auth_url = "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp"
            self.log_url = "http://jwxt.xidian.edu.cn/caslogin.jsp"
        else:
            self.auth_url = auth_url
            self.log_url = log_url
        self.session = requests.Session()

    def login(self, id='學號', password='密碼'):
        r = self.session.get(self.auth_url)
        data = r.text
        bsObj = BeautifulSoup(data, "html.parser")
        lt_value = bsObj.find(attrs={"name": "lt"})['value']
        exe_value = bsObj.find(attrs={"name": "execution"})['value']
        params = {'username': id, 'password': password,
                  "submit": "", "lt": lt_value, "execution": exe_value,
                  "_eventId": "submit", "rmShown": '1'}
        headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
           'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
           "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
           "Accept-Encoding": "gzip, deflate",
           "Referer": "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp",
           "Content-Type": "application/x-www-form-urlencoded"}
        s = self.session.post(self.auth_url, data=params, headers=headers)
        s = self.session.get(self.log_url)

    def Print(self):
        grade_page = self.session.get("http://yjsxt.xidian.edu.cn/info/findAllMessageAction.do")
        bsObj2 = BeautifulSoup(grade_page.text, "html.parser")
        nameList = bsObj2.findAll("li")
        for name in nameList:
           print(name.get_text())


if __name__ == '__main__':
    # 初始化爬蟲對象
    sg = ScrapeGrade()
    # 登錄(在此處傳入正確的個人學號與密碼信息)
    sg.login(id='學號', password='密碼')
    sg.Print()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冗疮,隨后出現(xiàn)的幾起案子萄唇,更是在濱河造成了極大的恐慌,老刑警劉巖术幔,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件另萤,死亡現(xiàn)場離奇詭異,居然都是意外死亡诅挑,警方通過查閱死者的電腦和手機四敞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拔妥,“玉大人忿危,你說我怎么就攤上這事∶涣” “怎么了铺厨?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硬纤。 經(jīng)常有香客問我解滓,道長,這世上最難降的妖魔是什么筝家? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任洼裤,我火速辦了婚禮,結(jié)果婚禮上溪王,老公的妹妹穿的比我還像新娘逸邦。我一直安慰自己,他們只是感情好在扰,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布缕减。 她就那樣靜靜地躺著,像睡著了一般芒珠。 火紅的嫁衣襯著肌膚如雪桥狡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天皱卓,我揣著相機與錄音裹芝,去河邊找鬼。 笑死娜汁,一個胖子當著我的面吹牛嫂易,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掐禁,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼怜械,長吁一口氣:“原來是場噩夢啊……” “哼颅和!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缕允,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤峡扩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后障本,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體教届,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年驾霜,在試婚紗的時候發(fā)現(xiàn)自己被綠了案训。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡粪糙,死狀恐怖强霎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猜旬,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布倦卖,位于F島的核電站洒擦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怕膛。R本人自食惡果不足惜熟嫩,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褐捻。 院中可真熱鬧掸茅,春花似錦、人聲如沸柠逞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽板壮。三九已至逗鸣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绰精,已是汗流浹背撒璧。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笨使,地道東北人卿樱。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像硫椰,于是被迫代替她去往敵國和親繁调。 傳聞我的和親對象是個殘疾皇子萨蚕,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容