python爬⾍实例-爬取北邮研究⽣成绩
做了许多爬⾍的⼩练习,都是⽐较简单的爬⾍程序,像下⼩说啊,爬取⼀个⽹站内所有的页⾯之类的。基本上都是看着别⼈的需求,按照别⼈的思路,来写程序。
⼼想,能不能⾃⼰构思,弄⼀个⾃⼰的⼩程序,解决⾃⼰的实际需求。楼主还是个学⽣,恰好这学期期末了,可以在学校的⽹站上查询⾃⼰的成绩了,于是就想着能不能⾃⼰做⼀个爬⾍,从⾃⼰学校的⽹站上爬取⼀些⾃⼰的信息呢?
说⼲就⼲,于是开始琢磨⽹站的结构、⽹页的URL、请求数据包⼀类的。⾸先先来查询成绩的整个流程吧!
python怎么读取py文件需求:
结构⽐较简单,输⼊学号,密码,验证码,选择⾝份之后点击登录就会出现主页⾯了:
点击课程成绩信息查询,在右侧就显⽰出所有的成绩信息了:
我们要做的就是爬取这个表格中所有的数据了。
1、准备⼯作:
熟话说,磨⼑不误砍材⼯,我们⾸先要先准备好开发和调试需要的⼯具。
开发环境:楼主⽤的是WIN7 64位系统,但是安装的python2.7 32bit的,安装了最新的Eclipse+pydev。
浏览器:⽤到了UC浏览器(这个也是刚使⽤没多久的浏览器,调试以及插件仓库都是⽤的chrome的,个⼈感觉上⽐chrome 还要快⼀点,所以就⼀直⽤着),主要⽤来分析⽹页结构,浏览器请求和响应报⽂的解析
⽂档⽐较器:BCompare。Beyond Compare 是⼀个综合的⽐对⼯具。可⽐对的对象包括纯⽂字档、资料夹、zip 压缩案、
FTP 站,等等。您可以使⽤它管理您的原始档、保持⽐对资料夹同步、⽐对程式的输出结果、以及检查所烧⼊光碟备份的精确度。Beyond Compare 的主要⽬标还是帮助您详尽的分析差异之处,并且对它们进⾏详尽的处理。软体内部包含了许多档案和资料夹命令动作。如果⽹页中有⼀些动态⽣成的序列id什么的元素,可以对⽐⽹页源代码,出这些不同之处,很是⽅便。
验证码解析:这个可以参考另外⼀篇关于验证码识别的⼀篇⽂章,介绍了如何⽤pytesser来识别验证
码。
抓包⼯具: wireshark,⼤名⿍⿍的抓包⼯具。因为要使⽤python发数据包的话,不像chrome浏览器那样能将报⽂头部,post数据结构啥的都能分析出来,python发包如果出了bug的话,没有抓包软件是挺⿇烦的⼀件事情。当然也可以通过设置urllib2打开debug模式,⽅法如下:
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('le')
这样就能看到传输内容了。如下图:
运⾏的时候,发送的请求包以及响应都列了出来。我们可以运⾏多次,然后将多次的值⽇志通过前⾯提到BComare软件对⽐⽇志记录,来分析程序可能出现的问题。如下图是两次运⾏⽇志的对⽐界⾯。
2、登录页⾯
⾸选我们来看⼀下登录页⾯的组成结构:
打开登录页⾯-按F12调出调试⼯具,看⼀下表单的结构:
我们可以看到⽤户名和密码的 name属性分别为 UserName,PassWord。
我们先打开Network调试视图,然后填好⽤户名和密码以及验证码尝试登录⼀下(当然输⼊的⽤户和密码是错误的),在Network视图中可以看到我们向服务器发出的请求报⽂结构以及服务器返回的数据结构:
在这⾥我们可以看到,从我们点击登录直到登录失败,⼀共产⽣了3次数据交换,如上图:
第⼀个数据包:UserLogin.aspx?exit=1 这个是登录的请求,我们点开它可以看到如下图所⽰的数据结构:
我们可以看到,上图中,我们请求的
地址为:ht tp://yjxt.bupt.edu/UserLogin.aspx?exit=1 ,
请求的⽅式为:post,
请求的sessionid为:ASP.NET_SessionId=ussshjtm2yp2whflmzbysvuj;
请求的⽅式为:XMLHttpRequest⽅式,即ajax异步请求的⽅式。
参数中包含了我们的:⽤户名(21359841)密码(453453)以及验证码(7031)。
因此我们需要要发起这个请求就有两个难点:
1、我们要构造包含有sessionID号的request头部
2、我们要构造含有⽤户名,密码和验证码的表数据
我们知道服务器是通过session来维护和浏览器之间关系的,通过session来判断这个请求时那个浏览器发起的,那么这个sessionID是怎么来的呢?
其实当我们打开登录页⾯,服务器会通过cookie将session的id号记录到浏览器本地,每当浏览器向服务器发请求时,它都会读取这个cookie中的sesisonid。我们可以在【Cookies】视图中看到当前有多少cookie值。如下图显⽰了当前的所有cookie数据。
讲到这⾥,顿时就想到了可以在python代码中通过读取cookie,到这个sessionid不就OK了吗?事实上我们也是这么⼲的!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论