设为首页 收藏本站
查看: 1307|回复: 0

[经验分享] [Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)

[复制链接]
发表于 2015-4-27 11:47:45 | 显示全部楼层 |阅读模式
  先来说一下我们学校的网站:
  http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
  查询成绩需要登录,然后显示各学科成绩,但是只显示成绩而没有绩点,也就是加权平均分。
DSC0000.jpg
  显然这样手动计算绩点是一件非常麻烦的事情。所以我们可以用python做一个爬虫来解决这个问题。
  

  

  1.决战前夜
  先来准备一下工具:HttpFox插件。
  这是一款http协议分析插件,分析页面请求和响应的时间、内容、以及浏览器用到的COOKIE等。

  以我为例,安装在火狐上即可,效果如图: DSC0001.jpg
  可以非常直观的查看相应的信息。
  点击start是开始检测,点击stop暂停检测,点击clear清除内容。
  一般在使用之前,点击stop暂停,然后点击clear清屏,确保看到的是访问当前页面获得的数据。

  

  

  2.深入敌后

  下面就去山东大学的成绩查询网站,看一看在登录的时候,到底发送了那些信息。
  
先来到登录页面,把httpfox打开,clear之后,点击start开启检测:
   DSC0002.jpg
  

  输入完了个人信息,确保httpfox处于开启状态,然后点击确定提交信息,实现登录。
  这个时候可以看到,httpfox检测到了三条信息:
   DSC0003.jpg
  这时点击stop键,确保捕获到的是访问该页面之后反馈的数据,以便我们做爬虫的时候模拟登陆使用。
  

  

  3.庖丁解牛
  乍一看我们拿到了三个数据,两个是GET的一个是POST的,但是它们到底是什么,应该怎么用,我们还一无所知。
  所以,我们需要挨个查看一下捕获到的内容。
  先看POST的信息:
   DSC0004.jpg

  既然是POST的信息,我们就直接看PostData即可。
  可以看到一共POST两个数据,stuid和pwd。
  并且从Type的Redirect to可以看出,POST完毕之后跳转到了bks_login2.loginmessage页面。
  
  由此看出,这个数据是点击确定之后提交的表单数据。
  点击cookie标签,看看cookie信息:
DSC0005.jpg

  没错,收到了一个ACCOUNT的cookie,并且在session结束之后自动销毁。
  那么提交之后收到了哪些信息呢?
  我们来看看后面的两个GET数据。
  先看第一个,我们点击content标签可以查看收到的内容,是不是有一种生吞活剥的快感-。-HTML源码暴露无疑了:
   DSC0006.jpg

  看来这个只是显示页面的html源码而已,点击cookie,查看cookie的相关信息:
   DSC0007.jpg

  

  啊哈,原来html页面的内容是发送了cookie信息之后才接受到的。
  再来看看最后一个接收到的信息:
   DSC0008.jpg
  大致看了一下应该只是一个叫做style.css的css文件,对我们没有太大的作用。
  

  

  

  4.冷静应战

  既然已经知道了我们向服务器发送了什么数据,也知道了我们接收到了什么数据,基本的流程如下:


  • 首先,我们POST学号和密码--->然后返回cookie的值


  • 然后发送cookie给服务器--->返回页面信息。
  • 获取到成绩页面的数据,用正则表达式将成绩和学分单独取出并计算加权平均数。

  OK,看上去好像很简单的样纸。那下面我们就来试试看吧。
  但是在实验之前,还有一个问题没有解决,就是POST的数据到底发送到了哪里?
  再来看一下当初的页面:
   DSC0009.jpg
  很明显是用一个html框架来实现的,也就是说,我们在地址栏看到的地址并不是右边提交表单的地址。
  那么怎样才能获得真正的地址-。-右击查看页面源代码:
  嗯没错,那个name="w_right"的就是我们要的登录页面。
  网站的原来的地址是:
  http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
  所以,真正的表单提交的地址应该是:
  http://jwxt.sdu.edu.cn:7777/zhxt_bks/xk_login.html
  输入一看,果不其然:
   DSC00010.jpg

  靠居然是清华大学的选课系统。。。目测是我校懒得做页面了就直接借了。。结果连标题都不改一下。。。
  但是这个页面依旧不是我们需要的页面,因为我们的POST数据提交到的页面,应该是表单form的ACTION中提交到的页面。
  也就是说,我们需要查看源码,来知道POST数据到底发送到了哪里:
   DSC00011.jpg

  

  嗯,目测这个才是提交POST数据的地址。
  整理到地址栏中,完整的地址应该如下:
  http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login

  (获取的方式很简单,在火狐浏览器中直接点击那个链接就能看到这个链接的地址了)

  

  5.小试牛刀

  接下来的任务就是:用python模拟发送一个POST的数据并取到返回的cookie值。
  
  
关于cookie的操作可以看看这篇博文:
  http://blog.iyunv.com/wxg694175346/article/details/8925978

  我们先准备一个POST的数据,再准备一个cookie的接收,然后写出源码如下:

  

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山东大学爬虫
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   语言:Python 2.7
#   操作:输入学号和密码
#   功能:输出成绩的加权平均值也就是绩点
#---------------------------------------
import urllib  
import urllib2
import cookielib
cookie = cookielib.CookieJar()  
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#需要POST的数据#
postdata=urllib.urlencode({  
'stuid':'201100300428',  
'pwd':'921030'  
})
#自定义一个请求#
req = urllib2.Request(  
url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login',  
data = postdata
)
#访问该链接#
result = opener.open(req)
#打印返回的内容#
print result.read()   

  
如此这般之后,再看看运行的效果:
  
DSC00012.jpg

  ok,如此这般,我们就算模拟登陆成功了。
  

  6.偷天换日

  接下来的任务就是用爬虫获取到学生的成绩。
  再来看看源网站。
  开启HTTPFOX之后,点击查看成绩,发现捕获到了如下的数据:
   DSC00013.jpg

  点击第一个GET的数据,查看内容可以发现Content就是获取到的成绩的内容。
  

  而获取到的页面链接,从页面源代码中右击查看元素,可以看到点击链接之后跳转的页面(火狐浏览器只需要右击,“查看此框架”,即可):
   DSC00014.jpg

  从而可以得到查看成绩的链接如下:

  http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre

  

  7.万事俱备
  现在万事俱备啦,所以只需要把链接应用到爬虫里面,看看能否查看到成绩的页面。
  从httpfox可以看到,我们发送了一个cookie才能返回成绩的信息,所以我们就用python模拟一个cookie的发送,以此来请求成绩的信息:
  

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山东大学爬虫
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   语言:Python 2.7
#   操作:输入学号和密码
#   功能:输出成绩的加权平均值也就是绩点
#---------------------------------------
import urllib  
import urllib2
import cookielib
#初始化一个CookieJar来处理Cookie的信息#
cookie = cookielib.CookieJar()
#创建一个新的opener来使用我们的CookieJar#
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#需要POST的数据#
postdata=urllib.urlencode({  
'stuid':'201100300428',  
'pwd':'921030'  
})
#自定义一个请求#
req = urllib2.Request(  
url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login',  
data = postdata
)
#访问该链接#
result = opener.open(req)
#打印返回的内容#
print result.read()
#打印cookie的值
for item in cookie:  
print 'Cookie:Name = '+item.name  
print 'Cookie:Value = '+item.value

#访问该链接#
result = opener.open('http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre')
#打印返回的内容#
print result.read()


  
按下F5运行即可,看看捕获到的数据吧:
  
   DSC00015.jpg

  既然这样就没有什么问题了吧,用正则表达式将数据稍稍处理一下,取出学分和相应的分数就可以了。
  

  

  8.手到擒来

  这么一大堆html源码显然是不利于我们处理的,下面要用正则表达式来抠出必须的数据。
  关于正则表达式的教程可以看看这个博文:
  http://blog.iyunv.com/wxg694175346/article/details/8929576

  我们来看看成绩的源码:
DSC00016.jpg

  

  既然如此,用正则表达式就易如反掌了。
  

  我们将代码稍稍整理一下,然后用正则来取出数据:
  

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山东大学爬虫
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   语言:Python 2.7
#   操作:输入学号和密码
#   功能:输出成绩的加权平均值也就是绩点
#---------------------------------------
import urllib  
import urllib2
import cookielib
import re
class SDU_Spider:  
# 申明相关的属性  
def __init__(self):   
self.loginUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login'   # 登录的url
self.resultUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre' # 显示成绩的url
self.cookieJar = cookielib.CookieJar()                                      # 初始化一个CookieJar来处理Cookie的信息
self.postdata=urllib.urlencode({'stuid':'201100300428','pwd':'921030'})     # POST的数据
self.weights = []   #存储权重,也就是学分
self.points = []    #存储分数,也就是成绩
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar))
def sdu_init(self):
# 初始化链接并且获取cookie
myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata)   # 自定义一个请求
result = self.opener.open(myRequest)            # 访问登录页面,获取到必须的cookie的值
result = self.opener.open(self.resultUrl)       # 访问成绩页面,获得成绩的数据
# 打印返回的内容
# print result.read()
self.deal_data(result.read().decode('gbk'))
self.print_data(self.weights);
self.print_data(self.points);
# 将内容从页面代码中抠出来  
def deal_data(self,myPage):  
myItems = re.findall('.*?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61200-1-1.html 上篇帖子: python中的继承和抽象类的实现 下篇帖子: python操作数据库PostgreSQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表