教务处爬虫
教务处爬虫(提交表单模拟登录)
1.尝试分析登陆方式
发现教务处是POST,请求表单的方式获得账号密码.
查看表单格式:
Form Data={
muser:学号,(明文显示)
passwd:密码,(明文显示)
x:点击处横坐标,
y:点击处纵坐标
}
x,y这两个数据是这个图中LOGIN按钮上的坐标,你鼠标点击它的时候,坐标会发给服务器.
2.用最简单的requests库实现模拟登录进教务处
首先创建一个会话session,使用post方式发给登录接口('http://59.77.226.32/logincheck.asp')
import requests headers={ 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Origin': 'http//jwch.fzu.edu.cn', 'Proxy-Connection': 'keep-alive', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'Referer': 'http://jwch.fzu.edu.cn/', } formData = { 'muser': '你的账号', 'passwd': '你的密码', 'x':23, 'y':23,#(x,y)是按钮的确定框的坐标 } def request(): url = 'http://59.77.226.32/logincheck.asp' session=requests.session() #创建一个会话 response=session.post(url,headers=headers,data=formData) #post请求提交表单 print(response.status_code)#返回状态码 print(response.text)#返回html文本 if __name__=='__main__': request()
运行结果应如下:
{{图4.PNG(uploading...)}}
对代码观察发现,登陆后的教务处是由多个内嵌页面组成.所以我们继续再会话后面追加请求.我们只要分析出这些内嵌页面的api即可完成.
3.分析内嵌页面的api
这四个文件aspx文件,就是我们要找的文件,接口地址分别是:
| http://59.77.226.35/default.aspx?id=20199131939864460 |
| http://59.77.226.35/top.aspx?id=20199131939864460 |
| http://59.77.226.35/left.aspx?id=20199131939864460 |
| http://59.77.226.35/right.aspx?id=20199131939864460 |
对着四个地址格式进行分析:
固定地址+文件名.aspx+id
id的值应该是请求时间如2019/9/13/19:39:86:44:60
这个时间的生成是不需要我们操作的,如果我们仔细观察网页源代码,即可发现,模拟登录时,网站已经返回给我们参数了.
使用正则表示式提取.
4.会话下请求内嵌页面
-
通过正则表达式提取时间id,然后组装成aspx地址
default: http://59.77.226.35/default.aspx?id=20199149551280317
top: http://59.77.226.35/top.aspx?id=20199149551280317
left: http://59.77.226.35/left.aspx?id=20199149551280317
right: http://59.77.226.35/right.aspx?id=20199149551280317
然后紧接前面的会话下,对上面的四个地址进行get请求,得到返回.
值得注意的一件事是:需要修改headers请求头中的'Referer'值,针对不同地址的Referer属性是不同的
修改后的代码如下:
rootUrl='http://59.77.226.35/' def request(): url = 'http://59.77.226.32/logincheck.asp' session=requests.session() #创建一个会话 response=session.post(url,headers=headers,data=formData) #post请求提交表单 html=response.text #正则提取 top=re.search(r'top\.aspx\?id=\d+',html).group() num = re.search(r'=\d+',top).group()[1:] #拼接地址 top=rootUrl+'top.aspx?id='+num left=rootUrl+'left.aspx?id='+num right=rootUrl+'right.aspx?id='+num default=rootUrl+'default.aspx?id='+num headers_clone = headers #重新搞一个请求头 headers_clone['Referer']=left #发送get请求 res = session.get(top, headers=headers_clone) print(res.text)
可以获得下面信息
5.拿到更多信息
根据上面的代码,我们可以继续分析其他页面的地址,拿到更多的个人信息
比如拿到个人信息:
本博客仅用于学习参考.
本文作者:SheepHuan
本文链接:https://www.cnblogs.com/sheephuan/p/11518561.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步