人生苦短,我用Python--爬虫模拟登陆教务处并且保存数据到本地

栏目:行业动态  时间:2017-03-08
手机版

刚开始接触Python,看很多人玩爬虫我也想玩,找来找去发现很多人用网络爬虫干的第一件事就是模拟登陆,增加点难度就是模拟登陆后在获取数据,但是网上好少有Python 3.x的模拟登陆Demo可以参考,加上自己也不怎么懂Html,所以这第一个Python爬虫写的异常艰难,不过最终结果还是尽如人意的,下面把这次学习的过程整理一下。

工具

- 系统:win7 64位系统

- 浏览器:Chrome

- Python版本:Python 3.5 64-bit

- IDE:JetBrains PyCharm (貌似很多人都用这个)

我把目标瞄准了我们的教务处,这次爬虫的目的是从教务处获取成绩并且把成绩输入Excel表格中保存起来,

我们学校教务处的地址是: ,往常每次我们获取成绩都需要先进入教务处,然后点击成绩查询,输入公共的账号密码进入,最后输入相关信息获取成绩表格,这里登陆不需要验证码省了我一番功夫,这样我们先进入成绩查询系统登陆界面,先看看怎么模拟登陆这个过程,在Chrome浏览器下按F12打开开发者面板:

这里我们学校的教务处查询系统的密码是公共的jwc也就是拼音缩写,我们输入用户名和密码点击登陆,这时候注意POST请求:

发现了什么,好像Chrome并没有把Post提交的表单信息保留下来直接跳转到了另一个界面然后展示另一个界面的数据,这里就需要我们自己动手操作一下,注意开发者面板左上角的小红点表示这时候正在抓取数据,如果点击一下就会变成灰色,就可以变相地保存下当时抓取到的包,我在点击登陆后新界面未刷新出来之前点击了这个小红点,如愿以偿的得到了Post的表单数据:

这样就获取了浏览器在登陆时候向服务器传递的表单数据,看一下这个表单都有些什么:

这里看到我们需要传递三个参数,分别是:user、pass、Submit,可以很容易的理解这几个单词的字面意思,这样有了思路,我们就可以写出这次代码的第一步:模拟登陆教务处

直接上代码:

这里解释一下上面的代码,上面的 并不是浏览器上显示的地址,我们要获取真正的地址,在Chrome下右键–查看网页源代码,找到这么一行:

这个才是真正的地址,点击这个地址转入的才是真正的界面,因为这里成绩数据较多,所以这里采用了分页显示,这个说明是第一页,这个参数是可变的需要我们传入,还有后面的是我们输入的学号,这样我们就可以拼接出Url地址:

同样使用Post方法传递数据并获取响应的内容:

这里采用Beautiful Soup 4.2.0来解析返回的响应内容,因为我们要获取的是成绩,这里到教务处成绩查询界面,查看获取到的成绩在网页中是以表格的形式存在:

观察表格的网页源代码:

这里拿出第一行举例,虽然我不太懂Html但是从这里可以看出来 代表的是一行,而应该是代表这一行中的每一列,这样就好办了,取出每一行然后分解出每一列,打印输出就可以得到我们要的结果:

这里分解每一列的时候要小心,因为这里表格分成了三页显示,每页最多显示30条数据,这里因为只是收集已经毕业的学生的成绩数据所以不对其他数据量不足的学生成绩的情况做统计,默认收集的都是大四毕业的学生成绩数据。这里采用两个变量和分别代表行和列:

这里查了很多别人的博客都是用正则表达式来分解数据,表示自己的正则写的并不好也尝试了但是没成功,所以无奈选择这种方式,如果有人有测试成功的正则欢迎跟我说一声,我也学习学习。

把数据保存到Excel

因为已经清楚了这个网页保存成绩的具体结构,所以顺着每次循环解析将数据不断加以保存就是了,这里使用写入数据到Excel,因为模块打印输出到Excel中的样式宽度偏小,影响观看,所以这里还加入了一个方法去控制打印到Excel表格中的样式:

运用到代码中:

最后稍加整合,写成一个方法:

在模拟登陆操作后增加一个判断:

最后在中这么调用:

在PyCharm下按++快捷键运行程序:

控制台会有如下输出(这里只截取部分,不要吐槽没有对齐,这里我也用了格式化输出还是不太行,不过最起码出来了结果,而且我们的目的是输出到Excel中不是吗)

然后去程序根目录找看看有没有生成一个叫的文件,我的程序就放在桌面,所以去桌面找:

点开查看是否成功获取:

至此,大功告成

小结

刚开始接触Python一个星期的样子,这次写了这么一个简单的网络爬虫检验一下学习成果,虽然程序还有些许Bug,不过总归得到了一定收获,当然也为下一步学习打下了基础,嗯哼,为了接下来批量获取网络上美女图片并分类保存我会继续自学Python,荆轲刺秦王~

源码

上一篇:【君君微分享】珍爱自己·女性自我形象管理
下一篇:2015四川西南交通大学教务处招聘2人公告

最近更新行业动态