python爬虫登录正方教务管理系统获取成绩数据
本程序以四川理工學(xué)院教務(wù)管理系統(tǒng)為例。。。。
準(zhǔn)備工作:1.ruquests庫(kù)的使用(或者urllib也可行)
? ? 2.正則表達(dá)式的書(shū)寫(xiě)
? ? ? ? ? ? ? ? ? ? 3.HTTP通信基礎(chǔ)
? ? ? ? ? ? ? ? ? ? 4.一些解析庫(kù)的使用
準(zhǔn)備一個(gè)瀏覽器監(jiān)視工具,這里我是用的是fiddler下載地址點(diǎn)擊打開(kāi)鏈接
登錄官網(wǎng)獲取到登錄系統(tǒng)url:http://61.139.105.138/default2.aspx
這里可以知道瀏覽器是先請(qǐng)求登錄頁(yè)面,讓后轉(zhuǎn)到去獲取驗(yàn)證碼圖片。
仔細(xì)分析驗(yàn)證碼連接發(fā)現(xiàn):
這個(gè)請(qǐng)求方式是get但包含有cookies
所以模擬登錄前獲取驗(yàn)證碼時(shí)需要帶上cookies否則登錄會(huì)一直提示驗(yàn)證碼錯(cuò)誤
查看發(fā)送的請(qǐng)求
__VIEWSTATE可以在登錄頁(yè)面的腳本中捕捉到 后面的數(shù)據(jù)便是post請(qǐng)求需要帶上的數(shù)據(jù)
最后對(duì)于網(wǎng)頁(yè)上的驗(yàn)證碼問(wèn)題,這里選擇下載驗(yàn)證碼圖片并自動(dòng)打開(kāi)。
下面貼上模擬登錄的代碼
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':#驗(yàn)證碼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#獲取網(wǎng)頁(yè)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"#驗(yàn)證碼所在連接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("輸入用戶(hù)名: ")password=input("輸入密碼 ")os.startfile(r'f:yanzheng.jpg')ycode=input("輸入彈出的驗(yàn)證碼: ")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>'#獲取標(biāo)題的正則表達(dá)式x=re.findall(pat,r.text)if(x[0]=="歡迎使用正方教務(wù)管理系統(tǒng)!請(qǐng)登錄"):print("登陸失敗")albert="defer>alert\('(.*?)'\)"err=re.findall(albert,r.text)print(err[0])else:print("登陸成功")過(guò)程中遇到需要判斷登錄是否成功,這里選擇識(shí)別標(biāo)記字符,我這邊抓取了網(wǎng)頁(yè)的標(biāo)題,如果不成功標(biāo)題就會(huì)是"歡迎使用正方教務(wù)管理系統(tǒng)!請(qǐng)登錄"
在登錄失敗的情況下依然可以通過(guò)正則表達(dá)式獲取登錄失敗信息
最后便是進(jìn)入成績(jī)查詢(xún)界面,依舊先通過(guò)fiddler觀察瀏覽器的行為:
? ? 可以看出get請(qǐng)求相關(guān)信息是學(xué)號(hào),姓名,項(xiàng)目代碼(姓名可以在登錄頁(yè)面抓取)
? ? 值得注意的是headers中必須含有referer否則會(huì)被彈出
? ? 下面貼出相關(guān)代碼:
#抓一下名字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','%')#擴(kuò)大適用性 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#擴(kuò)大適用性} html=requests.get("http://61.139.105.138/xscjcx_dq.aspx?xh="+username+"&xm="+name+"&gnmkdm=N121605",cookies=Cookie,headers=lheaders) #最后處理成績(jī)信息 selectall=r'<td>(.*?)</td>'*17 result=re.findall(selectall,html.text) xm=result[0]#項(xiàng)目分離 forma=[] temp='' for i in range(17):forma.append('')#17位的數(shù)據(jù)存放處理好的數(shù)據(jù) 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("查詢(xún)結(jié)束按下任意鍵退出")這就是整個(gè)爬蟲(chóng)實(shí)現(xiàn)的過(guò)程,允許相關(guān)輸入錯(cuò)誤后再次輸入
最后貼上整個(gè)項(xiàng)目代碼:
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':#驗(yàn)證碼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#獲取網(wǎng)頁(yè)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"#驗(yàn)證碼所在連接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("輸入用戶(hù)名: ")password=input("輸入密碼 ")os.startfile(r'f:yanzheng.jpg')ycode=input("輸入彈出的驗(yàn)證碼: ")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>'#獲取標(biāo)題的正則表達(dá)式x=re.findall(pat,r.text)if(x[0]=="歡迎使用正方教務(wù)管理系統(tǒng)!請(qǐng)登錄"):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','%')#擴(kuò)大適用性 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#擴(kuò)大適用性} html=requests.get("http://61.139.105.138/xscjcx_dq.aspx?xh="+username+"&xm="+name+"&gnmkdm=N121605",cookies=Cookie,headers=lheaders) #最后處理成績(jī)信息 selectall=r'<td>(.*?)</td>'*17 result=re.findall(selectall,html.text) xm=result[0]#項(xiàng)目分離 forma=[] csvfile=open('f://result.csv','w',newline='') writer=csv.writer(csvfile) temp='' for i in range(17):forma.append('')#17位的數(shù)據(jù)存放處理好的數(shù)據(jù) 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里面的無(wú)規(guī)則數(shù)據(jù)if value=="?":result[num][index]=''for item in result:writer.writerow(item) csvfile.close() input("爬蟲(chóng)完成,結(jié)果存在F盤(pán)result.csv文件下")
總結(jié)
以上是生活随笔為你收集整理的python爬虫登录正方教务管理系统获取成绩数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 11个热门物联网开发平台的比较
- 下一篇: python删除文件部分内容_Pytho