一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

零基礎寫python爬蟲之爬蟲編寫全記錄

 精神360 2018-03-28


查詢成績需要登錄,然后顯示各學科成績,但是只顯示成績而沒有績點,也就是加權平均分。

顯然這樣手動計算績點是一件非常麻煩的事情。所以我們可以用python做一個爬蟲來解決這個問題。

1.決戰(zhàn)前夜

先來準備一下工具:HttpFox插件。

這是一款http協議分析插件,分析頁面請求和響應的時間、內容、以及瀏覽器用到的COOKIE等。

以我為例,安裝在火狐上即可,效果如圖:

可以非常直觀的查看相應的信息。

點擊start是開始檢測,點擊stop暫停檢測,點擊clear清除內容。

一般在使用之前,點擊stop暫停,然后點擊clear清屏,確??吹降氖窃L問當前頁面獲得的數據。

2.深入敵后

下面就去山東大學的成績查詢網站,看一看在登錄的時候,到底發(fā)送了那些信息。

先來到登錄頁面,把httpfox打開,clear之后,點擊start開啟檢測:

輸入完了個人信息,確保httpfox處于開啟狀態(tài),然后點擊確定提交信息,實現登錄。

這個時候可以看到,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頁面的內容是發(fā)送了cookie信息之后才接受到的。

再來看看最后一個接收到的信息:

大致看了一下應該只是一個叫做style.css的css文件,對我們沒有太大的作用。

4.冷靜應戰(zhàn)

既然已經知道了我們向服務器發(fā)送了什么數據,也知道了我們接收到了什么數據,基本的流程如下:

首先,我們POST學號和密碼--->然后返回cookie的值然后發(fā)送cookie給服務器--->返回頁面信息。獲取到成績頁面的數據,用正則表達式將成績和學分單獨取出并計算加權平均數。

OK,看上去好像很簡單的樣紙。那下面我們就來試試看吧。

但是在實驗之前,還有一個問題沒有解決,就是POST的數據到底發(fā)送到了哪里?

再來看一下當初的頁面:

很明顯是用一個html框架來實現的,也就是說,我們在地址欄看到的地址并不是右邊提交表單的地址。

那么怎樣才能獲得真正的地址-。-右擊查看頁面源代碼:

嗯沒錯,那個name="w_right"的就是我們要的登錄頁面。

網站的原來的地址是:

http://jwxt.:7777/zhxt_bks/zhxt_bks.html

所以,真正的表單提交的地址應該是:

http://jwxt.:7777/zhxt_bks/xk_login.html

輸入一看,果不其然:


靠居然是清華大學的選課系統(tǒng)。。。目測是我校懶得做頁面了就直接借了。。結果連標題都不改一下。。。

但是這個頁面依舊不是我們需要的頁面,因為我們的POST數據提交到的頁面,應該是表單form的ACTION中提交到的頁面。

也就是說,我們需要查看源碼,來知道POST數據到底發(fā)送到了哪里:


嗯,目測這個才是提交POST數據的地址。

整理到地址欄中,完整的地址應該如下:

http://jwxt.:7777/pls/wwwbks/bks_login2.login

(獲取的方式很簡單,在火狐瀏覽器中直接點擊那個鏈接就能看到這個鏈接的地址了)

5.小試牛刀

接下來的任務就是:用python模擬發(fā)送一個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 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.:7777/pls/wwwbks/bks_login2.login', 
    data = postdata
)
#訪問該鏈接#
result = opener.open(req)
#打印返回的內容#
print result.read()  

如此這般之后,再看看運行的效果:


ok,如此這般,我們就算模擬登陸成功了。

6.偷天換日

接下來的任務就是用爬蟲獲取到學生的成績。

再來看看源網站。

開啟HTTPFOX之后,點擊查看成績,發(fā)現捕獲到了如下的數據:


點擊第一個GET的數據,查看內容可以發(fā)現Content就是獲取到的成績的內容。

而獲取到的頁面鏈接,從頁面源代碼中右擊查看元素,可以看到點擊鏈接之后跳轉的頁面(火狐瀏覽器只需要右擊,“查看此框架”,即可):


從而可以得到查看成績的鏈接如下:

http://jwxt.:7777/pls/wwwbks/bkscjcx.curscopre

7.萬事俱備

現在萬事俱備啦,所以只需要把鏈接應用到爬蟲里面,看看能否查看到成績的頁面。

從httpfox可以看到,我們發(fā)送了一個cookie才能返回成績的信息,所以我們就用python模擬一個cookie的發(fā)送,以此來請求成績的信息:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山東大學爬蟲
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   語言:Python 2.7
#   操作:輸入學號和密碼
#   功能:輸出成績的加權平均值也就是績點
#---------------------------------------
import urllib 
import urllib2
import cookielib
#初始化一個CookieJar來處理Cookie的信息#
cookie = cookielib.CookieJar()
#創(chuàng)建一個新的opener來使用我們的CookieJar#
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#需要POST的數據#
postdata=urllib.urlencode({ 
    'stuid':'201100300428', 
    'pwd':'921030' 
})
#自定義一個請求#
req = urllib2.Request( 
    url = 'http://jwxt.: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.: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 urllib2
import cookielib
import re
class SDU_Spider: 
    # 申明相關的屬性 
    def __init__(self):   
        self.loginUrl = 'http://jwxt.:7777/pls/wwwbks/bks_login2.login'   # 登錄的url
        self.resultUrl = 'http://jwxt.: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 urllib2
import cookielib
import re
import string
class SDU_Spider: 
    # 申明相關的屬性 
    def __init__(self):   
        self.loginUrl = 'http://jwxt.:7777/pls/wwwbks/bks_login2.login'   # 登錄的url
        self.resultUrl = 'http://jwxt.: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'))
    #計算績點,如果成績還沒出來,或者成績是優(yōu)秀良好,就不運算該成績
    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() 


    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    久久国内午夜福利直播| 国产不卡的视频在线观看| 国产欧美高清精品一区| 国产一区二区三区免费福利 | 人妻人妻人人妻人人澡| 午夜福利黄片免费观看| 国产国产精品精品在线| 亚洲欧美中文日韩综合| 亚洲国产精品无遮挡羞羞| 国产麻豆精品福利在线| 欧美精品在线播放一区二区| 视频一区二区 国产精品| 国产欧美日韩不卡在线视频| 日韩精品视频高清在线观看| 熟妇人妻av中文字幕老熟妇| 五月综合激情婷婷丁香| 一区二区三区亚洲国产| 五月天丁香亚洲综合网| 不卡中文字幕在线免费看| 久久精品国产99精品最新| 人人爽夜夜爽夜夜爽精品视频| 亚洲精品国产福利在线| 99久免费精品视频在线观| 国产欧美日韩精品成人专区| av在线免费观看在线免费观看| 日韩一区二区三区有码| 九九热在线视频观看最新| 亚洲最新的黄色录像在线| 国产又粗又猛又黄又爽视频免费| 欧美胖熟妇一区二区三区| 日韩中文字幕人妻精品| 亚洲三级视频在线观看免费| 少妇激情在线免费观看| 日韩精品少妇人妻一区二区| 亚洲婷婷开心色四房播播| 欧美成人黄色一区二区三区| 神马午夜福利免费视频| 亚洲妇女作爱一区二区三区| 能在线看的视频你懂的| 激情五月天深爱丁香婷婷| 午夜午夜精品一区二区|