前几天在爬学校的考试系统,不过用 Requests 操作登入不管怎样就是进不去,后来发现表单提交数据中还有三栏隐藏的神秘资讯,Google 后才发现,原来 ASPX 页面要登入可不是单单打密码这么简单,这篇文章就让我们来教学如何爬 ASPX 页面吧。
首先我们要找到表单的隐藏资讯,使用 Chrome 打开登入页面,并右键 > 检查,切换到 Network 页面,接着,输入 错误 的账号密码,并提交,提交后会发现旁边的 Network 页面多了一些纪录资讯出来
图中的 Form Data 字段,就是我们登入所需要的所有数据啦
上图以学校考试系统为例,表单的提交资讯还包含了__VIEWSTATE
__VIEWSTATEGENERATOR __EVENTVALIDATION,这三个隐藏资讯,拿到这些东西之后就可以准备继续动工了
继续动工
首先开头我们先引入 BeautifulSoup 和 requests
我使用的版本为:Python 3.7、BeautifulSoup4
1
2from bs4 import BeautifulSoup
import requests
接着是重点部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14with requests.Session() as s:
page = s.get('https://portal.stust.edu.tw/examseat/login.aspx')
soup = BeautifulSoup(page.content, 'lxml')
payload_loginPage = {
'txtStud_No': 'YOUR USERNAME',
'txtPasswd': 'YOUR PASSWORD',
'Button1': '登入'
}
payload_loginPage["__VIEWSTATE"] = soup.select_one("#__VIEWSTATE")["value"]
payload_loginPage["__VIEWSTATEGENERATOR"] = soup.select_one("#__VIEWSTATEGENERATOR")["value"]
payload_loginPage["__EVENTVALIDATION"] = soup.select_one("#__EVENTVALIDATION")["value"]
s.post('https://portal.stust.edu.tw/examseat/login.aspx', data=payload_loginPage)
第 1 行:首先我们把 Requests 模块中的 session 功能叫出并简称为 s
第 2 行:利用 HTTP Requests Methods 中的 GET 方法取得登入页面,并存于 page 当中
关于 HTTP Requests Methods,可以看这边的说明 英文版、中文版
第 3 行:使用 Beautiful Soup 对 page 的内容(content) 进行处理
第 5-9 行:表单的可视化部分,冒号前方为表单字段名称,后方为字段数值
第 11-13 行:自动带入这一坨隐藏资讯的数值,
第 14 行:最后就是把上面一坨的数据用 POST 的方式送交到表单进行验证啰
成功与否
如何知道成功与否呢?
最简单的方式就是透过印出下一页的数据来确认,所以可在最后面加上
1
2page = s.get('https://portal.stust.edu.tw/examseat/Default.aspx')
print(page.text)
第 1 行:取得下一页
第 2 行:印出页面源代码