之前写了篇模拟登陆川农的文章,后来发现代码可以大大减少:
先上代码:
import requests
import re
def log_scau(id,pwd):
#本代码共分为2部分
session=requests.Session()
index = session.get('http://jiaowu.sicau.edu.cn/web/web/web/index.asp')
#第一部分,准备post提交的数据,登陆密码需要加密,所以先获取加密算法,算法就在html文档中
data=index.text
pattern = re.compile(r"dcode2=\d{10}") # 正则匹配
match = pattern.search(data)
tmp = match.group(0)
# 加密算法
dcode = pwd
dcode1 = ""
temp = int(tmp.split("=")[1])
dcode2 = "" + str(temp * 137)
length = len(dcode)
for i in range(1, length + 1):
tmpstr = dcode[i - 1:i]
dcode1 = dcode1 + chr(ord(tmpstr[0]) - i - int(dcode2[i - 1:i])) #加密后的数据
data={ #需要提交的数据
'user': id,
'pwd': dcode1,
'lb': 'S',
'submit': ''
}
#第二部分,尝试登陆
post_url='http://jiaowu.sicau.edu.cn/jiaoshi/bangong/check.asp' #验证密码的网站
try:
session.post(post_url, data=data) #先登陆验证密码网站
data=session.get('http://jiaowu.sicau.edu.cn/xuesheng/bangong/main/index1.asp')#跳转到个人主页
data.encoding='gb2312'
name=re.compile('<td width="99" align="left">(.*)</td>').findall(data.text) #正则匹配你的名字
print('欢迎你,'+name[1]) #输出欢迎你,xxx
except Exception as e:
print('登陆失败')
id=input('输入你的账号:\n')
pwd=input('输入你的密码:\n')
log_scau(id,pwd)
之前需要三步,现在只需要两步,少了添加header这一步,为什么呢?
首先我们必须了解cookie 和 session:
因为http是无状态协议,不会记录你的任何信息,但有时候你想要服务器记住一些数据(比如说密码),这时候就需要用到cookie或者session, 两者区别 ---cookie保存在本地硬盘上,session保存在服务器上,cookie有'保质期',过期失效,session过期时间由服务器决定,一般是关闭浏览器后失效。
session: 当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session对应的访问权限,然后给予回应
cookie是将数据加密后放入本地,需要用的时候发送给服务器,服务器解密后给予回应。
模拟登陆川农教务个人主页分为三步:
1,访问主页 2,访问检验密码的网站 3。密码验证成功跳转到个人主页
三步骤必须连续进行(直接用以前cookie访问的方式除外),那么怎么保证连续访问呢?
方法1:用cookie,----把主页的给的饼干(cookie)传给验证网站,让验证网站知道你是从主页来的,密码验证成功后验证网站觉得你诚实可爱,再给你些饼干(cookie),最后你把这两次给的饼干(cookie)给个人主页看,个人主页看了饼干(cookie)后知道你是自己人,允许访问。
方法2:-session,把cookie交给requests自行处理,她会自动帮你提交cookie。很贴心,细不细?
总之,session会自动帮你处理header,这样就省了不少精力,代码自然就减少了。但动态网站的header还是要自行添加的(此处略)