零基础写python爬虫之爬虫编写全记录_python

先来说一下我们学校的网站:

http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html

查询成绩需要登录,然后显示各学科成绩,但是只显示成绩而没有绩点,也就是加权平均分。

显然这样手动计算绩点是一件非常麻烦的事情。所以我们可以用python做一个爬虫来解决这个问题。

1.决战前夜

先来准备一下工具:HttpFox插件。

这是一款http协议分析插件,分析页面请求和响应的时间、内容、以及浏览器用到的COOKIE等。

以我为例,安装在火狐上即可,效果如图:

可以非常直观的查看相应的信息。

点击start是开始检测,点击stop暂停检测,点击clear清除内容。

一般在使用之前,点击stop暂停,然后点击clear清屏,确保看到的是访问当前页面获得的数据。

2.深入敌后

下面就去山东大学的成绩查询网站,看一看在登录的时候,到底发送了那些信息。

先来到登录页面,把httpfox打开,clear之后,点击start开启检测:

输入完了个人信息,确保httpfox处于开启状态,然后点击确定提交信息,实现登录。

这个时候可以看到,httpfox检测到了三条信息:

这时点击stop键,确保捕获到的是访问该页面之后反馈的数据,以便我们做爬虫的时候模拟登陆使用。

3.庖丁解牛

乍一看我们拿到了三个数据,两个是GET的一个是POST的,但是它们到底是什么,应该怎么用,我们还一无所知。

所以,我们需要挨个查看一下捕获到的内容。

先看POST的信息:

既然是POST的信息,我们就直接看PostData即可。

可以看到一共POST两个数据,stuid和pwd。

并且从Type的Redirect to可以看出,POST完毕之后跳转到了bks_login2.loginmessage页面。

由此看出,这个数据是点击确定之后提交的表单数据。

点击cookie标签,看看cookie信息:

没错,收到了一个ACCOUNT的cookie,并且在session结束之后自动销毁。

那么提交之后收到了哪些信息呢?

我们来看看后面的两个GET数据。

先看第一个,我们点击content标签可以查看收到的内容,是不是有一种生吞活剥的快感-。-HTML源码暴露无疑了:

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

啊哈,原来html页面的内容是发送了cookie信息之后才接受到的。

再来看看最后一个接收到的信息:

大致看了一下应该只是一个叫做style.css的css文件,对我们没有太大的作用。

4.冷静应战

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

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

OK,看上去好像很简单的样纸。那下面我们就来试试看吧。

但是在实验之前,还有一个问题没有解决,就是POST的数据到底发送到了哪里?

再来看一下当初的页面:

很明显是用一个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

输入一看,果不其然:

靠居然是清华大学的选课系统。。。目测是我校懒得做页面了就直接借了。。结果连标题都不改一下。。。

但是这个页面依旧不是我们需要的页面,因为我们的POST数据提交到的页面,应该是表单form的ACTION中提交到的页面。

也就是说,我们需要查看源码,来知道POST数据到底发送到了哪里:

嗯,目测这个才是提交POST数据的地址。

整理到地址栏中,完整的地址应该如下:

http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login

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

5.小试牛刀

接下来的任务就是:用python模拟发送一个POST的数据并取到返回的cookie值。

关于cookie的操作可以看看这篇博文:

http://www.jb51.net/article/57144.htm

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

# -*- coding: utf-8 -*-#---------------------------------------#   程序:山东大学爬虫#   版本:0.1#   作者:why#   日期:2013-07-12#   语言:Python 2.7#   操作:输入学号和密码#   功能:输出成绩的加权平均值也就是绩点#---------------------------------------import urllib  import urllib2import cookielibcookie = 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()   

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

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

6.偷天换日

接下来的任务就是用爬虫获取到学生的成绩。

再来看看源网站。

开启HTTPFOX之后,点击查看成绩,发现捕获到了如下的数据:

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

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

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

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 urllib2import 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运行即可,看看捕获到的数据吧:

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

8.手到擒来

这么一大堆html源码显然是不利于我们处理的,下面要用正则表达式来抠出必须的数据。

关于正则表达式的教程可以看看这个博文:

http://www.jb51.net/article/57150.htm

我们来看看成绩的源码:

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

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

# -*- coding: utf-8 -*-#---------------------------------------#   程序:山东大学爬虫#   版本:0.1#   作者:why#   日期:2013-07-12#   语言:Python 2.7#   操作:输入学号和密码#   功能:输出成绩的加权平均值也就是绩点#---------------------------------------import urllib  import urllib2import cookielibimport reclass 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('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S)     #获取到学分        for item in myItems:            self.weights.append(item[0].encode('gbk'))            self.points.append(item[1].encode('gbk'))                # 将内容从页面代码中抠出来    def print_data(self,items):          for item in items:              print item#调用  mySpider = SDU_Spider()  mySpider.sdu_init()  

水平有限,,正则是有点丑,。运行的效果如图:

ok,接下来的只是数据的处理问题了。。

9.凯旋而归

完整的代码如下,至此一个完整的爬虫项目便完工了。

# -*- coding: utf-8 -*-#---------------------------------------#   程序:山东大学爬虫#   版本:0.1#   作者:why#   日期:2013-07-12#   语言:Python 2.7#   操作:输入学号和密码#   功能:输出成绩的加权平均值也就是绩点#---------------------------------------import urllib  import urllib2import cookielibimport reimport stringclass 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.calculate_date();    # 将内容从页面代码中抠出来      def deal_data(self,myPage):          myItems = re.findall('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S)     #获取到学分        for item in myItems:            self.weights.append(item[0].encode('gbk'))            self.points.append(item[1].encode('gbk'))    #计算绩点,如果成绩还没出来,或者成绩是优秀良好,就不运算该成绩    def calculate_date(self):        point = 0.0        weight = 0.0        for i in range(len(self.points)):            if(self.points[i].isdigit()):                point += string.atof(self.points[i])*string.atof(self.weights[i])                weight += string.atof(self.weights[i])        print point/weight#调用  mySpider = SDU_Spider()  mySpider.sdu_init()  

以上便是此爬虫诞生的全部过程的详细记录了,有没有很神奇的赶脚??哈哈,开个玩笑,需要的朋友参考下吧,自由扩展

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
爬虫
python编写爬虫、python编写网络爬虫、python零基础爬虫实战、零基础写python爬虫、python爬虫基础,以便于您获取更多的相关知识。

时间: 2025-01-30 07:17:50

零基础写python爬虫之爬虫编写全记录_python的相关文章

零基础写python爬虫之使用Scrapy框架编写爬虫_python

网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便.使用Scrapy可以很方便的完成网上数据的采集工作,它为我们完成了大量的工作,而不需要自己费大力气去开发. 首先先要回答一个问题. 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: 新建项目 (Project):新建一个新的爬虫项目 明确目标(Item

零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版_python

百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都是通过查看源码扣出关键数据,然后将其存储到本地txt文件. 项目内容: 用Python写的百度贴吧的网络爬虫. 使用方法: 新建一个BugBaidu.py文件,然后将代码复制到里面后,双击运行. 程序功能: 将贴吧中楼主发布的内容打包txt存储到本地. 原理解释: 首先,先浏览一下某一条贴吧,点击只看楼主并点击第二页之后url发生了一点变化,变成了: http://tieba.baidu.com/p/2296712428?see_lz=1&pn=

零基础写python爬虫之抓取糗事百科代码分享_python

项目内容: 用Python写的糗事百科的网络爬虫. 使用方法: 新建一个Bug.py文件,然后将代码复制到里面后,双击运行. 程序功能: 在命令提示行中浏览糗事百科. 原理解释: 首先,先浏览一下糗事百科的主页:http://www.qiushibaike.com/hot/page/1 可以看出来,链接中page/后面的数字就是对应的页码,记住这一点为以后的编写做准备. 然后,右击查看页面源码: 观察发现,每一个段子都用div标记,其中class必为content,title是发帖时间,我们只需

零基础写python爬虫之神器正则表达式_python

接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一下Python中的正则表达式的相关内容. 正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器. 一. 正则表达式基础 1.1.概念介绍 正则表达式是用于处理字符串的强大工具,它并不是Python的一部分. 其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同. 它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式的语言里,正则表达式的语法都是一样的. 下

零基础写python爬虫之抓取百度贴吧代码分享_python

这里就不给大家废话了,直接上代码,代码的解释都在注释里面,看不懂的也别来问我,好好学学基础知识去! 复制代码 代码如下: # -*- coding: utf-8 -*- #--------------------------------------- #   程序:百度贴吧爬虫 #   版本:0.1 #   作者:why #   日期:2013-05-14 #   语言:Python 2.7 #   操作:输入带分页的地址,去掉最后面的数字,设置一下起始页数和终点页数. #   功能:下载对应页

零基础写python爬虫之urllib2使用指南_python

前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用细节. 1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test14来实现一个简单的代理Demo: 复制代码 代码如下: import urllib2  enable_proxy = True  proxy_handler = urllib2.ProxyHandler({"http&

零基础写python爬虫之HTTP异常处理_python

先来说一说HTTP的异常处理问题. 当urlopen不能够处理一个response时,产生urlError. 不过通常的Python APIs异常如ValueError,TypeError等也会同时产生. HTTPError是urlError的子类,通常在特定HTTP URLs中产生. 1.URLError通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生. 这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数

零基础写python爬虫之使用urllib2组件抓取网页内容_python

版本号:Python2.7.5,Python3改动较大,各位另寻教程. 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.  类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源. 在Python中,我们使用urllib2这个组件来抓取网页. urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件. 它以urlopen函数的形式提供了一个非常简单的接口. 最简

零基础写python爬虫之爬虫的定义及URL构成_python

一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来. 这样看来,网络爬虫就是一个爬行程序,一个抓