python模拟登录网站_python爬虫模拟登陆学校教务处

最近在学python爬虫,我想教务处官网可能是每个学生第一个自己动手爬取的网站吧。而且很多学校的教务处没有验证码,很适合初学者练手。

环境准备

本次模拟登陆用到的库除了requests外还有lxml,我们用它来提取网页中隐藏的一些关于登陆的信息,登陆成功后也可以方便地用它来获取我们想要的内容。

使用开发者工具分析登陆过程

我们进入登陆界面,打开开发者工具,勾选preserve log,这表示持续显示请求过程。打开network,可以看到所有请求过程。

UJviAb.jpg

UJviAb.jpg

输入密码后登陆,点击network中的第一个请求,这个url就是我们数据实际上传的地址,暂时称其为请求地址:

zUfmyy.jpg

zUfmyy.jpg

随后我们开始获取模拟登陆所必须的data和headers,headers即为上图右侧的Request Headers,我们只需要其中的Host,Referer和User-Agent。

qMvem2.jpg

qMvem2.jpg

然后查看下方的Form Data,如下图所示

Jj2yYj.jpg

Jj2yYj.jpg

Form Data中的数据就是我们要向请求网址上传的数据,可以看出,除了用户名和密码外,还有一些要上传。其中rmshown,_eventld.dllt是不变的常量,我们实际上不知道的只有lt和execution,我们退出登录后再进入登陆界面,点击检查,ctrl+F 搜索可以查到这两个值,如下图:

UjiyIr.jpg

UjiyIr.jpg

这样我们就得到了模拟登陆需要的所有信息。

代码实战

我们定义一个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')

运行后结果如下:

faYJbq.jpg

faYJbq.jpg

可以看出,我们请求界面已经成功,证明我们已经成功登陆,然而却不能访问目标地址,这里耽误了很长时间,最后发现是因为目标地址的headers和请求地址的不同,导致访问失败。我们重新定义目标地址的headers

6VbArm.jpg

6VbArm.jpg

ZJvMni.jpg

ZJvMni.jpg

重新运行

MBF7Zv.jpg

MBF7Zv.jpg

返回两个页面的状态码都为200,证明我们本次模拟登陆实验成功。

后记

本文未设计的验证码登陆我将会在后面的文章中补充。

如果本文对您有所帮助或启发,记得点赞哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值