最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

零基礎(chǔ)寫(xiě)python爬蟲(chóng)之爬蟲(chóng)編寫(xiě)全記錄

 更新時(shí)間:2014年11月06日 11:39:30   投稿:hebedich  
前面九篇文章從基礎(chǔ)到編寫(xiě)都做了詳細(xì)的介紹了,第十篇么講究個(gè)十全十美,那么我們就來(lái)詳細(xì)記錄一下一個(gè)爬蟲(chóng)程序如何一步步編寫(xiě)出來(lái)的,各位看官可要看仔細(xì)了

先來(lái)說(shuō)一下我們學(xué)校的網(wǎng)站:

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

查詢成績(jī)需要登錄,然后顯示各學(xué)科成績(jī),但是只顯示成績(jī)而沒(méi)有績(jī)點(diǎn),也就是加權(quán)平均分。

顯然這樣手動(dòng)計(jì)算績(jī)點(diǎn)是一件非常麻煩的事情。所以我們可以用python做一個(gè)爬蟲(chóng)來(lái)解決這個(gè)問(wèn)題。

1.決戰(zhàn)前夜

先來(lái)準(zhǔn)備一下工具:HttpFox插件。

這是一款http協(xié)議分析插件,分析頁(yè)面請(qǐng)求和響應(yīng)的時(shí)間、內(nèi)容、以及瀏覽器用到的COOKIE等。

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

可以非常直觀的查看相應(yīng)的信息。

點(diǎn)擊start是開(kāi)始檢測(cè),點(diǎn)擊stop暫停檢測(cè),點(diǎn)擊clear清除內(nèi)容。

一般在使用之前,點(diǎn)擊stop暫停,然后點(diǎn)擊clear清屏,確??吹降氖窃L問(wèn)當(dāng)前頁(yè)面獲得的數(shù)據(jù)。

2.深入敵后

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

先來(lái)到登錄頁(yè)面,把httpfox打開(kāi),clear之后,點(diǎn)擊start開(kāi)啟檢測(cè):

輸入完了個(gè)人信息,確保httpfox處于開(kāi)啟狀態(tài),然后點(diǎn)擊確定提交信息,實(shí)現(xiàn)登錄。

這個(gè)時(shí)候可以看到,httpfox檢測(cè)到了三條信息:

這時(shí)點(diǎn)擊stop鍵,確保捕獲到的是訪問(wèn)該頁(yè)面之后反饋的數(shù)據(jù),以便我們做爬蟲(chóng)的時(shí)候模擬登陸使用。

3.庖丁解牛

乍一看我們拿到了三個(gè)數(shù)據(jù),兩個(gè)是GET的一個(gè)是POST的,但是它們到底是什么,應(yīng)該怎么用,我們還一無(wú)所知。

所以,我們需要挨個(gè)查看一下捕獲到的內(nèi)容。

先看POST的信息:


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

可以看到一共POST兩個(gè)數(shù)據(jù),stuid和pwd。

并且從Type的Redirect to可以看出,POST完畢之后跳轉(zhuǎn)到了bks_login2.loginmessage頁(yè)面。

由此看出,這個(gè)數(shù)據(jù)是點(diǎn)擊確定之后提交的表單數(shù)據(jù)。

點(diǎn)擊cookie標(biāo)簽,看看cookie信息:


沒(méi)錯(cuò),收到了一個(gè)ACCOUNT的cookie,并且在session結(jié)束之后自動(dòng)銷毀。

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

我們來(lái)看看后面的兩個(gè)GET數(shù)據(jù)。

先看第一個(gè),我們點(diǎn)擊content標(biāo)簽可以查看收到的內(nèi)容,是不是有一種生吞活剝的快感-。-HTML源碼暴露無(wú)疑了:


看來(lái)這個(gè)只是顯示頁(yè)面的html源碼而已,點(diǎn)擊cookie,查看cookie的相關(guān)信息:



啊哈,原來(lái)html頁(yè)面的內(nèi)容是發(fā)送了cookie信息之后才接受到的。

再來(lái)看看最后一個(gè)接收到的信息:

大致看了一下應(yīng)該只是一個(gè)叫做style.css的css文件,對(duì)我們沒(méi)有太大的作用。

4.冷靜應(yīng)戰(zhàn)

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

首先,我們POST學(xué)號(hào)和密碼--->然后返回cookie的值然后發(fā)送cookie給服務(wù)器--->返回頁(yè)面信息。獲取到成績(jī)頁(yè)面的數(shù)據(jù),用正則表達(dá)式將成績(jī)和學(xué)分單獨(dú)取出并計(jì)算加權(quán)平均數(shù)。

OK,看上去好像很簡(jiǎn)單的樣紙。那下面我們就來(lái)試試看吧。

但是在實(shí)驗(yàn)之前,還有一個(gè)問(wèn)題沒(méi)有解決,就是POST的數(shù)據(jù)到底發(fā)送到了哪里?

再來(lái)看一下當(dāng)初的頁(yè)面:

很明顯是用一個(gè)html框架來(lái)實(shí)現(xiàn)的,也就是說(shuō),我們?cè)诘刂窓诳吹降牡刂凡⒉皇怯疫吿峤槐韱蔚牡刂贰?/p>

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

嗯沒(méi)錯(cuò),那個(gè)name="w_right"的就是我們要的登錄頁(yè)面。

網(wǎng)站的原來(lái)的地址是:

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

所以,真正的表單提交的地址應(yīng)該是:

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

輸入一看,果不其然:


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

但是這個(gè)頁(yè)面依舊不是我們需要的頁(yè)面,因?yàn)槲覀兊腜OST數(shù)據(jù)提交到的頁(yè)面,應(yīng)該是表單form的ACTION中提交到的頁(yè)面。

也就是說(shuō),我們需要查看源碼,來(lái)知道POST數(shù)據(jù)到底發(fā)送到了哪里:


嗯,目測(cè)這個(gè)才是提交POST數(shù)據(jù)的地址。

整理到地址欄中,完整的地址應(yīng)該如下:

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

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

5.小試牛刀

接下來(lái)的任務(wù)就是:用python模擬發(fā)送一個(gè)POST的數(shù)據(jù)并取到返回的cookie值。

關(guān)于cookie的操作可以看看這篇博文:

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

我們先準(zhǔn)備一個(gè)POST的數(shù)據(jù),再準(zhǔn)備一個(gè)cookie的接收,然后寫(xiě)出源碼如下:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山東大學(xué)爬蟲(chóng)
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   語(yǔ)言:Python 2.7
#   操作:輸入學(xué)號(hào)和密碼
#   功能:輸出成績(jī)的加權(quán)平均值也就是績(jī)點(diǎn)
#---------------------------------------
import urllib 
import urllib2
import cookielib
cookie = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#需要POST的數(shù)據(jù)#
postdata=urllib.urlencode({ 
    'stuid':'201100300428', 
    'pwd':'921030' 
})
#自定義一個(gè)請(qǐng)求#
req = urllib2.Request( 
    url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login', 
    data = postdata
)
#訪問(wèn)該鏈接#
result = opener.open(req)
#打印返回的內(nèi)容#
print result.read()  

如此這般之后,再看看運(yùn)行的效果:


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

6.偷天換日

接下來(lái)的任務(wù)就是用爬蟲(chóng)獲取到學(xué)生的成績(jī)。

再來(lái)看看源網(wǎng)站。

開(kāi)啟HTTPFOX之后,點(diǎn)擊查看成績(jī),發(fā)現(xiàn)捕獲到了如下的數(shù)據(jù):


點(diǎn)擊第一個(gè)GET的數(shù)據(jù),查看內(nèi)容可以發(fā)現(xiàn)Content就是獲取到的成績(jī)的內(nèi)容。

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


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

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

7.萬(wàn)事俱備

現(xiàn)在萬(wàn)事俱備啦,所以只需要把鏈接應(yīng)用到爬蟲(chóng)里面,看看能否查看到成績(jī)的頁(yè)面。

從httpfox可以看到,我們發(fā)送了一個(gè)cookie才能返回成績(jī)的信息,所以我們就用python模擬一個(gè)cookie的發(fā)送,以此來(lái)請(qǐng)求成績(jī)的信息:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山東大學(xué)爬蟲(chóng)
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   語(yǔ)言:Python 2.7
#   操作:輸入學(xué)號(hào)和密碼
#   功能:輸出成績(jī)的加權(quán)平均值也就是績(jī)點(diǎn)
#---------------------------------------
import urllib 
import urllib2
import cookielib
#初始化一個(gè)CookieJar來(lái)處理Cookie的信息#
cookie = cookielib.CookieJar()
#創(chuàng)建一個(gè)新的opener來(lái)使用我們的CookieJar#
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#需要POST的數(shù)據(jù)#
postdata=urllib.urlencode({ 
    'stuid':'201100300428', 
    'pwd':'921030' 
})
#自定義一個(gè)請(qǐng)求#
req = urllib2.Request( 
    url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login', 
    data = postdata
)
#訪問(wèn)該鏈接#
result = opener.open(req)
#打印返回的內(nèi)容#
print result.read()
#打印cookie的值
for item in cookie: 
    print 'Cookie:Name = '+item.name 
    print 'Cookie:Value = '+item.value
   
#訪問(wèn)該鏈接#
result = opener.open('http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre')
#打印返回的內(nèi)容#
print result.read()

按下F5運(yùn)行即可,看看捕獲到的數(shù)據(jù)吧:


既然這樣就沒(méi)有什么問(wèn)題了吧,用正則表達(dá)式將數(shù)據(jù)稍稍處理一下,取出學(xué)分和相應(yīng)的分?jǐn)?shù)就可以了。

8.手到擒來(lái)

這么一大堆html源碼顯然是不利于我們處理的,下面要用正則表達(dá)式來(lái)?yè)赋霰仨毜臄?shù)據(jù)。

關(guān)于正則表達(dá)式的教程可以看看這個(gè)博文:

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

我們來(lái)看看成績(jī)的源碼:


既然如此,用正則表達(dá)式就易如反掌了。

我們將代碼稍稍整理一下,然后用正則來(lái)取出數(shù)據(jù):

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山東大學(xué)爬蟲(chóng)
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   語(yǔ)言:Python 2.7
#   操作:輸入學(xué)號(hào)和密碼
#   功能:輸出成績(jī)的加權(quán)平均值也就是績(jī)點(diǎn)
#---------------------------------------
import urllib 
import urllib2
import cookielib
import re
class SDU_Spider: 
    # 申明相關(guān)的屬性 
    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' # 顯示成績(jī)的url
        self.cookieJar = cookielib.CookieJar()                                      # 初始化一個(gè)CookieJar來(lái)處理Cookie的信息
        self.postdata=urllib.urlencode({'stuid':'201100300428','pwd':'921030'})     # POST的數(shù)據(jù)
        self.weights = []   #存儲(chǔ)權(quán)重,也就是學(xué)分
        self.points = []    #存儲(chǔ)分?jǐn)?shù),也就是成績(jī)
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar))
    def sdu_init(self):
        # 初始化鏈接并且獲取cookie
        myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata)   # 自定義一個(gè)請(qǐng)求
        result = self.opener.open(myRequest)            # 訪問(wèn)登錄頁(yè)面,獲取到必須的cookie的值
        result = self.opener.open(self.resultUrl)       # 訪問(wèn)成績(jī)頁(yè)面,獲得成績(jī)的數(shù)據(jù)
        # 打印返回的內(nèi)容
        # print result.read()
        self.deal_data(result.read().decode('gbk'))
        self.print_data(self.weights);
        self.print_data(self.points);
    # 將內(nèi)容從頁(yè)面代碼中摳出來(lái) 
    def deal_data(self,myPage): 
        myItems = re.findall('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S)     #獲取到學(xué)分
        for item in myItems:
            self.weights.append(item[0].encode('gbk'))
            self.points.append(item[1].encode('gbk'))
           
    # 將內(nèi)容從頁(yè)面代碼中摳出來(lái)
    def print_data(self,items): 
        for item in items: 
            print item
#調(diào)用 
mySpider = SDU_Spider() 
mySpider.sdu_init() 

水平有限,,正則是有點(diǎn)丑,。運(yùn)行的效果如圖:

ok,接下來(lái)的只是數(shù)據(jù)的處理問(wèn)題了。。

9.凱旋而歸

完整的代碼如下,至此一個(gè)完整的爬蟲(chóng)項(xiàng)目便完工了。

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山東大學(xué)爬蟲(chóng)
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   語(yǔ)言:Python 2.7
#   操作:輸入學(xué)號(hào)和密碼
#   功能:輸出成績(jī)的加權(quán)平均值也就是績(jī)點(diǎn)
#---------------------------------------
import urllib 
import urllib2
import cookielib
import re
import string
class SDU_Spider: 
    # 申明相關(guān)的屬性 
    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' # 顯示成績(jī)的url
        self.cookieJar = cookielib.CookieJar()                                      # 初始化一個(gè)CookieJar來(lái)處理Cookie的信息
        self.postdata=urllib.urlencode({'stuid':'201100300428','pwd':'921030'})     # POST的數(shù)據(jù)
        self.weights = []   #存儲(chǔ)權(quán)重,也就是學(xué)分
        self.points = []    #存儲(chǔ)分?jǐn)?shù),也就是成績(jī)
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar))
    def sdu_init(self):
        # 初始化鏈接并且獲取cookie
        myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata)   # 自定義一個(gè)請(qǐng)求
        result = self.opener.open(myRequest)            # 訪問(wèn)登錄頁(yè)面,獲取到必須的cookie的值
        result = self.opener.open(self.resultUrl)       # 訪問(wèn)成績(jī)頁(yè)面,獲得成績(jī)的數(shù)據(jù)
        # 打印返回的內(nèi)容
        # print result.read()
        self.deal_data(result.read().decode('gbk'))
        self.calculate_date();
    # 將內(nèi)容從頁(yè)面代碼中摳出來(lái) 
    def deal_data(self,myPage): 
        myItems = re.findall('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S)     #獲取到學(xué)分
        for item in myItems:
            self.weights.append(item[0].encode('gbk'))
            self.points.append(item[1].encode('gbk'))
    #計(jì)算績(jī)點(diǎn),如果成績(jī)還沒(méi)出來(lái),或者成績(jī)是優(yōu)秀良好,就不運(yùn)算該成績(jī)
    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
#調(diào)用 
mySpider = SDU_Spider() 
mySpider.sdu_init() 

以上便是此爬蟲(chóng)誕生的全部過(guò)程的詳細(xì)記錄了,有沒(méi)有很神奇的趕腳??哈哈,開(kāi)個(gè)玩笑,需要的朋友參考下吧,自由擴(kuò)展

相關(guān)文章

  • Python基于微信OCR引擎實(shí)現(xiàn)高效圖片文字識(shí)別

    Python基于微信OCR引擎實(shí)現(xiàn)高效圖片文字識(shí)別

    這篇文章主要為大家詳細(xì)介紹了一款基于微信OCR引擎的圖片文字識(shí)別桌面應(yīng)用開(kāi)發(fā)全過(guò)程,可以實(shí)現(xiàn)從圖片拖拽識(shí)別到文字提取,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-06-06
  • python利用pdfplumber進(jìn)行pdf文檔解析提取

    python利用pdfplumber進(jìn)行pdf文檔解析提取

    pdfplumber是一個(gè)純 python 第三方庫(kù),適合 python 3.x 版本,可以用來(lái)查看pdf各類信息,下面小編就來(lái)和大家詳細(xì)講講如何使用pdfplumber進(jìn)行pdf文檔解析提取吧
    2025-05-05
  • Python?Plotly庫(kù)安裝及使用教程

    Python?Plotly庫(kù)安裝及使用教程

    這篇文章主要介紹了包括安裝、導(dǎo)入庫(kù)、Plotly的基本結(jié)構(gòu)、常見(jiàn)圖表類型、樣式定制以及如何與Pandas數(shù)據(jù)框結(jié)合使用,通過(guò)示例代碼和解釋,幫助讀者快速掌握Plotly的使用技巧,需要的朋友可以參考下
    2025-03-03
  • 基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解

    基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解

    這篇文章主要介紹了基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2023-05-05
  • pytest+allure環(huán)境搭建+自動(dòng)化實(shí)踐過(guò)程

    pytest+allure環(huán)境搭建+自動(dòng)化實(shí)踐過(guò)程

    這篇文章主要介紹了pytest+allure環(huán)境搭建+自動(dòng)化實(shí)踐過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Python urlopen()和urlretrieve()用法解析

    Python urlopen()和urlretrieve()用法解析

    這篇文章主要介紹了Python urlopen()和urlretrieve()用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python 動(dòng)態(tài)繪制愛(ài)心的示例

    python 動(dòng)態(tài)繪制愛(ài)心的示例

    這篇文章主要介紹了python 動(dòng)態(tài)繪制愛(ài)心的示例,幫助大家利用python繪制圖像,感興趣的朋友可以了解下
    2020-09-09
  • Python實(shí)現(xiàn)Excel批量處理+郵件自動(dòng)發(fā)送的全流程

    Python實(shí)現(xiàn)Excel批量處理+郵件自動(dòng)發(fā)送的全流程

    在日常辦公中,重復(fù)的 Excel 數(shù)據(jù)整理、報(bào)表生成與郵件分發(fā)工作占據(jù)大量時(shí)間,本文將手把手教你用 Python 實(shí)現(xiàn) Excel 數(shù)據(jù)批量處理 + 自動(dòng)化郵件發(fā)送全流程,需要的朋友可以參考下
    2025-12-12
  • 使用Python實(shí)現(xiàn)文本情感分析預(yù)處理的詳細(xì)教程

    使用Python實(shí)現(xiàn)文本情感分析預(yù)處理的詳細(xì)教程

    在自然語(yǔ)言處理(NLP)領(lǐng)域,文本情感分析是一項(xiàng)重要任務(wù),它旨在通過(guò)計(jì)算機(jī)技術(shù)識(shí)別和提取文本中的情感傾向(如正面、負(fù)面或中性),為了實(shí)現(xiàn)準(zhǔn)確的情感分析,預(yù)處理步驟至關(guān)重要,所以本文給大家介紹了使用Python實(shí)現(xiàn)文本情感分析預(yù)處理的詳細(xì)教程,需要的朋友可以參考下
    2025-04-04
  • Ubuntu下Anaconda和Pycharm配置方法詳解

    Ubuntu下Anaconda和Pycharm配置方法詳解

    這篇文章主要為大家詳細(xì)介紹了Ubuntu下Anaconda和Pycharm配置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評(píng)論

工布江达县| 开江县| 黑河市| 那坡县| 宜兴市| 廊坊市| 明光市| 廊坊市| 兰考县| 肇庆市| 厦门市| 大荔县| 芮城县| 正阳县| 乐昌市| 鲁甸县| 吴江市| 彭泽县| 佛山市| 观塘区| 高邮市| 南昌县| 六安市| 光山县| 景泰县| 虎林市| 永嘉县| 石棉县| 海口市| 耒阳市| 河源市| 来宾市| 桐城市| 临邑县| 通山县| 宿迁市| 城市| 肥西县| 梅州市| 合肥市| 右玉县|