1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        用 Python 展示全國(guó)高校的分布情況

        共 9598字,需瀏覽 20分鐘

         ·

        2022-06-27 19:16

        在公眾號(hào)后臺(tái)回復(fù):JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊(cè)。

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

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

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

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

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

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

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

        2.按F12鍵,點(diǎn)擊到 Network > Fetch/XHR,然后點(diǎn)擊幾次<查學(xué)校>頁(yè)面的<上一頁(yè)>、<下一頁(yè)>按鈕,在XHR的頁(yè)面會(huì)顯示訪(fǎng)問(wèn)的API等信息。

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

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

        4.因?yàn)榫W(wǎng)站需要登錄才能使用,所以還要獲取訪(fǎng)問(wèn)時(shí)的Headers,如Request Method(此次用POST)、User-Agent等。

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

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

        補(bǔ)充說(shuō)明:

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

        經(jīng)緯度獲取

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

        本文使用百度地圖開(kāi)放平臺(tái):

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

        使用步驟為:

        1.注冊(cè)登錄百度賬號(hào),這個(gè)賬號(hào)可以是整個(gè)百度生態(tài)通用的賬號(hào)(如網(wǎng)盤(pán)、文庫(kù)等的賬號(hào)是通用的)。

        2.登錄到百度地圖開(kāi)放平臺(tái),點(diǎn)擊進(jìn)入<控制臺(tái)>,然后在<應(yīng)用管理>中點(diǎn)擊<我的應(yīng)用>,再點(diǎn)擊<創(chuàng)建應(yīng)用>創(chuàng)建一個(gè)應(yīng)用。應(yīng)用名稱(chēng)自定義,其他信息按提示和要求填寫(xiě)完整,并進(jìn)行實(shí)名認(rèn)證,成為個(gè)人開(kāi)發(fā)者。

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

        import requests


        def baidu_api(addr):
            url 
        "http://api.map.baidu.com/geocoding/v3/?"
            params = {
                "address": addr,
                "output""json",
                "ak""復(fù)制你創(chuàng)建的應(yī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)緯度,重新寫(xiě)入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é)果如下圖:

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

        高校位置展示

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

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

        安裝命令:

        pip install pyecharts

        1.標(biāo)注高校的位置

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

        def multi_location_mark():
            """批量標(biāo)注點(diǎn)"""
            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='全國(guó)高校位置標(biāo)注圖', pos_left='650', pos_top='20',
                                          title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16))
            ).render('high_school_mark.html')


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

        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='全國(guó)高校分布熱力圖', 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')


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

        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='全國(guó)高校按省分布密度圖', 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")


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

        4.211和985高校的分布情況

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

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

        參考文檔:

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

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

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

        推薦閱讀

        建議收藏!Python 讀取千萬(wàn)級(jí)數(shù)據(jù)自動(dòng)寫(xiě)入 MySQL 數(shù)據(jù)庫(kù)

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

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

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

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

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


        瀏覽 71
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            A级片久久 | 国产插B| 欧美日韩在线播放视频 | 成人A片在线 | 国产资源网| 福利一区二区三区综合在线视频 | 奇米影视一区二区 | 国产裸身美女网站 | 美女被怪物强行侵犯3d | 电子书乱伦视频 |