大學(xué)排名爬蟲(chóng)實(shí)例

項(xiàng)目基本信息
目標(biāo)網(wǎng)站:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
輸入:大學(xué)排名URL鏈接
輸出:大學(xué)排名信息的屏幕輸出(排名,大學(xué)名稱(chēng),總分)
技術(shù)路線:requests-bs4
定向爬蟲(chóng):僅對(duì)輸入 URL 進(jìn)行爬取,不擴(kuò)展爬取

程序的結(jié)構(gòu)設(shè)計(jì):
步驟1:從網(wǎng)絡(luò)上獲取大學(xué)排名網(wǎng)頁(yè)內(nèi)容??getHTMLText()
步驟2:提取網(wǎng)頁(yè)內(nèi)容中信息到合適的數(shù)據(jù)結(jié)構(gòu)??fillUnivList()
步驟3:利用數(shù)據(jù)結(jié)構(gòu)展示并輸出結(jié)果??printUnivList()

目標(biāo)網(wǎng)頁(yè)樣式:

相關(guān)知識(shí)
格式化字符串的函數(shù): str.format()
基本語(yǔ)法是通過(guò) {} 和 : 來(lái)代替以前的 % 。format 函數(shù)可以接受不限個(gè)參數(shù),位置可以不按順序。
一般用法:

"{} {}".format("hello", "world")
"{0} {1}".format("hello", "world")
"{1} {0} {1}".format("hello", "world")
"網(wǎng)站名:{name},地址:{url}".format(name="百度", url="www.baidu.com")

格式化輸出:
^, <, > 分別是居中、左對(duì)齊、右對(duì)齊,后面帶寬度,: 號(hào)后面帶填充的字符,只能是一個(gè)字符,不指定則默認(rèn)是用空格填充。+ 表示在正數(shù)前顯示 +,負(fù)數(shù)前顯示 -;(空格)表示在正數(shù)前加空格。
b、d、ox 分別是二進(jìn)制、十進(jìn)制、八進(jìn)制、十六進(jìn)制。

數(shù)據(jù) 格式 輸出 描述
2.718 {:.0f} 3 不帶小數(shù)
5 {:0>2d} 05 數(shù)字補(bǔ)零 (填充左邊, 寬度為2) 十進(jìn)制
1000000 {:,} 1,000,000 以逗號(hào)分隔的數(shù)字格式
0.25 {:.2%} 25.00% 百分比格式

實(shí)例編寫(xiě)

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('td')
            ulist.append([tds[0].string, tds[1].string, tds[3].string])
 
def printUnivList(ulist, num):
    print("{:^10}\t{:^6}\t{:^10}".format("排名","學(xué)校名稱(chēng)","總分"))
    for i in range(num):
        u=ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
     
def main():
    uinfo = []
    url = 'https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20) # 20 univs
main()

輸出結(jié)果:

實(shí)例優(yōu)化
當(dāng)中文字符寬度不夠時(shí),采用西文字符填充;中西文字符占用寬度不同。采用中文字符的空格填充 char(12288)。

代碼修改:

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

: 前的索引對(duì)應(yīng)后面的內(nèi)容,: 后面為輸出的格式,:{3}^10 表示以空格填充,寬度為 10 ,居中對(duì)齊,其中 3 即為空格的索引。

輸出結(jié)果:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容