由于近期在學(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,并獲取,如下:

找到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í)。