python爬虫登录正方教务管理系统获取成绩数据
本程序以四川理工學院教務管理系統為例。。。。
準備工作:1.ruquests庫的使用(或者urllib也可行)
? ? 2.正則表達式的書寫
? ? ? ? ? ? ? ? ? ? 3.HTTP通信基礎
? ? ? ? ? ? ? ? ? ? 4.一些解析庫的使用
準備一個瀏覽器監視工具,這里我是用的是fiddler下載地址點擊打開鏈接
登錄官網獲取到登錄系統url:http://61.139.105.138/default2.aspx
這里可以知道瀏覽器是先請求登錄頁面,讓后轉到去獲取驗證碼圖片。
仔細分析驗證碼連接發現:
這個請求方式是get但包含有cookies
所以模擬登錄前獲取驗證碼時需要帶上cookies否則登錄會一直提示驗證碼錯誤
查看發送的請求
__VIEWSTATE可以在登錄頁面的腳本中捕捉到 后面的數據便是post請求需要帶上的數據
最后對于網頁上的驗證碼問題,這里選擇下載驗證碼圖片并自動打開。
下面貼上模擬登錄的代碼
import requests import re from html.parser import * import urllib.request import os x=[] state=[] class Scraper(HTMLParser):def handle_starttag(self,tag,attrs):if tag=='img':#驗證碼attrs=dict(attrs)if(attrs.__contains__('id')):x.append(attrs["src"])if tag=='input':#viewstateattrs=dict(attrs)if attrs.__contains__('name'):if attrs['name']=='__VIEWSTATE':state.append(attrs['value'])webpage=requests.get(url="http://61.139.105.138/default2.aspx") Cookie=webpage.cookies#獲取網頁cookies date=webpage.text parser=Scraper() parser.feed(date) headers={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; TheWorld 7)',} while True:url="http://61.139.105.138/CheckCode.aspx"#驗證碼所在連接pic=requests.get(url,cookies=Cookie,headers=headers)if os.path.exists(r'f://yanzheng.jpg'):os.remove(r'f://yanzheng.jpg')with open(r'f://yanzheng.jpg','wb')as f:f.write(pic.content)f.close()username=input("輸入用戶名: ")password=input("輸入密碼 ")os.startfile(r'f:yanzheng.jpg')ycode=input("輸入彈出的驗證碼: ")payload={'__VIEWSTATE':state[0],'txtUserName':username,'TextBox2':password,'txtSecretCode':ycode,'RadioButtonList1':'%D1%A7%C9%FA','Button1':"",'lbLanguage':'','hidPdrs':'','hidsc':'',}Log_in=r"http://61.139.105.138/default2.aspx"r=requests.post(url=Log_in,data=payload,headers=headers,cookies=Cookie)#用正則算了pat=r'<title>(.*?)</title>'#獲取標題的正則表達式x=re.findall(pat,r.text)if(x[0]=="歡迎使用正方教務管理系統!請登錄"):print("登陸失敗")albert="defer>alert\('(.*?)'\)"err=re.findall(albert,r.text)print(err[0])else:print("登陸成功")過程中遇到需要判斷登錄是否成功,這里選擇識別標記字符,我這邊抓取了網頁的標題,如果不成功標題就會是"歡迎使用正方教務管理系統!請登錄"
在登錄失敗的情況下依然可以通過正則表達式獲取登錄失敗信息
最后便是進入成績查詢界面,依舊先通過fiddler觀察瀏覽器的行為:
? ? 可以看出get請求相關信息是學號,姓名,項目代碼(姓名可以在登錄頁面抓取)
? ? 值得注意的是headers中必須含有referer否則會被彈出
? ? 下面貼出相關代碼:
#抓一下名字catch='<span id="xhxm">(.*?)</span></em>'name=re.findall(catch,r.text)name=name[0]name=name[:-2]print(name)break name=str(name).replace(r'\x','%')#擴大適用性 name=name.upper() name=name[2:]lheaders={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; TheWorld 7)','Referer':'http://61.139.105.138/xs_main.aspx?xh='+username#擴大適用性} html=requests.get("http://61.139.105.138/xscjcx_dq.aspx?xh="+username+"&xm="+name+"&gnmkdm=N121605",cookies=Cookie,headers=lheaders) #最后處理成績信息 selectall=r'<td>(.*?)</td>'*17 result=re.findall(selectall,html.text) xm=result[0]#項目分離 forma=[] temp='' for i in range(17):forma.append('')#17位的數據存放處理好的數據 for index in range(17):for item in result:temp=format("% -15s"%str(item[index]).strip())forma[index]+=tempfor each in forma:print(each) input("查詢結束按下任意鍵退出")這就是整個爬蟲實現的過程,允許相關輸入錯誤后再次輸入
最后貼上整個項目代碼:
import requests import re from html.parser import * import urllib.request import os import csv x=[] state=[] class Scraper(HTMLParser):def handle_starttag(self,tag,attrs):if tag=='img':#驗證碼attrs=dict(attrs)if(attrs.__contains__('id')):x.append(attrs["src"])if tag=='input':#viewstateattrs=dict(attrs)if attrs.__contains__('name'):if attrs['name']=='__VIEWSTATE':state.append(attrs['value'])webpage=requests.get(url="http://61.139.105.138/default2.aspx") Cookie=webpage.cookies#獲取網頁cookies date=webpage.text parser=Scraper() parser.feed(date) headers={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; TheWorld 7)',} while True:url="http://61.139.105.138/CheckCode.aspx"#驗證碼所在連接pic=requests.get(url,cookies=Cookie,headers=headers)if os.path.exists(r'f://yanzheng.jpg'):os.remove(r'f://yanzheng.jpg')with open(r'f://yanzheng.jpg','wb')as f:f.write(pic.content)f.close()username=input("輸入用戶名: ")password=input("輸入密碼 ")os.startfile(r'f:yanzheng.jpg')ycode=input("輸入彈出的驗證碼: ")payload={'__VIEWSTATE':state[0],'txtUserName':username,'TextBox2':password,'txtSecretCode':ycode,'RadioButtonList1':'%D1%A7%C9%FA','Button1':"",'lbLanguage':'','hidPdrs':'','hidsc':'',}Log_in=r"http://61.139.105.138/default2.aspx"r=requests.post(url=Log_in,data=payload,headers=headers,cookies=Cookie)#用正則算了pat=r'<title>(.*?)</title>'#獲取標題的正則表達式x=re.findall(pat,r.text)if(x[0]=="歡迎使用正方教務管理系統!請登錄"):print("登陸失敗")else:print("登陸成功")#抓一下名字catch='<span id="xhxm">(.*?)</span></em>'name=re.findall(catch,r.text)name=name[0]name=name[:-2]print(name)break name=str(name).replace(r'\x','%')#擴大適用性 name=name.upper() name=name[2:]lheaders={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; TheWorld 7)','Referer':'http://61.139.105.138/xs_main.aspx?xh='+username#擴大適用性} html=requests.get("http://61.139.105.138/xscjcx_dq.aspx?xh="+username+"&xm="+name+"&gnmkdm=N121605",cookies=Cookie,headers=lheaders) #最后處理成績信息 selectall=r'<td>(.*?)</td>'*17 result=re.findall(selectall,html.text) xm=result[0]#項目分離 forma=[] csvfile=open('f://result.csv','w',newline='') writer=csv.writer(csvfile) temp='' for i in range(17):forma.append('')#17位的數據存放處理好的數據 for index in range(17):for item in result:temp=format("% -15s"%str(item[index]).strip())forma[index]+=tempfor each in forma:print(each)for num,item in enumerate(result):for index,value in enumerate(item):#處理下result里面的無規則數據if value=="?":result[num][index]=''for item in result:writer.writerow(item) csvfile.close() input("爬蟲完成,結果存在F盤result.csv文件下")
總結
以上是生活随笔為你收集整理的python爬虫登录正方教务管理系统获取成绩数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11个热门物联网开发平台的比较
- 下一篇: python删除文件部分内容_Pytho