项目背景
我们可以通过爬虫来模拟登录来查询自己的成绩,这其中最重要的就是登录这个关卡,只要通过了,就可以方便的查询自己的成绩了。但是我们还是要在 法律的允许条件下
爬取数据,下列的代码已进行隐私处理,并不针对任何组织。
爬虫分析
-
通过抓包,发现登录需要提交
学号
、密码
、验证码
、VIEWSTATE
-
通过分析发现 其中的
VIEWSTATE
参数就在网页中,所以我们可以通过正则表达式匹配出来
爬虫项目结构
import re
import requests
class API(object):
...
class Tool(object):
...
API 类
· 通过抓包,知道了以下接口
class API(object):
# 登录页
GET_INDEX = "http://XXXXXXXX:XXXX/"
# 获取验证码
GET_YZM_URL = 'http://XXXXXXXX:XXXX/CheckCode.aspx'
# 登录
POST_LOGIN = 'http://XXXXXXXX:XXXX/default2.aspx'
Tool 类
class Tool(object):
session = requests.session()
VIEWSTATE = ""
# 获取 VIEWSTATE 参数
@classmethod
def getHtml(cls):
response = cls.session.get(API.GET_INDEX).text
cls.VIEWSTATE = re.search(r'__VIEWSTATE" value="(.*?)" />', response).group(1)
# 下载验证码在当前路径
@classmethod
def download_yzm(cls):
yzm_image = cls.session.get(url=API.GET_YZM_URL)
with open("yzm.jpg", 'wb') as file:
file.write(yzm_image.content)
# 登录方法
@classmethod
def login(cls, account, pwd, yzm):
data = {
"__VIEWSTATE": cls.VIEWSTATE,
"TextBox1": account,
"TextBox2": pwd,
"TextBox3": yzm,
"RadioButtonList1": "%D1%A7%C9%FA",
"Button1": "",
}
response = cls.session.post(url=API.POST_LOGIN, data=data)
response.encoding = response.apparent_encoding
response = response.text
try:
message = re.search(r">alert\('(.*?)'\);</script>", response).group(1)
except:
# 登录成功 跳转到详情页
xm = re.search(r'<span id="xhxm">(.*?)同学</span>', response).group(1)
print("欢迎" + xm + "登录成功")
else:
# 打印出登录失败信息
print(message)
主函数
def main():
t = Tool() # 实例化类
t.getHtml() # 获取 VIEWSTATE
t.download_yzm() # 下载验证码
account = input("请输入你的学号:")
pwd = input("请输入你的密码:")
yzm = input("请输入验证码:")
t.login(account,pwd,yzm) # 运行登录方法