使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析
使用Python爬取“最好大學網”軟科中國最好大學排名2019并做可視化分析
- 簡介
- 開發環境
- 爬取數據
- 1.獲取網站頁面
- 2.解析網頁內容
- 3.存儲數據
- 可視化分析
- 基本設置
- 顯示評分排名前十的大學
- 各地區大學比例
簡介
軟科中國最好大學排名2019
圖一
網站格式如上,我們主要爬取排名、學校名稱、省市、總分4個數據。并做可視化分析。
開發環境
- csv (數據存儲)
- BeautifulSoup (網頁內容解析)
- request (網頁下載)
- pandas (數據讀取、分析)
- matplotlib、pylab (畫圖)
爬取數據
1.獲取網站頁面
我們使用request庫將整個網頁內容下載下來。過程非常的簡單。
def getHTMLText(url):try:resp = request.urlopen(url)html_data = resp.read().decode('utf-8')return html_dataexcept:return ""pass這里request.urlopen(url)返回的是一個response對象,再通過read()方法就可以獲得網頁的內容了。
2.解析網頁內容
我們使用BeautifulSoup來解析整個的網頁內容。
通過觀察網頁源代碼的方式我們可以發現
數據內容都存放在這個’tbody’元素中。
不難發現網頁上的每一行數據都存放在一個’tr’元素中,每個’tr’元素下的前4個’td’元素就是我們要的數據。
3.存儲數據
我們通過上一步爬取下來的ulist是一個二維的列表,我們要把它轉換為字典的形式存儲到csv文件中。
def ulist_to_dict(ulist):tag_list = ['index', 'name', 'area', 'score']for i, u in enumerate(ulist):ulist.pop(i)ulist.insert(i, dict(zip(tag_list, u)))passpass通過運行上面的函數我們就可以將列表中的子列表替換成字典。
def write_to_file(items):with(open('university.csv', 'a', encoding='utf_8_sig', newline='')) as f:fieldnames = ['index', 'name', 'area', 'score']w = csv.DictWriter(f, fieldnames=fieldnames)for i in items:w.writerow(i)passpass可視化分析
基本設置
我們導入matplotlib包
import matplotlib.pyplot as plt接著做一些設置,讓我們畫出的圖像更加美觀。
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['font.family'] = 'sans-serif' # 解決符號'-'亂碼問題 plt.rcParams['axes.unicode_minus'] = False # 設置主題 plt.style.use('ggplot') # 設置柱形圖圖片大小 fig = plt.figure(figsize=(8, 5)) colors1 = "#6D6D6D"接著導入數據
import pandas as pd column = ['index', 'name', 'area', 'score'] # 打開csv文件 df = pd.read_csv('university.csv', encoding='utf-8', header=None, names=column, index_col='index')顯示評分排名前十的大學
首先我們要對數據按照大學的評分進行排序
我們可以看到通過pandas導入的數據格式是非常清楚的。
因為分數是直接的數值所以我們可以用pandas內置的sort方法進行排序
這樣我們就得到了排序過的數據。
name1 = df_score.name[:10] # x軸坐標 score1 = df_score.score[:10] # y軸坐標這樣可以獲得數據中的前10項。
plt.bar(range(10), score1, tick_label=name1) # 繪制條形圖,用range保持順序一致 plt.ylim(min(df_score.score), max(df_score.score)+5) plt.title("軟科中國最好大學排名2019TOP10", color=colors1) plt.ylabel("評分") # 標記數值 for x, y in enumerate(list(score1)):plt.text(x, y + 0.01, '%s' % round(y, 1), ha='center')pass pl.xticks(rotation=90) # 旋轉270° plt.tight_layout() # 去除空白 plt.show()
可以看出清華位居第一并且遙遙領先第二名,北京大學、浙江大學、上海交通大學緊隨其后。
各地區大學比例
我們要展示各地區大學所占比例首先要進行數量上的統計
df_area_list = df.get("area").to_list() df_area_set = set(df_area_list) areas = {} for area in df_area_set:areas[area] = df_area_list.count(area)pass首先我們將地區這一列數據單獨提取出來然后轉換為列表格式df_area_list。在創建一個集合df_area_set,通過創建集合的方式可以非常簡便的對列表進行去重。然后根據集合中的每一個元素在列表中統計他們出現的次數,最終將他們存儲在字典中。
areas_sorted = dict(sorted(areas.items(), key=lambda mys: (mys[1]), reverse=True)) area = list(areas_sorted.keys()) counts = list(areas_sorted.values()) show_area = area[:15] show_area.append("其它省") show_counts = counts[:15] show_counts.append(sum(counts[15:]))然后我們將統計好的數據進行進一步的處理,首先對字典進行排序,這里用到了lambda表達式,這樣的寫法就可以按照字典的值進行排序,如果填寫mys[0]的話就會按照字典的鍵進行排序。
排序完成后我們整理一下要展示的數據就可以進行可視化操作了。
plt.pie()畫一個餅圖,參數如下
'%1.1f’指小數點前后位數(沒有用空格補齊);
最終我們得到的圖如下
可以看出北京、江蘇的優秀大學數量較多。
總結
以上是生活随笔為你收集整理的使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带滤镜拍照的app_iPhone摄影师必
- 下一篇: python unicode转中文_Py