python采集世界大學(xué)排名并作數(shù)據(jù)可視化, 來看看你的母校上榜沒~

前言

嗨嘍述么,大家好呀~這里是愛看美女的茜茜吶


代碼提供者:青燈教育-巳月

知識點:

  • 動態(tài)數(shù)據(jù)抓包
  • requests發(fā)送請求
  • 結(jié)構(gòu)化+非結(jié)構(gòu)化數(shù)據(jù)解析

準備工作

下面的盡量跟我保持一致哦~不然有可能會發(fā)生報錯 ??

開發(fā)環(huán)境:

  • python 3.8
    運行代碼
  • pycharm 2021.2
    輔助敲代碼
  • requests
    第三方模塊 pip install 模塊名

如果安裝python第三方模塊:

  1. win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車

  2. 在pycharm中點擊Terminal(終端) 輸入安裝命令


如何配置pycharm里面的python解釋器?

  1. 選擇file(文件) >>> setting(設(shè)置) >>> Project(項目) >>> python interpreter(python解釋器)

  2. 點擊齒輪, 選擇add

  3. 添加python安裝路徑


pycharm如何安裝插件?

  1. 選擇file(文件) >>> setting(設(shè)置) >>> Plugins(插件)

  2. 點擊 Marketplace 輸入想要安裝的插件名字 比如:翻譯插件 輸入 translation / 漢化插件 輸入 Chinese

  3. 選擇相應(yīng)的插件點擊 install(安裝) 即可

  4. 安裝成功之后 是會彈出 重啟pycharm的選項 點擊確定, 重啟即可生效


代碼

采集排名數(shù)據(jù)

import requests
import re
import csv
def replace(str_):
    str_ = re.findall('<div class="td-wrap"><div class="td-wrap-in">(.*?)</div></div>', str_)[0]
    return str_
   
with open('rank.csv', mode='a', encoding='utf-8', newline='') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(['country', 'rank', 'region', 'score_1', 'score_2', 'score_3', 'score_4', 'score_5', 'score_6', 'stars', 'total_score', 'university', 'year'])
url = 'https://www.qschina.cn/sites/default/files/qs-rankings-data/cn/2057712_indicators.txt'
response = requests.get(url=url)
json_data = response.json()
data = json_data['data']
for i in data:
    country = i['location'] # 國家/地區(qū)
    rank = i['overall_rank']    # 排名
    region = i['region']    # 大洲
    score_1 = replace(i['ind_76'])  # 學(xué)術(shù)聲譽
    score_2 = replace(i['ind_77'])  # 雇主聲譽
    score_3 = replace(i['ind_36'])  # 師生比
    score_4 = replace(i['ind_73'])  # 教員引用率
    score_5 = replace(i['ind_18'])  # 國際教室
    score_6 = replace(i['ind_14'])  # 國際學(xué)生
    stars = i['stars']  # 星級
    total_score = replace(i['overall']) # 總分
    university = i['uni']   # 大學(xué)
    university = re.findall('<div class="td-wrap".*?class="uni-link">(.*?)</a></div></div>', university)[0]
    year = "2021"   # 年份
    print(country, rank, region, score_1, score_2, score_3, score_4, score_5, score_6, stars, total_score, university, year)
    with open('rank.csv', mode='a', encoding='utf-8', newline='') as f:
        csv_writer = csv.writer(f)
        csv_writer.writerow([country, rank, region, score_1, score_2, score_3, score_4, score_5, score_6, stars, total_score, university, year])

數(shù)據(jù)分析代碼

from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.components import Table
import re
import pandas as pd
df = pd.read_csv('rank.csv')

# 香港,澳門與中國大陸地區(qū)等在榜單中是分開的記錄的悴了,這邊都歸為china
df['loc'] = df['country']
df['country'].replace(['China (Mainland)', 'Hong Kong SAR', 'Taiwan', 'Macau SAR'],'China',inplace=True)

tool_js = """
<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">
                 {} 
                 </div>
                 排名:{} <br>
                 國家地區(qū):{} <br>
                 加權(quán)總分:{} <br>
                 國際學(xué)生:{} <br>
                 國際教師:{} <br>
                 師生比例:{} <br>
                 學(xué)術(shù)聲譽:{} <br>
                 雇主聲譽:{} <br>
                 教員引用率:{} <br>
"""

t_data = df[(df.year==2021) & (df['rank']<=100)]
t_data = t_data.sort_values(by="total_score" , ascending=True) 

university, score = [], []
for idx, row in t_data.iterrows():
    tjs = tool_js.format(row['university'], row['rank'], row['country'],row['total_score'], 
                         row['score_6'],row['score_5'], row['score_3'],row['score_1'],row['score_2'], row['score_4'])
    if row['country'] == 'China':
        university.append('???? {}'.format(re.sub('(.*?)', '',row['university'])))
    else:
        university.append(re.sub('(.*?)', '',row['university']))
    score.append(opts.BarItem(name='', value=row['total_score'], tooltip_opts=opts.TooltipOpts(formatter=tjs)))

### TOP 100高校

篇幅有限,這邊只展示TOP100的高校悟衩,完整的榜單可以通過附件下載查看~

* 排名第一的大學(xué)是麻省理工路鹰,在單項上除了**國際學(xué)生**和**教員引用率**其余都是100分;

* TOP4大學(xué)全部來自美國筒饰,除此之外是排名第五的牛津大學(xué);

* **國內(nèi)排名最高的大學(xué)是清華大學(xué)壁晒,排名15**瓷们,其次是香港大學(xué)&北京大學(xué);

bar = (Bar()
       .add_xaxis(university)
       .add_yaxis('', score, category_gap='30%')
       .set_global_opts(title_opts=opts.TitleOpts(title="2021年世界大學(xué)排名(QS) TOP 100",
                                                  pos_left="center",
                                                  title_textstyle_opts=opts.TextStyleOpts(font_size=20)),
                        datazoom_opts=opts.DataZoomOpts(range_start=70, range_end=100, orient='vertical'),
                        visualmap_opts=opts.VisualMapOpts(is_show=False, max_=100, min_=60, dimension=0,
                                range_color=['#00FFFF', '#FF7F50']),
                        legend_opts=opts.LegendOpts(is_show=False),
                        xaxis_opts=opts.AxisOpts(is_show=False, is_scale=True),
                        yaxis_opts=opts.AxisOpts(axistick_opts=opts.AxisTickOpts(is_show=False),
                                                 axisline_opts=opts.AxisLineOpts(is_show=False),
                                                 axislabel_opts=opts.LabelOpts(font_size=12)))
       .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
                                                  position='right',
                                                  font_style='italic'),
                        itemstyle_opts={"normal": {
                                                    "barBorderRadius": [30, 30, 30, 30],
                                                    'shadowBlur': 10,
                                                    'shadowColor': 'rgba(120, 36, 50, 0.5)',
                                                    'shadowOffsetY': 5,
                                                }
                                       }
).reversal_axis())

grid = (
        Grid(init_opts=opts.InitOpts(theme='purple-passion', width='1000px', height='1200px'))
        .add(bar, grid_opts=opts.GridOpts(pos_right='10%', pos_left='20%'))
    )
grid.render_notebook()

tool_js = """
<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">
                 {} 
                 </div>
                 世界排名:{} <br>
                 國家地區(qū):{} <br>
                 加權(quán)總分:{} <br>
                 國際學(xué)生:{} <br>
                 國際教師:{} <br>
                 師生比例:{} <br>
                 學(xué)術(shù)聲譽:{} <br>
                 雇主聲譽:{} <br>
                 教員引用率:{} <br>
"""

t_data = df[(df.country=='China') & (df['rank']<=500)]
t_data = t_data.sort_values(by="total_score" , ascending=True) 

university, score = [], []
for idx, row in t_data.iterrows():
    tjs = tool_js.format(row['university'], row['rank'], row['country'],row['total_score'], 
                         row['score_6'],row['score_5'], row['score_3'],row['score_1'],row['score_2'], row['score_4'])
    if row['country'] == 'China':
        university.append('???? {}'.format(re.sub('(.*?)', '',row['university'])))
    else:
        university.append(re.sub('(.*?)', '',row['university']))
    score.append(opts.BarItem(name='', value=row['total_score'], tooltip_opts=opts.TooltipOpts(formatter=tjs)))

### 中國大學(xué)排名

因為在500名之后沒有具體的分值秒咐,所以這里只篩選了榜單TOP 500中的國內(nèi)高校谬晕;

* 在第一梯隊中,香港的高校占比很高携取,**TOP10中有4所來自香港**固蚤;

* 刨除香港的高校,**TOP5高校分別是清華歹茶,北大,復(fù)旦你弦,上交惊豺,浙大**;

bar = (Bar()
       .add_xaxis(university)
       .add_yaxis('', score, category_gap='30%')
       .set_global_opts(title_opts=opts.TitleOpts(title="TOP 500中的中國大學(xué)",
                                                  pos_left="center",
                                                  title_textstyle_opts=opts.TextStyleOpts(font_size=20)),
                        datazoom_opts=opts.DataZoomOpts(range_start=50, range_end=100, orient='vertical'),
                        visualmap_opts=opts.VisualMapOpts(is_show=False, max_=90, min_=20, dimension=0,
                                range_color=['#00FFFF', '#FF7F50']),
                        legend_opts=opts.LegendOpts(is_show=False),
                        xaxis_opts=opts.AxisOpts(is_show=False, is_scale=True),
                        yaxis_opts=opts.AxisOpts(axistick_opts=opts.AxisTickOpts(is_show=False),
                                                 axisline_opts=opts.AxisLineOpts(is_show=False),
                                                 axislabel_opts=opts.LabelOpts(font_size=12)))
       .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
                                                  position='right',
                                                  font_style='italic'),
                        itemstyle_opts={"normal": {
                                                    "barBorderRadius": [30, 30, 30, 30],
                                                    'shadowBlur': 10,
                                                    'shadowColor': 'rgba(120, 36, 50, 0.5)',
                                                    'shadowOffsetY': 5,
                                                }
                                       }
).reversal_axis())

grid = (
        Grid(init_opts=opts.InitOpts(theme='purple-passion', width='1000px', height='1200px'))
        .add(bar, grid_opts=opts.GridOpts(pos_right='10%', pos_left='20%'))
    )
grid.render_notebook()
### 按大洲分布

* TOP 1000高校中有**近40%是來自于歐洲**禽作;

* 非洲僅有11所高校上榜尸昧;

t_data = df[(df.year==2021) & (df['rank']<=1000)]
t_data = t_data.groupby(['region'])['university'].count().reset_index()
t_data.columns = ['region', 'num']
t_data = t_data.sort_values(by="num" , ascending=False) 

軟件、解答旷偿、源碼烹俗、教程可以加Q群:832157862免費獲取~
bar = (Bar(init_opts=opts.InitOpts(theme='purple-passion', width='1000px', height='600px'))
       .add_xaxis(t_data['region'].tolist())
       .add_yaxis('出現(xiàn)次數(shù)', t_data['num'].tolist(), category_gap='50%')
       .set_global_opts(title_opts=opts.TitleOpts(title="TOP 1000高校按大洲分布",
                                                  pos_left="center",
                                                  title_textstyle_opts=opts.TextStyleOpts(font_size=20)),
                        visualmap_opts=opts.VisualMapOpts(is_show=False, max_=300, min_=0, dimension=1,
                                range_color=['#00FFFF', '#FF7F50']),
                        legend_opts=opts.LegendOpts(is_show=False),
                        xaxis_opts=opts.AxisOpts(axistick_opts=opts.AxisTickOpts(is_show=False),
                                                 axisline_opts=opts.AxisLineOpts(is_show=False),
                                                 axislabel_opts=opts.LabelOpts(font_size=15)),
                        yaxis_opts=opts.AxisOpts(is_show=False))
       .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
                                                  position='top',
                                                  font_size=15,
                                                  font_style='italic'),
                        itemstyle_opts={"normal": {
                                                    "barBorderRadius": [30, 30, 30, 30],
                                                    'shadowBlur': 10,
                                                    'shadowColor': 'rgba(120, 36, 50, 0.5)',
                                                    'shadowOffsetY': 5,
                                                }
                                       }
))

bar.render_notebook()

可視化效果(部分)

尾語 ??

感謝你觀看我的文章吶~本次航班到這里就結(jié)束啦 ??

希望本篇文章有對你帶來幫助 ??爆侣,有學(xué)習(xí)到一點知識~

躲起來的星星??也在努力發(fā)光,你也要努力加油(讓我們一起努力叭)幢妄。

最后兔仰,博主要一下你們的三連呀(點贊、評論蕉鸳、收藏)乎赴,不要錢的還是可以搞一搞的嘛~

不知道評論啥的,即使扣個6666也是對博主的鼓舞吖 ?? 感謝 ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潮尝,一起剝皮案震驚了整個濱河市榕吼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勉失,老刑警劉巖羹蚣,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乱凿,居然都是意外死亡顽素,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門告匠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戈抄,“玉大人,你說我怎么就攤上這事后专』耄” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵戚哎,是天一觀的道長裸诽。 經(jīng)常有香客問我,道長型凳,這世上最難降的妖魔是什么丈冬? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮甘畅,結(jié)果婚禮上埂蕊,老公的妹妹穿的比我還像新娘。我一直安慰自己疏唾,他們只是感情好蓄氧,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著槐脏,像睡著了一般喉童。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿天,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天堂氯,我揣著相機與錄音蔑担,去河邊找鬼。 笑死咽白,一個胖子當(dāng)著我的面吹牛啤握,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播局扶,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼恨统,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了三妈?” 一聲冷哼從身側(cè)響起畜埋,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畴蒲,沒想到半個月后悠鞍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡模燥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年咖祭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫骂。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡么翰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辽旋,到底是詐尸還是另有隱情浩嫌,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布补胚,位于F島的核電站码耐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏溶其。R本人自食惡果不足惜骚腥,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓶逃。 院中可真熱鬧束铭,春花似錦措左、人聲如沸哼勇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽代芜。三九已至,卻和暖如春浓利,著一層夾襖步出監(jiān)牢的瞬間挤庇,已是汗流浹背钞速。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫡秕,地道東北人渴语。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像昆咽,于是被迫代替她去往敵國和親驾凶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容