Python:使用爬蟲獲取世界大學學術排名存儲到 Excel 並作可視化輸出

問題描述

http://www.zuihaodaxue.cn/ 網站中爬取數據,獲取世界大學學術排名(Top10)

  • 爬取的數據保存爲Excel文件(.xlsx)
  • 進一步考慮,數據可視化輸出(附加)

問題分析

換湯不換藥,相關解釋請查閱這篇文章:Python:使用爬蟲獲取中國最好的大學排名數據(爬蟲入門)

這裏就不在贅述了,直接寫代碼。

結果展示

在這裏插入圖片描述
在這裏插入圖片描述
數據分析
不過我覺得轉化爲餅圖會更直觀一些,但是那樣會有子圖,如果有時間我會更新一下餅圖看看效果會不會更好一點。

代碼實現

準備工作,請確保安裝了以下庫函數。

需要安裝 pyecharts(與 matplotlib 相比更美觀,具有交互性,適合網站頁面或商業報告展示)。

安裝適用命令:

pip install -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn pyecharts

在這裏插入圖片描述
關於如何使用請查閱 官方文檔

目標網站:http://www.zuihaodaxue.cn/ARWU2019.html
"""
@author: shoo Wang
@contact: [email protected]
@file: demo03.py
@time: 2020/5/10 0010
"""
import requests as rq
from bs4 import BeautifulSoup as Bs
import pandas as pd
import numpy as np
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType


# 獲取數據,就是通過訪問網頁,把他的html源代碼拿過來
def getData(resLoc):
    rp = rq.get(resLoc)
    rp.encoding = 'utf-8'
    return rp.text


# 最關鍵的部分: 數據處理,我們的目標是將文本格式的 html 網頁轉化爲表格的形式;
def dataProcessing(html, num):
    bs = Bs(html, features='lxml')

    # 獲取 html 中 DOM 樹的表格結構
    table = bs.table.tbody.find_all('tr', limit=num, recursive=True)
    universityList = []

    # 遍歷該表格,篩選出我們需要的信息存儲到 universityList 中
    for tr in table:
        tds = tr.find_all('td')
        contents = [td.contents for td in tds]
        contents[1] = contents[1][0].contents

        # 這裏網頁中是圖片,但是可以通過截取字符串獲取到國家的英文簡寫
        contents[2] = contents[2][0]['href'].split('/')[1].split('.')[0]
        contents = [''.join(i) for i in contents]
        # ['1', '哈佛大學', 'USA', '1', '100.0', '100.0', '100.0', '100.0', '100.0', '100.0', '78.2']
        universityList.append(contents)

    # 自己寫表頭,因爲網站上爬太複雜了
    thf = ['世界排名', '學校', '國家', '在該國家的排名', '總分', '校友獲獎', '教師獲獎',
           '高被引學者', 'N&S論文', '國際論文', '師均表現']

    # 轉化爲 DataFrame 結構,因爲這種結構很好轉化爲 Excel
    pd_universityList = pd.DataFrame(np.array(universityList), columns=thf)
    return pd_universityList


# 負責保存數據到本地磁盤
def saveData(data):
    data.to_excel('university.xlsx', index=False)


# 數據可視化
def can_view(universityList):
    # 將 pandas 數據類型轉化爲 numpy 數組
    data = np.array(universityList)

    # 獲取 總分 數據項, 下面的也以此類推
    da1 = [eval(i[4]) for i in data]
    da2 = [eval(i[5]) for i in data]
    da3 = [eval(i[6]) for i in data]
    da4 = [eval(i[7]) for i in data]
    da5 = [eval(i[8]) for i in data]
    da6 = [eval(i[9]) for i in data]
    da7 = [eval(i[10]) for i in data]

    # 獲取大學名稱作爲橫座標
    un = [i[1] for i in data]

    # 在 InitOpts 中可以設置主題樣式和圖表的寬度
    bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT, width='2000px'))
           .add_xaxis(un)
           .add_yaxis('總分', da1)
           .add_yaxis('校友獲獎', da2)
           .add_yaxis('教師獲獎', da3)
           .add_yaxis('高被引學者', da4)
           .add_yaxis('N&S論文', da5)
           .add_yaxis('國際論文', da6)
           .add_yaxis('師均表現', da7)
    
           # 設置標題, AxisOpts 是設置橫座標的每一個數據項的傾斜程度
           .set_global_opts(title_opts=opts.TitleOpts(title="世界大學學術排名"),
                            xaxis_opts=opts.AxisOpts(name_rotate=60, name="大學名稱", axislabel_opts={"rotate": 45}))
           )
    bar.render()


def main(num):
    # 由於該網站最多有 1000 個大學,所以輸入的數字不能大於 1000 ,否則什麼也不做
    if num >= 1000:
        print("數量不能大於1000")
        return
    else:
        url = 'http://www.zuihaodaxue.cn/ARWU2019.html'
        universityList = dataProcessing(getData(url), num)
        saveData(universityList)
        print("文件保存成功!")
        can_view(universityList)


# 測試,爬取前10名大學的信息
main(10)

由於我對於 numpy 庫不是很熟,所以可能有些地方對數據的處理多此一舉了,還請讀者指出問題所在。

運行的結果是一個 html 文件,可以直接在瀏覽器運行,他是使用 js 加載的。
在這裏插入圖片描述
在該函數中可以指定文件名,如果不指定則默認爲 render.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章