詳細爬蟲:爬取華師教務系統
- 前言
- 初衷
- 實戰
- 1.模擬登錄
- 2.登錄教務系統
- 查看成績
- 登錄教務系統,并獲取成績查詢所需的引數nd
- 查看成績查詢結果
前言
這篇文章是本人學了半個月的爬蟲寫的,如有不足之處,望各位大佬提出意見,此外,本文僅供學習與交流使用
初衷
最近學了python爬蟲后,就迫不及待地想做些什么,于是就把魔爪伸向了本校的教務系統,就先以爬取自己的成績來做個示范
實戰
1.模擬登錄
先打開平臺登錄界面并打開開發者工具(一定要在登錄前提前打開),并點擊網路

登錄成功后在訊息頭里可以看到login登錄所發起的請求為post請求,請求的url為 https://account.ccnu.edu.cn/cas/login?service=http://one.ccnu.edu.cn/cas/login_portal
于是只要對這個url發起一個post請求并攜帶引數就可以實作模擬登錄了,在請求里可以看到攜帶的相關引數

不過我發現這樣并不能獲得登錄后的頁面資料,也就是沒有登錄成功
后來我發現引數中的lt值每次登錄都會變,于是我猜測lt值可能在登錄界面的elements中

所以我們先獲取lt值,在這里我們用到了session來一直攜帶登錄后訪問其它網頁所需要的cookie值
import requests
from lxml import etree
# 進行UA偽裝,實體化一個Session物件,用于存盤登錄后的cookie值
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:78.0) Gecko/20100101 Firefox/78.0'
}
session = requests.Session()
# 獲取登錄需要的引數lt
def get_lt(url):
lt_text = session.get(url=url, headers=headers).text
lt = etree.HTML(lt_text).xpath('/html/body/div/div/div[2]/div/form/section[4]/input[1]/@value')[0]
return lt
然后模擬登錄
# 模擬登錄
username = input('用戶名:')
password = input('密碼:')
url = "https://account.ccnu.edu.cn/cas/login?service=http%3A%2F%2Fxk.ccnu.edu.cn%2Fsso%2Fpziotlogin"
data = {
"username": username,
"password": password,
"lt": get_lt(url),
"execution": "e1s1",
"_eventId": "submit",
"submit": "登錄"
}
response = session.post(url=url, data=data, headers=headers)
2.登錄教務系統
登錄后發現找不到login,所以我在手機上的華師匣子里點開教務系統然后找到了登錄教務系統的url
然后可以直接用session攜帶著cookie值對這個url進行請求(這里登錄教務系統是為了之后的一個引數的獲取)
查看成績

這又是一個post請求,可以直接用session攜帶著cookie值對其發起請求,然后找到引數,發現nd值也是一直在變,于是到教務系統的界面進行尋找

也是在一個標簽中
登錄教務系統,并獲取成績查詢所需的引數nd
def get_nd():
login_url = 'http://xk.ccnu.edu.cn/jwglxt/xtgl/index_initMenu.html?jsdm=&_t=1613272719507'
login_response = session.post(url=login_url, headers=headers)
nd = etree.HTML(login_response.text).xpath('/html/body/div[1]/div/div/a/img/@src')[0].split('=')[-1]
return nd
最后獲取成績查詢頁面的資料
查看成績查詢結果
grade_url = 'http://xk.ccnu.edu.cn/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005&su=2020213351'
data = {
"xnm":"2020",
"xqm":"3",
"_search":"false",
"nd":get_nd(),
"queryModel.showCount":"15",
"queryModel.currentPage":"1",
"queryModel.sortName":"",
"queryModel.sortOrder":"asc",
"time":"0"
}
grade_response = session.post(url=grade_url, data=data, headers=headers)
page_text = grade_response.text
print(grade_response.status_code)
完整代碼如下
import requests
from lxml import etree
# 進行UA偽裝,實體化一個Session物件,用于存盤登錄后的cookie值
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:78.0) Gecko/20100101 Firefox/78.0'
}
session = requests.Session()
# 獲取登錄需要的引數lt
def get_lt(url):
lt_text = session.get(url=url, headers=headers).text
lt = etree.HTML(lt_text).xpath('/html/body/div/div/div[2]/div/form/section[4]/input[1]/@value')[0]
return lt
# 模擬登錄
username = input('用戶名:')
password = input('密碼:')
url = "https://account.ccnu.edu.cn/cas/login?service=http%3A%2F%2Fxk.ccnu.edu.cn%2Fsso%2Fpziotlogin"
data = {
"username": username,
"password": password,
"lt": get_lt(url),
"execution": "e1s1",
"_eventId": "submit",
"submit": "登錄"
}
response = session.post(url=url, data=data, headers=headers)
# 登錄教務系統,并獲取成績查詢所需的引數nd
def get_nd():
login_url = 'http://xk.ccnu.edu.cn/jwglxt/xtgl/index_initMenu.html?jsdm=&_t=1613272719507'
login_response = session.post(url=login_url, headers=headers)
nd = etree.HTML(login_response.text).xpath('/html/body/div[1]/div/div/a/img/@src')[0].split('=')[-1]
return nd
# 查看成績查詢結果
grade_url = 'http://xk.ccnu.edu.cn/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005&su=2020213351'
data = {
"xnm":"2020",
"xqm":"3",
"_search":"false",
"nd":get_nd(),
"queryModel.showCount":"15",
"queryModel.currentPage":"1",
"queryModel.sortName":"",
"queryModel.sortOrder":"asc",
"time":"0"
}
grade_response = session.post(url=grade_url, data=data, headers=headers)
page_text = grade_response.text
print(grade_response.status_code)
# 持久化存盤
def store_forever():
with open('華師.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
# 呼叫函式
store_forever()
需要注意的是headers中的user-agent 需要自己找并修改
運行結果出現200,表示成功,打開華師.html可以看到自己的成績,當然,也可以再寫一段python程式將成績存入Excel表格中,
不過看成績只是一些基本需求,成績都能看,那么搶課或者搶座也自然能實作了,
如果是小白的話,request模塊和lxml模塊需要自行下載

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261070.html
標籤:python
下一篇:爬取小說并保存到資料庫中
