1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python爬取学校教务管理系统_python爬虫模拟登陆学校教务处

python爬取学校教务管理系统_python爬虫模拟登陆学校教务处

时间:2018-07-15 13:30:59

相关推荐

python爬取学校教务管理系统_python爬虫模拟登陆学校教务处

最近在学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,证明我们本次模拟登陆实验成功。

后记

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。