刚学了大概两周的python ,顺便搞了下爬虫。试着用python模拟登录学校的教务系统。

看了个教程,附上链接

参照教程做了一下,发现系统经过一些变动,原教程还有很多可以改进的地方

准备工作

先来看一下系统的长相

由此可以看出表单中有四个数据是要我们输入的

在浏览器中F12 打开开发者模式, 先用错误的信息登录一下

比如:账号123 密码123456 验证码123 单选学生


找到刚才提交的数据Form Data ,含有登陆时输入的数据

其中还有一些奇怪的数据 _VIEWSTATE等

然后我们进行元素审查


可以知道_VIEWSTATE的Value值,并且每次的操作的值不同,说明是随机产生的,并且可以在文本中直接获取,所以可以用BeautifulSoup库将值取出来。

有关验证码的获取


图片的链接就应该是

目前为止,已经知道要post的数据了

这里写一下登录原理

与原教程不尽相同,我先给一个session对象用来登录以及后续操作,而教程是在获取到验证码等操作之后(也就是发送登录请求的时候)给session

我按教程写,发现验证码总也得不到正确的,所以我就先造了个session

为了避免一些麻烦,把header也加进去了

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": "http://jwxt.xxxxxx.edu.cn/jndx/default2.aspx",
"Host": "jwxt.xxxxxxx.edu.cn", "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": "http://jwxt.xxxxxx.edu.cn/jndx/default2.aspx",
"Host": "jwxt.xxxxxx.edu.cn",
"Cache-Control": "max-age=0"
}
URL = "http://jwxt.xxxxxx.edu.cn/jndx/default2.aspx"
URL_CODE = "http://jwxt.xxxxxx.edu.cn/jndx/CheckCode.aspx"
S = requests.session()
# 获取登录数据的函数 url为登录页面
def get_post_data(url):
re = S.get(url)
soup = BeautifulSoup(re.text, 'lxml')
viewState = soup.find('input', attrs={'name': '__VIEWSTATE'})['value']
cookies = requests.utils.dict_from_cookiejar(S.cookies)
# 把cookie转变成字典类型
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("验证码:")
# post的登录数据
login_info = {
"__VIEWSTATE": viewState,
"TextBox1": user,
"TextBox2": pwd,
"TextBox3": checkCode,
"RadioButtonList1": "%D1%A7%C9%FA",
"Button1": "",
"lbLanguage": ""
}
return login_info
# 登录操作 url为登录界面 data为登录账号密码
def login(url, data):
req = S.post(url=url, data=data, headers=header)
print(req.text)
# 判断登录数据是否正确 如果正确输出绩点(以绩点为例),如果错误 显示错误类型 并重新执行程序
if judge(req.text) == 1:
content_req = S.get("http://jwxt.xxxxxx.edu.cn/jndx/content.aspx")
soup2 = BeautifulSoup(content_req.text, 'lxml')
score = soup2.find('span', attrs={'id': 'lblxfts'})
print(score.text)
else:
print(judge(req.text))
print("重新登录")
main()
# 判断函数 script是提取js弹窗信息 返回值1为登录成功
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()

不知道怎么回事,代码写进去格式就改了,缩进都没了

第一次写文章,有什么写的不好的希望大家见谅,也希望得到大家的建议。