教务处爬虫

教务处爬虫(提交表单模拟登录)

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.会话下请求内嵌页面

然后紧接前面的会话下,对上面的四个地址进行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.拿到更多信息

根据上面的代码,我们可以继续分析其他页面的地址,拿到更多的个人信息

比如拿到个人信息:

本博客仅用于学习参考.

猜你喜欢

转载自www.cnblogs.com/JustNo/p/11518561.html
今日推荐