用python爬取正方系統(tǒng)獲取課表

由于近期在學(xué)習(xí)python,看到別人寫過這個,自己也練習(xí)一下,

所以就拿正方教務(wù)系統(tǒng)聯(lián)系爬取課表。

寫的不咋的,但是效果達(dá)到就好。

首先分析頁面

分析頁面推薦chrome,進(jìn)入頁面點擊F12打開開發(fā)者工具,切換到Network

隨便輸入下賬號密碼,我們可以看到Headers和提交的表單信息


登錄表單

post表單

不同的學(xué)??赡芴峤坏牟灰粯樱泊笸‘?。我們可以看到提交的有:

__VIEWSTATE,__EVENTVALIDATION,TextBox1,TextBox2,TextBox3,RadioButtonList1,Button1,

通過分析我們知道TextBox1表示賬號,TextBox2是密碼,TextBox3是驗證碼,RadioButtonList1是身份

其他的我們可以直接復(fù)制(包括表頭信息),我們填寫的也就這幾個。驗證碼由于還沒有深入研究,還是采用下載到本地,手動輸入的方式吧。

獲取驗證碼


獲取驗證碼

值得注意的是登陸時身份要轉(zhuǎn)換一下:在表單中點擊view decoded就可以看到身份變成了:%D1%A7%C9%FA

解決了驗證碼后登陸就沒什么大問題了。

分析課程表頁面

和登陸時一樣,我們找到課程表的頁面看一下請求


課程表頁面

接下來就是找到課程表table,并獲取,如下:


找到table的id

找到id,這樣就可以開心的去敲代碼了。

import os

import requests

from bs4 import BeautifulSoup

from PIL import Image

header = {

? ? "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",

? ? "Accept-Encoding": "gzip, deflate, sdch",

? ? "Accept-Language": "zh-CN,zh;q=0.8",

? ? "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; \

? ? ? ? .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)",

? ? "Referer": "你的地址",

? ? "Host": "你的地址", "Upgrade-Insecure-Requests": "1",

? ? "Cache-Control": "max-age=0"

}

header_code = {

? ? "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; \

? ? ? ? .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)",

? ? "Referer": "你的地址",

? ? "Host": "你的地址",

? ? "Cache-Control": "max-age=0"

}

URL = "你的地址"

#驗證碼地址

URL_CODE = "你的地址/CheckCode.aspx"

S = requests.session()

def get_post_data(url):

? ? re = S.get(url).text

? ? soup = BeautifulSoup(re, 'lxml')

? ? viewState = soup.find('input', attrs={'name': '__VIEWSTATE'})['value']

? ? cookies = requests.utils.dict_from_cookiejar(S.cookies)

? ? header.update(cookies)

? ? header_code.update(cookies)

? ? code = S.get(URL_CODE, headers=header_code)

? ? with open("code.gif", "wb") as f:

? ? ? ? f.write(code.content)

? ? image = Image.open('{}/code.gif'.format(os.getcwd()))

? ? image.show()

? ? user = input("學(xué)號:")

? ? pwd = input("密碼:")

? ? checkCode = input("驗證碼:")

? ? login_info = {

? ? ? ? "__VIEWSTATE": viewState,

? ? ? ? "__EVENTVALIDATION":'/wEWCwL+3vflAwLs0bLrBgLs0fbZDALs0Yq1BQK/wuqQDgKAqenNDQLN7c0VAuaMg+INAveMotMNAoznisYGArursYYI6rWkBO0iCt49zW+5k0o6O9ssuys=',

? ? ? ? "TextBox1": user,

? ? ? ? "TextBox2": pwd,

? ? ? ? "TextBox3": checkCode,

? ? ? ? "RadioButtonList1": "%D1%A7%C9%FA",

? ? ? ? "Button1": "",

? ? ? ? "lbLanguage": ""

? ? }

? ? return login_info

def login(url, data):

? ? req = S.post(url=url, data=data, headers=header)?

? ? if judge(req.text) == 1:

? ? ? ? content_req = S.get("你的地址/xskbcx.aspx?xh=學(xué)號&xm=%CD%F5%C3%A7&gnmkdm=N121603",headers=header_code)

? ? ? ? soup2 = BeautifulSoup(content_req.text, 'lxml')

? ? ? ? score = soup2.find('table', attrs={'id': 'Table1'})? ? ? ?

? ? ? ? print(score.text)

? ? else:

? ? ? ? print(judge(req.text))

? ? ? ? print("重新登錄")

? ? ? ? main()

def judge(html):

? ? soup_judge = BeautifulSoup(html, 'html.parser')

? ? script = soup_judge.find_all('script')[0].text

? ? if "驗證碼不正確" in script:

? ? ? ? return "驗證碼錯誤"

? ? elif "用戶名不存在" in script:

? ? ? ? return "用戶名不存在"

? ? elif "密碼錯誤" in script:

? ? ? ? return "密碼錯誤"

? ? else:

? ? ? ? return 1

def main():

? ? data = get_post_data(URL)

? ? login(URL, data)

if __name__ == '__main__':

? ? main()

參考別人的還是很多的,這些東西大家還是要多動手練習(xí)練習(xí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容