刚刚进入假期,学校开放了期末成绩查询,奈何正方教务的各种卡顿。很多学弟学妹问有没有好办法能够解决,闲来无事写了一段自动获取的爬虫程序练练手。
环境Python3.7
Jupyter
主要库requests
BeautifulSoup
PIL
pandas
老气的登录界面...
一、分析及获取登录提交数据
首先观察网页,由于这个地方比较简单,我们就使用Chrome的开发者工具中的Network抓包。
把css 图片之类的过滤掉,发现了包含学号、密码等内容的表单被提交到default2.aspx
分析POST过去的字段
总共提交了9个参数(因学校而异,不过关键字段都差不多),其中txtUserName是学号、TextBox2是密码、RadioButtonList1是学生选项(登录身份选项),还有个txtSecretCode是验证码。
除了这些常规数据外,我发现还有__VIEWSTATE这种特殊字段,这里做一个简要介绍。__VIEWSTATE:
ViewState是http://ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。
当请求某个页面时,http://ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,http://ASP.NET分析回传的窗体属性,并赋给控件对应的值。
现在我们知道这个字段肯定是不可缺少的,那么它们可以从哪获取到呢?
我们右键查看网页的源代码,在源代码中发现了type为hidden的输入框,它们的值正是我们所需要的
在这个地方,我们可以构造一个login_info字段作为登录数据:
# post的登录数据
login_info = {
"__