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