姓名:赵坤 学号:20021210734
【嵌牛导读】python语言由于其简洁、灵活的语言特性,经常被用来开发一些小工具来协助办公,爬虫就是其中广泛应用之一。网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。通俗的讲,爬虫就是能够自动访问互联网并将网站内容下载下来的的程序或脚本,类似一个机器人,能把别人网站的信息弄到自己的电脑上,再做一些过滤,筛选,归纳,整理,经过整合的数据往往能产生更大的价值。爬虫时,有的网站需要我们登录后才能访问关键信息,如淘宝,必须登陆后才能看到自己收藏的商品。因此如何完成登录操作是爬虫技术的重要一环,web通信中的登录,主要是通过cookie和session来进行确认的,今天我们就来分析一下xd一站式服务大厅的几种登陆方案。
【嵌牛鼻子】python实现xd一站式登录的3种方案
【嵌牛提问】还有其他登陆的方案嘛?
【嵌牛正文】如下:
一、如何判断我们是否登录成功?
可以使用如下网址进行验证:http://ehall.xidian.edu.cn/jsonp/userDesktopInfo.json 在登陆成功时,浏览器已经保存了认证我们信息的cookie,因此在浏览器url栏中输入该链接,可以请求到我们的个人信息(服务器认为这是一个合法请求)。
如果是非登录状态下请求上述网页,则不会请求到任何数据,如下图所示:
接下来我们会在python代码中请求这个网页,如果能成功请求到数据,则说明我们已经保持了登录的状态。
二、方案一:获取浏览器cookie保持登录
正如前面提到的,当我们在浏览器中输入账号、密码,完成登录操作后,服务器会给浏览器返回一个cookie信息,来存储我们用户的身份,因此我们只需要获取到这个cookie,就可以在python代码中也保持登陆状态,欺骗过服务器。
浏览器中获取cookie的方式有很多,每个浏览器的操作也都大同小异,我们这里使用chrome进行展示。
1、首先成功登录进入教务处,如上述图一所示页面;
2、摁一下F12,唤起chrome的开发者工具,并点击进入Network标签下,勾选下图所示内容;
3、如上提示所示,摁下ctrl+R,强制刷新页面,然后再抓到的包中,任选一个user开头的包,如我当前选取的是userSearchHistory开头的包,点击这个包,在response headers栏目下,复制出来其中的cookie信息即可。
4、python模拟发送请求,这里我们使用requests模块发送上述提到的http://ehall.xidian.edu.cn/jsonp/userDesktopInfo.json 请求,然后打印服务器返回的数据,看看其中是否包含了图二中展示的数据。
根据图七中的部分数据,我们可以看到的确和图二中的数据一致,成功请求到了我的个人信息数据,方案一讲解到此结束。
三、方案二:使用selenium完成模拟登录并获取cookie
Selenium简介:Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
selenium和chrome driver安装教程 ---没有安装的朋友可以参考这篇文章进行环境配置
从上面的介绍可以知道,使用selenium实现登录就是我们在python程序中预先制定好浏览器的操作流程,比如访问什么网页,需要点击什么按钮,在什么位置、什么时间输入什么内容等等,实际上就是用代码复现人类真实的与浏览器交互的行为,代码如下。
可以看到我们使用selenium也是成功获取到了全部的cookie信息和最终要的个人数据。
四、方案三:使用http协议实现 post 登录并逆向加密js
1、对教务处发起登录的请求进行抓包分析,发现登陆时提交的参数一共有如下7个,其中password是经过加密的,It根据经验知道是服务器返回的一串标识符,一般存在于网页源码中,后面四个参数都是固定不变的,因此我们只要找到password和It就可以了。
2、经过在网页源码中寻找,我们定位到了如下内容,都是隐藏的input标签,可以看到It在其中,并且其余的四个登陆相关参数也在其中。多次刷新网页之后也可以验证我们之前说的,It是变动的,而其余四个字段是不变的,不过我们还发现了一个不曾见到的字段“pwdDefaultEncryptSalt”,根据经验知道这是加密算法需要的“盐”。
3、接下来就只剩password加密算法的定位了,在devtools中搜索password字段,成功定位到可能存在加密的位置,并且看到了加密算法AES,而且前面提到的pwdDefaultEncryptSalt也在此处得到了应用,猜测应该是这里了。
4、重新发送一次登录请求,看能否在此处断下来,果然断下来了,只不过走的是下面的流程,经过验证后_p1的确是前面猜测pwdDefaultEncryptSalt参数,_p0是我们输入的密码123456。接下来只需要解这个加密算法即可,跳到这个AES加密算法定义的位置看看。
5、跳到了这个文件中,可以看到用的是标准的croptyJS加密的,那我们就不用扣代码了,直接在py中调用crypto库就可以了---实际上这个代码也非常的好扣,直接整个文件拿下来就可以了。
6、由于使用post协议登录这部分极可能被滥用,为了不给教务网站维护者造成困扰,这部分代码就不公布出来了,按照以上思路来做是可以正常实现登录的。希望以上分享大家能喜欢,谢谢大家看到这里。