中山大学本科教务系统公选课网络爬虫实践

这学期开始,学着做了一点爬虫,用中山大学的教务系统来试了一试,希望能给正在学习网络爬虫的人带来一些帮助。因为博主在刚刚接触这个领域,所以如果文中有错误或者不妥的地方,欢迎大家指正。

—————————————————————————-

首先,是我的项目成果

Github项目地址:https://github.com/shawnlixx/sysu_elect_webcrawler

教务选课系统网址:http://uems.sysu.edu.cn/elect

目前只是能爬进去选课,实际意义不大。。。

—————————————————————————-

过程中遇到的问题及解决

在整个过程中首先遇到的是验证码的问题,要使验证码能够让用户看到,我首先想到的是把请求得到的验证码图片保存在本地,然后让用户自己打开图片来获取验证码。

于是有了如下代码
[image not found]

但是这样得到的code.png图片显示会非常模糊(难道是我眼花)
[image not found]
根本看不清内容。

直接将返回的数据写入文件会发生严重的失真,而使用StringIO处理(注:StringIO — Read and write strings as files.)返回的response ,然后用第三方库Image来处理效果会很好(果然不是眼花)
[image not found]
但是问题又来了,request 验证码图片之后,用户填写验证码后发包,根本通不过验证,显示http error 500。

用户名与密码都没有问题,只有可能是验证码的问题。那么网站怎么把发给你的验证码跟你提交的验证码匹配起来呢? 我想通过cookies 就可以。我监视发包后,发现在访问网站时会设置一个cookie。
[image not found]

如果该cookie存在,再次访问的时候不会设置新的值。如果没有请求网站,直接请求验证码,也会设置这个名字的cookie,但是用这个cookie验证时会失败(我之前就是这么干的,一直找不出原因。。。),必须先请求登陆页面,得到一个cookie,使用该cookie请求验证码,这样得到的验证码才是有效的,然后再带着cookie发包登陆,就可以成功了。

还有一个问题就是一定要记住url的参数编码格式是name1=value1&name2=value2…
所以用python的字典写好参数后一定要用urllib库中的urlencode函数将字典转化为url参数的编码格式,这也是为什么要在开头import urllib的原因。

后来发现同样的事情用Request模块会方便很多!比如自动转化为url参数格式,以及创建会话等。博主也是后来才用这个模块,发现非常方便。

—————————————————————————-

最后把要爬网页的源码看一看,用Beautifulsoup就很方便啦。以我的代码为蓝本,修改一下,以后抢课就方便多了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×