以下是我們學校對於期末考試成績臨時查詢的一個網站
我突發奇想,可不可以通過爬蟲的方式批量獲取成績信息
於是說干就干
首先觀察網頁的請求
通過查看,我們可以很明顯看到網站查詢是通過對https://wxzx.cqyti.com/wxProject/ScoreQuery.do進行post請求而來的,令人驚訝的是網頁上要填寫的姓名和輔導員根本沒有post上去
這大大降低了我們爬取數據的難度!!!
我們可以看到,只post了三個數據 分別是
所以我們只需要通過循環生成xh所對應的學號 在帶上固定的“year”和“term”即可
首先載入所需要的庫
import requests import re
定義請求的url和偽裝請求頭
#定義請求的url url = 'https://wxzx.cqyti.com/wxProject/ScoreQuery.do' #定義請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0' }
接下來就是獲取數據了
首先我們需要打開一個文本文件用於寫入最終的結果
我們定義一個sum來提示我們已經錄入了多少
#post的數據 file = open("E:/成績.txt", "w") sum = 0 #用於提示總共記錄了多少學生 for i in range(2019211600,2019211711): head = '學號為%d的同學的成績\n'%(i) #准備好同學的學號用於寫入 print (head) #用於提醒正在記錄的同學的學號 data = {'xh' : str(i) , 'year' :'2019-2020' , 'term':'1' } #定義data 將生成的學號放入 # 發起post請求 res = requests.post(url=url ,headers=headers,data =data) data_get = res.json()
接下來我們來分析一下所保存的data文件
我們可以很清楚的看到我們所需要的信息就在data_get中的"xskscj”內的 "scorename"與"value"中因此我們可以直接從data_get中切片選取
#寫入文本 k = 0 #初始化k的值,用於接下來遍歷字典 file.write(head) #將學號寫入文本 for ii in data_get['xskscj']: #通過循環遍歷字典將成績和學號寫入文本 kecheng = data_get['xskscj'][k]['scorename'] fenshu = data_get['xskscj'][k]['value'] k=k+1 jieguo = kecheng + ':' + str(fenshu)+'分 ' print(jieguo) file.write(jieguo) file.write('\n') print('錄入成功') sum= sum + 1 # 用於計算錄入的同學總數 print('共計錄'+ str(sum) + '名同學')
最后記得關閉文本文件
file.close() #關閉文本文件
最后經過簡單的調試就ok啦