<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 Python 展示全國高校的分布情況

          共 9598字,需瀏覽 20分鐘

           ·

          2022-06-27 19:16

          在公眾號后臺回復:JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊。

          文末獲取本文完整數(shù)據(jù)

          6月是畢業(yè)季,高考生正在準備填志愿。本文用Python展示了全國高校的分布情況,全國的高校哪些地方多,哪些地方少,可以一目了然地看到。

          數(shù)據(jù)獲取

          要展示高校的分布情況,就得先獲取全國高校的位置數(shù)據(jù)。本文的數(shù)據(jù)來源于掌上高考網(wǎng)(https://www.gaokao.cn/school/search)。

          在2022年6月寫本文時,共獲取到了2822所高校的信息。檢查了數(shù)據(jù),除了極個別空值外,整份數(shù)據(jù)是非常完整的,不影響使用。數(shù)據(jù)一共有44個字段,本文只會用幾個字段,可以不做處理,使用時按需獲取即可。

          數(shù)據(jù)獲取方法介紹(基礎(chǔ)爬蟲知識):

          1.注冊登錄掌上高考網(wǎng)。在<查學校>頁面選擇全部學校。

          2.按F12鍵,點擊到 Network > Fetch/XHR,然后點擊幾次<查學校>頁面的<上一頁>、<下一頁>按鈕,在XHR的頁面會顯示訪問的API等信息。

          3.將每次翻頁時的API復制出來進行對比,發(fā)現(xiàn)翻頁時變化的參數(shù)有兩個:page和signsafe,page為當前訪問的頁數(shù),signsafe是一個md5值,沒法反解,但可以把前面幾次的值保存下來,后面隨機變化使用。有了這個信息,不斷改變訪問的頁數(shù)和signsafe值,就可以獲取到所有的學校數(shù)據(jù)。

          Response中的numFound參數(shù)值是學??倲?shù),除以每頁顯示的學校個數(shù)可以得到總頁數(shù),也可以直接點擊頁面的<尾頁>查看總頁數(shù),這樣就確定了訪問的次數(shù)。

          4.因為網(wǎng)站需要登錄才能使用,所以還要獲取訪問時的Headers,如Request Method(此次用POST)、User-Agent等。

          5.有了上面的信息,循環(huán)拼接出所有頁面的url,用requests發(fā)送請求即可獲取到所有高校的數(shù)據(jù),然后用pandas將數(shù)據(jù)寫到excel中。

          溫馨提示:獲取數(shù)據(jù)時需遵守網(wǎng)站的相關(guān)聲明,爬蟲代碼盡量設置一定的時間間隔,不要在訪問高峰期運行爬蟲代碼。

          補充說明:

          人民網(wǎng)最新公布:全國的普通高校數(shù)是2759所,與本文從掌上高考網(wǎng)獲取的2822所相差63所,主要是部分學校的分校統(tǒng)計方式不同造成的差異。本文所展示的是分布情況,這個差異的影響不大。

          經(jīng)緯度獲取

          掌上高考網(wǎng)是為高考填志愿服務的網(wǎng)站,雖然獲取的數(shù)據(jù)有44個字段,但里面并沒有學校的經(jīng)緯度。為了更好地在地圖上展示高校位置, 需要根據(jù)學校的地址獲取對應的經(jīng)緯度。

          本文使用百度地圖開放平臺:

          https://lbsyun.baidu.com/apiconsole/center#/home,可以用百度地圖的開放接口獲取地理位置的經(jīng)緯度。

          使用步驟為:

          1.注冊登錄百度賬號,這個賬號可以是整個百度生態(tài)通用的賬號(如網(wǎng)盤、文庫等的賬號是通用的)。

          2.登錄到百度地圖開放平臺,點擊進入<控制臺>,然后在<應用管理>中點擊<我的應用>,再點擊<創(chuàng)建應用>創(chuàng)建一個應用。應用名稱自定義,其他信息按提示和要求填寫完整,并進行實名認證,成為個人開發(fā)者。

          3.創(chuàng)建應用完成后,會獲得一個應用的<訪問應用(AK)>,用這個AK值可以調(diào)用百度的API,參考代碼如下。

          import requests


          def baidu_api(addr):
              url 
          "http://api.map.baidu.com/geocoding/v3/?"
              params = {
                  "address": addr,
                  "output""json",
                  "ak""復制你創(chuàng)建的應用AK到此"
              }
              req = requests.get(url, params)
              res = req.json()
              if len(res["result"]) > 0:
                  loc 
          = res["result"]["location"]
                  return loc
              else:
                  print("獲取{}經(jīng)緯度失敗".format(addr))
                  return {'lng''''lat'''}

          4.成功調(diào)用百度地圖API后,讀取所有高校的位置,依次調(diào)用上面的函數(shù),獲取所有高校的經(jīng)緯度,重新寫入excel中。

          import pandas as pd
          import numpy as np


          def get_lng_lat():
              df = pd.read_excel('school.xlsx')
              lng_lat = []
              for row_index, row_data in df.iterrows():
                  addr = row_data['address']
                  if addr is np.nan:
                      addr = row_data['city_name'] + row_data['county_name']
                  # print(addr)
                  loc = baidu_api(addr.split(',')[0])
                  lng_lat.append(loc)
              df['經(jīng)緯度'] = lng_lat
              df['經(jīng)度'] = df['經(jīng)緯度'].apply(lambda x: x['lng'])
              df['緯度'] = df['經(jīng)緯度'].apply(lambda x: x['lat'])
              df.to_excel('school_lng_lat.xlsx')

          最終數(shù)據(jù)結(jié)果如下圖:

          個人開發(fā)者使用百度地圖開放平臺時需注意,每天有額度限制,所以調(diào)試代碼時先不要用所有數(shù)據(jù),先用demo跑通,否則得等一天或購買額度。

          高校位置展示

          數(shù)據(jù)準備好了,接下來將他們展示到地圖上。

          本文使用百度開源的數(shù)據(jù)可視化工具Echarts,Echarts為Python語言提供了pyecharts庫,使用很方便。

          安裝命令:

          pip install pyecharts

          1.標注高校的位置

          from pyecharts.charts import Geo
          from pyecharts import options as opts
          from pyecharts.globals import GeoType
          import pandas as pd

          def multi_location_mark():
              """批量標注點"""
              geo = Geo(init_opts=opts.InitOpts(bg_color='black', width='1600px', height='900px'))
              df = pd.read_excel('school_lng_lat.xlsx')
              for row_index, row_data in df.iterrows():
                  geo.add_coordinate(row_data['name'], row_data['經(jīng)度'], row_data['緯度'])
              data_pair = [(name, 2for name in df['name']]
              geo.add_schema(
                  maptype='china', is_roam=True, itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='#408080')
              ).add(
                  '', data_pair=data_pair, type_=GeoType.SCATTER, symbol='pin', symbol_size=16, color='#CC3300'
              ).set_series_opts(
                  label_opts=opts.LabelOpts(is_show=False)
              ).set_global_opts(
                  title_opts=opts.TitleOpts(title='全國高校位置標注圖', pos_left='650', pos_top='20',
                                            title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16))
              ).render('high_school_mark.html')


          從標注結(jié)果來看,高校主要分布沿海、中部和東部,西部尤其是高海拔地區(qū)分布相對較少。

          2.繪制高校分布熱力圖

          from pyecharts.charts import Geo
          from pyecharts import options as opts
          from pyecharts.globals import ChartType
          import pandas as pd

          def draw_location_heatmap():
              """繪制熱力圖"""
              geo = Geo(init_opts=opts.InitOpts(bg_color='black', width='1600px', height='900px'))
              df = pd.read_excel('school_lng_lat.xlsx')
              for row_index, row_data in df.iterrows():
                  geo.add_coordinate(row_data['name'], row_data['經(jīng)度'], row_data['緯度'])
              data_pair = [(name, 2for name in df['name']]
              geo.add_schema(
                  maptype='china', is_roam=True, itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='#408080')
              ).add(
                  '', data_pair=data_pair, type_=ChartType.HEATMAP
              ).set_series_opts(
                  label_opts=opts.LabelOpts(is_show=False)
              ).set_global_opts(
                  title_opts=opts.TitleOpts(title='全國高校分布熱力圖', pos_left='650', pos_top='20',
                                            title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16)),
                  visualmap_opts=opts.VisualMapOpts()
              ).render('high_school_heatmap.html')


          從熱力圖看,高校分布較集中的地方主要是沿海、北上廣、長江黃河流域,西部較多的地方只有川渝。

          3.繪制按省劃分的分布密度圖

          from pyecharts.charts import Map
          from pyecharts import options as opts
          import pandas as pd


          def draw_location_density_map():
              """繪制各省高校分布密度圖"""
              map = Map(init_opts=opts.InitOpts(bg_color='black', width='1200px', height='700px'))
              df = pd.read_excel('school_lng_lat.xlsx')
              s = df['province_name'].value_counts()
              data_pair = [[province, int(s[province])] for province in s.index]
              map.add(
                  '', data_pair=data_pair, maptype="china"
              ).set_global_opts(
                  title_opts=opts.TitleOpts(title='全國高校按省分布密度圖', pos_left='500', pos_top='70',
                                            title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16)),
                  visualmap_opts=opts.VisualMapOpts(max_=200, is_piecewise=True, pos_left='100', pos_bottom='100',                      textstyle_opts=opts.TextStyleOpts(color='white', font_size=16))
              ).render("high_school_density.html")


          從省級分布密度圖可以看出,高校數(shù)量多的省份集中在中部和東部,尤其是北京和上海附近的幾個省。

          4.211和985高校的分布情況

          篩選出211和985的高校數(shù)據(jù),再繪制一次。(代碼不重復粘貼,只需要加一行篩選代碼即可)

          以上就是本文的全部內(nèi)容,對以上內(nèi)容有興趣的話,大家可以多多嘗試,也可以聯(lián)系號主討論。

          參考文檔:

          1.掌上高考網(wǎng):https://www.gaokao.cn/school/search

          2.pyecharts中文文檔:https://pyecharts.org/#/zh-cn/geography_charts

          公眾號后臺回復:「高校數(shù)據(jù)」,即可獲取本文完整數(shù)據(jù)。

          推薦閱讀

          建議收藏!Python 讀取千萬級數(shù)據(jù)自動寫入 MySQL 數(shù)據(jù)庫

          太酷了!手把手教你用 Python 繪制?;鶊D!| 用戶行為路徑分析

          用 Python 批量提取 PDF 的圖片,并存儲到指定文件夾

          用 Python 批量提取 PDF 的表格數(shù)據(jù),保存為 Excel

          太強了!Python 開發(fā)桌面小工具,讓代碼替我們干重復的工作!

          杰哥私人微信,歡迎添加圍觀朋友圈。


          瀏覽 71
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天日狠狠干 | 亚洲高清三级 | 亚欧精品久久 | 国产三级在线观看完整版 | 操B一区|