大二的时候刚开始学的时候写的爬虫,突然翻出来再看的时候都忘了,于是心血来潮打算记下来:)
使用的库也比较基础,request和Beautifulsoup,python 3
基本的bs4语法文章中没有讲到,request略微提及,这个比较简单,用的都是基础的,自学很快就能学会。
第一步:具体思路
首先,我们需要有模拟自己登陆把用户名和密码提交给网页后台,一般来说提交的内容可以是一个字典形式,也可以是json形式的。这时候我们需要借助抓包软件来获取——到底需要上传一个什么形式的字典,内容除了用户名和密码还需要别的吗?
电子科大信息门户首页
如图是电子科大信息门户首页,输入用户名和密码才能登陆成功,我们知道request库里面有一个post的方法,用来提交表单数据(网页交互其实就是post数据和get数据的过程)然后学校服务器认证成功就登陆完成了。
其次,我们在登录成功后就需要找到一个有我们需要数据的网址,例如我想爬取自己的所有学年的成绩清单,http://eams.uestc.edu.cn/eams/teach/grade/course/person!historyCourseGrade.action对应的是电子科大的所有成绩网址(成绩不好隐藏一下=。=)
该网址显示的内容
至此就只剩下爬取相应内容了
第二步:实现过程
真正动手操作起来才能发现许多潜在的问题
首先我们需要知道上传的表单是什么样的,这里提供两种方法,去年自己用fiddler查看的,今年突然发现chorme自带也可以。
1.fidder
fiddler抓取的报文
第二种方法:chrome浏览器自带
按下f12键弹出chrome的开发者模式,点击上面标题栏的Network,然后先模拟登录一遍
注意看这个login页面对应的下面有个form Data(表单数据),里面其实就是我们提交给网页后天的信息。
通过多次比对发现除了用户名username和密码password,lt每一次登录都在变化,而剩下的值都是固定不变的。
通过搜索lt,我发现了这个数据的具体含义,lt可以理解成每个需要登录的用户都有一个流水号。只有有了webflow发放的有效的流水号,用户才可以说明是已经进入了webflow流程。否则,没有流水号的情况下,webflow会认为用户还没有进入webflow流程,从而会重新进入一次webflow流程,从而会重新出现登录界面。因此我们需要想办法保存登陆成功的cookie以便下次使用仍然能进入系统。
request.session()可以让同一个实例发出的请求具有相同的cookie。
操作过程:
1.准备好登录网址和成绩爬取网址
2.获取lt和准备上传的表单数据
我们在登录网址页面f12,crtl+f 搜索lt,发现lt对应在<input>中的value里面
用户名和密码填自己的即可
完成登录部分
至此我们可以先print输出一下
登陆成功
登陆成功,以及出现了笔者的名字。。源代码等同于这个登陆成功的页面
接下来直接登录那个爬取成绩的页面就行了。但是出现了一个问题。电子科大学校的网站经常会有这种情况,就是如果多方登录,就会有个弹窗页面显示重复登录,这时候经测试发现f5刷新页面即可。
但是webdriver可以模拟操作,request库最简单的方法就是重新get一遍该页面。【get两次】
get两次