日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析

發布時間:2023/12/29 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Python爬取“最好大學網”軟科中國最好大學排名2019并做可視化分析

  • 簡介
  • 開發環境
  • 爬取數據
    • 1.獲取網站頁面
    • 2.解析網頁內容
    • 3.存儲數據
  • 可視化分析
    • 基本設置
    • 顯示評分排名前十的大學
    • 各地區大學比例

簡介

軟科中國最好大學排名2019


圖一

網站格式如上,我們主要爬取排名、學校名稱、省市、總分4個數據。并做可視化分析。

開發環境

  • Python 3.7
  • PyCharm
  • 用到的Python庫
    • 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’元素就是我們要的數據。

    def fillUnivList(ulist, html):soup = BeautifulSoup(html, "html.parser")for tr in soup.find('tbody').children: # 搜索'tbody'后面的子節點if isinstance(tr, bs4.element.Tag):tds = tr('td')ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])passpasspass

    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方法進行排序

    df_score = df.sort_values('score', ascending=False) # asc False降序,True升序

    這樣我們就得到了排序過的數據。

    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(show_counts, labels=show_area, autopct='%1.1f%%', shadow=False, startangle=150, radius=1.0, labeldistance=1.1) plt.title("全國各地區大學比例", color=colors1) plt.tight_layout() plt.show()

    plt.pie()畫一個餅圖,參數如下

  • x :(每一塊)的比例,如果sum(x) > 1會使用sum(x)歸一化;
  • labels :(每一塊)餅圖外側顯示的說明文字;
  • explode :(每一塊)離開中心距離;
  • startangle :起始繪制角度,默認圖是從x軸正方向逆時針畫起,如設定=90則從y軸正方向畫起;
  • shadow :在餅圖下面畫一個陰影。默認值:False,即不畫陰影;
  • labeldistance :label標記的繪制位置,相對于半徑的比例,默認值為1.1, 如<1則繪制在餅圖內側;
  • autopct :控制餅圖內百分比設置,可以使用format字符串或者format function
    '%1.1f’指小數點前后位數(沒有用空格補齊);
  • pctdistance :類似于labeldistance,指定autopct的位置刻度,默認值為0.6;
  • radius :控制餅圖半徑,默認值為1;
  • counterclock :指定指針方向;布爾值,可選參數,默認為:True,即逆時針。將值改為False即可改為順時針。
  • wedgeprops :字典類型,可選參數,默認值:None。參數字典傳遞給wedge對象用來畫一個餅圖。例如:wedgeprops={‘linewidth’:3}設置wedge線寬為3。
  • textprops :設置標簽(labels)和比例文字的格式;字典類型,可選參數,默認值為:None。傳遞給text對象的字典參數。
  • center :浮點類型的列表,可選參數,默認值:(0,0)。圖標中心位置。
  • frame :布爾類型,可選參數,默認值:False。如果是true,繪制帶有表的軸框架。
  • rotatelabels :布爾類型,可選參數,默認為:False。如果為True,旋轉每個label到指定的角度。
  • 最終我們得到的圖如下

    可以看出北京、江蘇的優秀大學數量較多。

    總結

    以上是生活随笔為你收集整理的使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。