<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>

          1分鐘爬取全國高校信息,制成大屏可視化!

          共 9081字,需瀏覽 19分鐘

           ·

          2022-07-22 16:27

          點擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書

          卻嫌脂粉污顏色,淡掃蛾眉朝至尊。
          大家好,我是丁小杰。

          記得當(dāng)初高考完,我選學(xué)校的時候是在書店買的高校信息排名的書,然而書中的信息都是很久之前的,并沒有什么太大幫助。今天就來帶大家爬點真正有用的東西,全國高校信息,涵蓋絕大多數(shù)高校,并制作可視化看板。話不多說,進(jìn)入正題!

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

          地址:https://www.gaokao.cn/school/140F12 打開開發(fā)者工具,通過抓包工具很輕松就獲取到了 json 文件。我們直接對該鏈接發(fā)起請求,就可以獲取對應(yīng)大學(xué)的信息。

          另外對比發(fā)現(xiàn) https://static-data.eol.cn/www/2.0/school/140/info.json,關(guān)鍵參數(shù) 140 為學(xué)校ID,但I(xiàn)D不是連續(xù)的,所以,我們爬取時只能根據(jù)大致的學(xué)校數(shù)量進(jìn)行爬取。

          爬取代碼

          導(dǎo)入模塊

          import aiohttp
          import asyncio
          import pandas as pd
          from pathlib import Path
          from tqdm import tqdm
          import time

          簡單說明一下主要模塊的用途:

          • aiohttp:可以實現(xiàn)單線程并發(fā) IO 操作。如果僅用在客戶端,發(fā)揮的威力不大,只是為了搭配 asyncio 來使用,因為 requests 不支持異步。如果把 asyncio 用在服務(wù)器端,例如  Web 服務(wù)器,由于 HTTP 連接就是 IO 操作,因此可以用 單線程 + coroutine 實現(xiàn)多用戶的高并發(fā)支持。
          • asyncio:提供了完善的異步IO支持,可以將多個協(xié)程(coroutine)封裝成一組 Task 然后并發(fā)執(zhí)行。
          • pandas:將爬取的數(shù)據(jù)轉(zhuǎn)為 DataFrame 類型,并生成 csv 文件。
          • pathlib:面向?qū)ο蟮木幊谭绞絹肀硎疚募到y(tǒng)路徑。
          • tqdm:只需使用 tqdm(iterable) 包裝任何可迭代對象,就能讓你的循環(huán)生成一個智能進(jìn)度條。

          對于 pathlib 與 tqdm 的使用建議參考以下文章:
          pathlib一個優(yōu)雅的路徑操作模塊,碾壓os!
          用Pyhton給代碼安個進(jìn)度條,太香了吧!

          生成URL序列

          通過指定的 URL 模板與 max_id 生成 URL 序列,這里添加了一個去重操作,如果之前已采集過高校信息,它會根據(jù)同目錄下的文件,剔除已采集的高校ID,僅采集未獲取過的高校信息。

          def get_url_list(max_id):
              url = 'https://static-data.eol.cn/www/2.0/school/%d/info.json'
              not_crawled = set(range(max_id))
              if Path.exists(Path(current_path, 'college_info.csv')):
                  df = pd.read_csv(Path(current_path, 'college_info.csv'))
                  not_crawled -= set(df['學(xué)校id'].unique())
              return [url%id for id in not_crawled]

          采集JSON數(shù)據(jù)

          通過協(xié)程對URL序列發(fā)出請求,注意要限制并發(fā)量,Window:500,Linux:1024。

          async def get_json_data(url, semaphore):
              async with semaphore:
                  headers = {
                      'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
                  }
                  async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False), trust_env=Trueas session:
                      try:
                          async with session.get(url=url, headers=headers, timeout=6as response:
                              # 更改相應(yīng)數(shù)據(jù)的編碼格式
                              response.encoding = 'utf-8'
                              # 遇到IO請求掛起當(dāng)前任務(wù),等IO操作完成執(zhí)行之后的代碼,當(dāng)協(xié)程掛起時,事件循環(huán)可以去執(zhí)行其他任務(wù)。
                              json_data = await response.json()
                              if json_data != '':
                                  return save_to_csv(json_data['data'])
                      except:
                          return None

          數(shù)據(jù)解析保存

          JSON數(shù)據(jù)中的字段有很多,大家可以根據(jù)自己的情況解析保存自己需要的字段。

          def save_to_csv(json_info):
              save_info = {}
              save_info['學(xué)校id'] = json_info['school_id']              # 學(xué)校id
              save_info['學(xué)校名稱'] = json_info['name']                  # 學(xué)校名字
              level = ""
              if json_info['f985'] == '1' and json_info['f211'] == '1':
                  level += "985 211"
              elif json_info['f211'] == '1':
                  level += "211"
              else:
                  level += json_info['level_name']
              save_info['學(xué)校層次'] = level                               # 學(xué)校層次
              save_info['軟科排名'] = json_info['rank']['ruanke_rank']    # 軟科排名
              save_info['校友會排名'] = json_info['rank']['xyh_rank']     # 校友會排名
              save_info['武書連排名'] = json_info['rank']['wsl_rank']     # 武書連排名
              save_info['QS世界排名'] = json_info['rank']['qs_world']     # QS世界排名
              save_info['US世界排名'] = json_info['rank']['us_rank']      # US世界排名
              save_info['學(xué)校類型'] = json_info['type_name']              # 學(xué)校類型
              save_info['省份'] = json_info['province_name']              # 省份
              save_info['城市'] = json_info['city_name']                  # 城市名稱
              save_info['所處地區(qū)'] = json_info['town_name']              # 所處地區(qū)
              save_info['招生辦電話'] = json_info['phone']                # 招生辦電話
              save_info['招生辦官網(wǎng)'] = json_info['site']                 # 招生辦官網(wǎng)


              df = pd.DataFrame(save_info, index=[0])

              header = False if Path.exists(Path(current_path, 'college_info.csv')) else True
              df.to_csv(Path(current_path, 'college_info.csv'), index=False, mode='a', header=header)

          調(diào)度程序

          調(diào)度整個采集程序。獲取URL>>限制并發(fā)量>>創(chuàng)建任務(wù)對象>>掛起任務(wù)

          async def main(loop):
              # 獲取url列表
              url_list =  get_url_list(5000)
              # 限制并發(fā)量
              semaphore = asyncio.Semaphore(500)
              # 創(chuàng)建任務(wù)對象并添加到任務(wù)列表中
              tasks = [loop.create_task(get_json_data(url, semaphore)) for url in url_list]
              # 掛起任務(wù)列表
              for t in tqdm(asyncio.as_completed(tasks), total=len(tasks)):
                  await t

          以上就是程序運行的主要代碼。

          運行效果

          這里采集ID在5000以內(nèi)的高校信息,如果要盡可能多的采集高校信息的話,建議多次運行,直至無新增數(shù)據(jù)。

          第一次運行(采集到2140行)第二次運行(采集到680行)通過兩次運行共采集到2820行數(shù)據(jù)。下面我們開始可視化部分。

          Tableau可視化

          相比于其他的可視化工具或者第三方繪圖庫,我更傾向于 Tableau,上手十分簡單,想要了解的可以看一下 Tableau Public,這里發(fā)布了很多大牛的作品。

          https://public.tableau.com/app/discover

          它唯一的缺點就是收費,如果是學(xué)生的話,可以免費使用,否則,建議先用免費版的 Tableau Public,等到充分了解后再考慮付費。

          對于本次的可視化,總共繪制有四個圖表。

          高校數(shù)量分布地圖

          高校數(shù)量排名前三的分別是江蘇、廣東、河南(僅供參考)

          軟科高校排名TOP10

          根據(jù)軟科排名來看,全國TOP10的高校絕大多數(shù)都是綜合類,理工類的只有第七名的中國科學(xué)技術(shù)大學(xué)。

          高校層次分布

          從采集的數(shù)據(jù)中來看, 211 的高校占比本科院校約 9.5% ,985 的高校占比本科院校約 3.5%,果然是鳳毛麟角。

          高校類型分布

          學(xué)校類型主要還是理工類和綜合類,二者數(shù)量基本持平,都遙遙領(lǐng)先于其他的類型。數(shù)量第二層級為財經(jīng)類,師范類,醫(yī)藥類。

          合成看板

          將上述的工作表合并成一個看板,過程十分簡單,只需要將圖標(biāo)拖拽到指定位置即可。再添加一個篩選操作,點擊地圖中的某個省份聯(lián)動其他工作表。

          看板已發(fā)布到 Tableau Public??梢栽诰€編輯,或下載整個可視化工作包,鏈接如下:
          https://public.tableau.com/shared/ZCXWTK6SP?:display_count=n&:origin=viz_share_link


          這就是今天要和大家分享的內(nèi)容,包含數(shù)據(jù)采集->數(shù)據(jù)處理->可視化。

          我是Python進(jìn)階者,大家在學(xué)習(xí)過程中如果有遇到問題,歡迎隨時聯(lián)系我解決(我的微信:pdcfighting),應(yīng)粉絲要求,我創(chuàng)建了一些高質(zhì)量的Python付費學(xué)習(xí)交流群,歡迎大家加入我的Python學(xué)習(xí)交流群!

          下面是我的微信

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群

          萬水千山總是情,點個【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  www.久久久 | 天堂国产一区二区三区 | 开操网| 欧美特级黄片 | 亚洲欧美动漫 |