python爬蟲學習心得:中國大學排名(附代碼)


今天下午花時間學習了python爬蟲的中國大學排名實例,頗有心得,於是在博客園與各位分享

首先直接搬代碼:

import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def fillUnivList(ulist, html):
    soup = BeautifulSoup(html,"html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds = tr.find_all('td')
            ulist.append([tds[0].string,tds[1].string,tds[3].string])

def printUnivList(ulist,num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","學校","總分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0],u[1],u[2],chr(12288)))

def main():
    uinfo = []
    url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo,20)
main()

再附上大學排名截圖:

那么,現在開始代碼心得講解:

首先開始分析網頁結構:

打開http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html

打開chrome網頁分析工具:

可以發現大學排名,學校名稱,省市,總分等都處在tbody標簽內

而大學名稱、省市等,都處於tr標簽內的td

 

好,分析完成,開始構建函數架構:

主要思想為:獲取網頁html文本,得到需求數據,並將需求數據轉化為列表,最后將列表輸出

下一步:開始補充getHTMLText()部分的代碼:

這里我用try except形式編寫代碼:

首先獲取網頁url,時限為30s,j接着運用 r.raise_for_status()(如果 HTTP 請求返回了不成功的狀態碼, r.raise_for_status() 會拋出一個 HTTPError異常)

然后將網頁轉碼為r.apparent_encoding

返回一個r.text

這里代碼運行中如果出現錯誤,則會return "",返回一個空字符串

 

接下來開始編寫fillUnivList()部分代碼

我們先做一鍋湯,定義為soup,然后在這鍋湯中遍歷tr的孩子,這里每一個tr都對應一所大學的信息

而且我們需要濾掉非標簽類型的其他信息,所以運用isinstance對函數類型做一個判斷

if isinstance(tr,bs4.element.Tag):

這行代碼就是檢測標簽類型,如果標簽不是bs4庫定義的類型,將過濾掉,同時為了運用這個方法,我們也就需要引入bs4庫

由於tr標簽已經被解析出來,接下來就需要對tr標簽中的td標簽做查詢

if isinstance(tr,bs4.element.Tag):
    tds = tr.find_all('td')

這里把查詢到的td標簽存入tds列表中

再然后在ulist表中增加:排名,大學名和總分的對應字段

ulist.append([tds[0].string,tds[1].string,tds[3].string])

接着來編寫printUnivList()函數

注意:這里的{:^10}表示取10位居中對齊,^是居中對齊,\t是橫向制表符。

ok,主要代碼完成,希望可以幫到你。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM