最近在学python爬虫,我想教务处官网可能是每个学生第一个自己动手爬取的网站吧。而且很多学校的教务处没有验证码,很适合初学者练手。
环境准备
本次模拟登陆用到的库除了requests外还有lxml,我们用它来提取网页中隐藏的一些关于登陆的信息,登陆成功后也可以方便地用它来获取我们想要的内容。
使用开发者工具分析登陆过程
我们进入登陆界面,打开开发者工具,勾选preserve log,这表示持续显示请求过程。打开network,可以看到所有请求过程。
输入密码后登陆,点击network中的第一个请求,这个url就是我们数据实际上传的地址,暂时称其为请求地址:
随后我们开始获取模拟登陆所必须的data和headers,headers即为上图右侧的Request Headers,我们只需要其中的Host,Referer和User-Agent。
然后查看下方的Form Data,如下图所示
Form Data中的数据就是我们要向请求网址上传的数据,可以看出,除了用户名和密码外,还有一些要上传。其中rmshown,_eventld.dllt是不变的常量,我们实际上不知道的只有lt和execution,我们退出登录后再进入登陆界面,点击检查,ctrl+F 搜索可以查到这两个值,如下图:
这样我们就得到了模拟登陆需要的所有信息。
代码实战
我们定义一个Login类来实现登陆过程,现在,我们要设置一下登陆网址,请求网址,以及目标网址(比如你想获取你的成绩,该地址就是你的成绩页面)。
class Login(object):
def __init__(self):
self.login_url = '登陆页面'
self.post_url = '请求网址'
self.logined_url = '目标网址'
self.session = requests.Session()
我们还调用了requests库中的Session,它可以帮我们维持一个会话,这样我们的cookie问题就解决了。
要得到lt,eventld,我们前面提到的lxml就派上用场了,我们根据它的xpath方法提取两个值并将其返回,将其定义在token方法中。
def get_token(self):
response = self.session.get(self.login_url, headers=self.headers)
selector = etree.HTML(response.text)
lt = selector.xpath('//div//input[1]/@value')[2]
execution = selector.xpath('//div//input[3]/@value')[0]
return (execution,lt)
接下来定义login方法,将所需要的数据存放到post_data方法中,上传到请求网址,并获取我们需要的在目标网址中的数据。
def login(self,username,password):
(execution,lt) = self.get_token()
print(execution,lt)
post_data = {
'_eventId':'submit',
'rmShown': '1',
'lt':lt,
'username': username,
'password': password,
'dllt': 'userNamePasswordLogin',
'execution': 'e1s1',
}
response = self.session.post(self.post_url,data=post_data,headers = self.headers)
if response.status_code == 200:
print('post成功')
# print(response.text)
response = self.session.get(self.logined_url,headers = self.headers)
print(response.status_code)
if response.status_code == 200:
print('获取信息成功')
504错误解决
随后在主函数中运行:
if __name__ == "__main__":
login = Login()
login.login(username='xxxxxx', password='xxxxxx')
运行后结果如下:
可以看出,我们请求界面已经成功,证明我们已经成功登陆,然而却不能访问目标地址,这里耽误了很长时间,最后发现是因为目标地址的headers和请求地址的不同,导致访问失败。我们重新定义目标地址的headers
重新运行
返回两个页面的状态码都为200,证明我们本次模拟登陆实验成功。
后记
本文未设计的验证码登陆我将会在后面的文章中补充。
如果本文对您有所帮助或启发,记得点赞哦。