2020-04-14 中國(guó)大學(xué)排名定向爬蟲

功能描述

  • 輸入:大學(xué)排名URL鏈接
  • 輸出:大學(xué)排名信息的屏幕輸出(排名,大學(xué)名稱,總分)
  • 技術(shù)路線:requests-bs4
  • 定向爬蟲:僅對(duì)輸入U(xiǎn)RL進(jìn)行爬取,不擴(kuò)展爬取。
    經(jīng)查看網(wǎng)頁源代碼發(fā)現(xiàn),要爬取的內(nèi)容均寫在html網(wǎng)頁中,所以這個(gè)定向爬蟲是可以實(shí)現(xiàn)的。
    而且查看爬取網(wǎng)頁的robots協(xié)議,發(fā)現(xiàn)無此頁面,說明爬取大學(xué)排名這個(gè)功能是完全可以合法實(shí)現(xiàn)的。


    QQ圖片20200414165828.png
  • 實(shí)現(xiàn)目標(biāo):
    能夠打印出如下所示的表格:


    image.png

程序的結(jié)構(gòu)設(shè)計(jì)

  • 步驟一:從網(wǎng)絡(luò)上獲取大學(xué)排名的網(wǎng)頁內(nèi)容
    getHTMLText()
  • 步驟二:提取網(wǎng)頁內(nèi)容中信息放到合適的數(shù)據(jù)結(jié)構(gòu)中,這樣可以將信息編程代碼的一部分(關(guān)鍵??!
    getUnivList()
  • 步驟三:利用數(shù)據(jù)結(jié)構(gòu)展示并輸出結(jié)果
    printUnivList()

經(jīng)分析,爬取到的內(nèi)容是個(gè)二維數(shù)據(jù)結(jié)構(gòu),所以可以采取列表的方式(二維列表:即列表中的每個(gè)元素又是一個(gè)列表)

  • 代碼實(shí)現(xiàn):
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 ""

#提取html中關(guān)鍵數(shù)據(jù),添加到一個(gè)列表中
def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    #尋找tbody標(biāo)簽并對(duì)其孩子節(jié)點(diǎn)進(jìn)行遍歷,這里的tr是一所大學(xué)對(duì)應(yīng)的信息
    #需要過濾掉非標(biāo)簽類型的其他信息
    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[2].string])

#需要進(jìn)行格式化輸出
def printUnivList(ulist, num):
    #打印表頭
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","學(xué)校名稱","總分", 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) # 只輸出前20名
main()
  • 輸出結(jié)果:
    排名         學(xué)校名稱         總分    
    1          清華大學(xué)        北京市    
    2          北京大學(xué)        北京市    
    3          浙江大學(xué)        浙江省    
    4         上海交通大學(xué)       上海市    
    5          復(fù)旦大學(xué)        上海市    
    6          南京大學(xué)        江蘇省    
    7        中國(guó)科學(xué)技術(shù)大學(xué)      安徽省    
    8        哈爾濱工業(yè)大學(xué)       黑龍江省   
    9         華中科技大學(xué)       湖北省    
    10         中山大學(xué)        廣東省    
    11         東南大學(xué)        江蘇省    
    12         天津大學(xué)        天津市    
    13         同濟(jì)大學(xué)        上海市    
    14       北京航空航天大學(xué)      北京市    
    15         四川大學(xué)        四川省    
    16         武漢大學(xué)        湖北省    
    17        西安交通大學(xué)       陜西省    
    18         南開大學(xué)        天津市    
    19        大連理工大學(xué)       遼寧省    
    20         山東大學(xué)        山東省 
  • 知識(shí)點(diǎn):

此方法在中文輸出排版方面很有效。

python中format函數(shù)用法
chr()函數(shù)用法

format方法中兩個(gè)重要屬性:
①填充:用于填充的單個(gè)字符
②寬度:槽的設(shè)定輸出寬度

當(dāng)中文字符寬度不夠時(shí),采用西文字符填充;中西文字符占用寬度不同

中文對(duì)齊問題是一個(gè)通用問題,在任何需要中英文混合輸出的情況下,他都是個(gè)問題

解決方案:
字符寬度不夠時(shí)用中文字符填充而不是西文字符填充,那么對(duì)齊的問題就解決了
UTF-8編碼對(duì)應(yīng)的中文空格信息叫做12288
我們可以用chr(12288)來引入到函數(shù)中

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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