1.手动登陆,观察网页信息

通过Chrome手动登陆,按F12观察Network信息
Python爬虫实战:东南大学统一身份认证
Python爬虫实战:东南大学统一身份认证
Python爬虫实战:东南大学统一身份认证

通过login信息可以知道向服务器request的方式是POST,发送信息的URL是https://newids.seu.edu.cn/authserver/login?goto=http://my.seu.edu.cn/index.portal

Python爬虫实战:东南大学统一身份认证
进一步观察可以看到Post表单的格式和数据,username的值为一卡通号,password的值是一卡通密码在浏览器端通过JavaScript加密得到的数据。经过多次实验发现,dllt、_eventId、rmShown等字段的值均为固定值,而lt和execution的值会发生变换。因此,现在的任务是找出lt、execution和password的加密方式。

2.搜索网页代码寻找线索

Python爬虫实战:东南大学统一身份认证

在登陆界面网页代码中搜索lt、execution、password等字段,发现在网页中表单已经包含这些数据,不过设置为hidden不能直接观察到。因此只需要先通过爬虫访问登陆页面即可得到这些数据。

另外,我们还在表单中发现了一项pwdDefaultEncryptSalt,猜测大概率是加密使用的**。继续使用该字段作为关键词搜索,发现一个函数调用:
Python爬虫实战:东南大学统一身份认证

将这个js的代码保存至本地,通过VSCode打开。
Python爬虫实战:东南大学统一身份认证
Python爬虫实战:东南大学统一身份认证

不难发现pwdDefaultEncryptSalt作为参数传递给了另一个函数encryptAES,继续搜索,发现一个encrypt.js中包含该函数的定义:
Python爬虫实战:东南大学统一身份认证

至此,POST表单的所以秘密已经解开了,只需将密码和从网页代码中提取的pwdDefaultEncryptSalt作为参数调用这个js的encryptAES函数即可得到加密后的密码。

3.编写爬虫

爬虫使用requests、re、execjs和三个库。首先通过requests.session()建立会话并请求登陆页面,从登陆页面提取pwdDefaultEncryptSalt、execution等字段,再调用encrypt.js获得加密后的password参数。最后用得到的参数构造POST表单并发送传递给服务器即可成功登陆。
Python爬虫实战:东南大学统一身份认证

代码:
https://github.com/ruizhi11/loginSEU

相关文章:

  • 2021-10-04
  • 2022-01-22
  • 2021-11-18
  • 2022-12-23
  • 2021-08-25
  • 2021-11-11
  • 2022-12-23
  • 2021-09-21
猜你喜欢
  • 2021-12-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案