用python爬取正方系统获取课表
由于近期在学习python,看到别人写过这个,自己也练习一下,
所以就拿正方教务系统联系爬取课表。
写的不咋的,但是效果达到就好。
首先分析页面
分析页面推荐chrome,进入页面点击F12打开开发者工具,切换到Network
随便输入下账号密码,我们可以看到Headers和提交的表单信息
登录表单post表单
不同的学校可能提交的不一样,但也大同小异。我们可以看到提交的有:
__VIEWSTATE,__EVENTVALIDATION,TextBox1,TextBox2,TextBox3,RadioButtonList1,Button1,
通过分析我们知道TextBox1表示账号,TextBox2是密码,TextBox3是验证码,RadioButtonList1是身份
其他的我们可以直接复制(包括表头信息),我们填写的也就这几个。验证码由于还没有深入研究,还是采用下载到本地,手动输入的方式吧。
获取验证码
获取验证码值得注意的是登陆时身份要转换一下:在表单中点击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("学号:")
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=学号&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()
参考别人的还是很多的,这些东西大家还是要多动手练习练习。