其实特简单,1分钟爬取全国高校信息并制成大屏可视化
大家好,記得當初高考完,我選學校的時候是在書店買的高校信息排名的書,然而書中的信息都是很久之前的,并沒有什么太大幫助。
【注】文末提供技術交流群
干貨推薦
- 深度盤點:這20套可視化炫酷大屏真香啊(附源碼)
- 值得收藏,這6種制作競賽動圖的方法妙不可言
- 絕了,這6個精挑細選的機器學習資料簡直太香了
- Python數據分析三劍客真香啊,還有高清思維導圖
- Python編程從入門到實戰,看這一篇足夠了
今天就來帶大家爬點真正有用的東西,全國高校信息,涵蓋絕大多數高校,并制作可視化看板。話不多說,進入正題!
數據爬取
地址:https://www.gaokao.cn/school/140F12 打開開發者工具,通過抓包工具很輕松就獲取到了 json 文件。我們直接對該鏈接發起請求,就可以獲取對應大學的信息。
另外對比發現 https://static-data.eol.cn/www/2.0/school/140/info.json,關鍵參數 140 為學校ID,但ID不是連續的,所以,我們爬取時只能根據大致的學校數量進行爬取。
爬取代碼
導入模塊
import aiohttp import asyncio import pandas as pd from pathlib import Path from tqdm import tqdm import time簡單說明一下主要模塊的用途:
-
aiohttp:可以實現單線程并發 IO 操作。如果僅用在客戶端,發揮的威力不大,只是為了搭配 asyncio 來使用,因為 requests 不支持異步。如果把 asyncio 用在服務器端,例如 Web 服務器,由于 HTTP 連接就是 IO 操作,因此可以用 單線程 + coroutine 實現多用戶的高并發支持。
-
asyncio:提供了完善的異步IO支持,可以將多個協程(coroutine)封裝成一組 Task 然后并發執行。
-
pandas:將爬取的數據轉為 DataFrame 類型,并生成 csv 文件。
-
pathlib:面向對象的編程方式來表示文件系統路徑。
-
tqdm:只需使用 tqdm(iterable) 包裝任何可迭代對象,就能讓你的循環生成一個智能進度條。
生成URL序列
通過指定的 URL 模板與 max_id 生成 URL 序列,這里添加了一個去重操作,如果之前已采集過高校信息,它會根據同目錄下的文件,剔除已采集的高校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['學校id'].unique())return [url%id for id in not_crawled]采集JSON數據
通過協程對URL序列發出請求,注意要限制并發量,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=True) as session:try:async with session.get(url=url, headers=headers, timeout=6) as response:# 更改相應數據的編碼格式response.encoding = 'utf-8'# 遇到IO請求掛起當前任務,等IO操作完成執行之后的代碼,當協程掛起時,事件循環可以去執行其他任務。json_data = await response.json()if json_data != '':return save_to_csv(json_data['data'])except:return None數據解析保存
JSON數據中的字段有很多,大家可以根據自己的情況解析保存自己需要的字段。
def save_to_csv(json_info):save_info = {}save_info['學校id'] = json_info['school_id'] # 學校idsave_info['學校名稱'] = json_info['name'] # 學校名字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['學校層次'] = level # 學校層次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['學校類型'] = json_info['type_name'] # 學校類型save_info['省份'] = json_info['province_name'] # 省份save_info['城市'] = json_info['city_name'] # 城市名稱save_info['所處地區'] = json_info['town_name'] # 所處地區save_info['招生辦電話'] = json_info['phone'] # 招生辦電話save_info['招生辦官網'] = json_info['site'] # 招生辦官網df = pd.DataFrame(save_info, index=[0])header = False if Path.exists(Path(current_path, 'college_info.csv')) else Truedf.to_csv(Path(current_path, 'college_info.csv'), index=False, mode='a', header=header)調度程序
調度整個采集程序。獲取URL>>限制并發量>>創建任務對象>>掛起任務
async def main(loop):# 獲取url列表url_list = get_url_list(5000)# 限制并發量semaphore = asyncio.Semaphore(500)# 創建任務對象并添加到任務列表中tasks = [loop.create_task(get_json_data(url, semaphore)) for url in url_list]# 掛起任務列表for t in tqdm(asyncio.as_completed(tasks), total=len(tasks)):await t以上就是程序運行的主要代碼。
運行效果
這里采集ID在5000以內的高校信息,如果要盡可能多的采集高校信息的話,建議多次運行,直至無新增數據。
第一次運行(采集到2140行)第二次運行(采集到680行)通過兩次運行共采集到2820行數據。下面我們開始可視化部分。
Tableau可視化
相比于其他的可視化工具或者第三方繪圖庫,我更傾向于 Tableau,上手十分簡單,想要了解的可以看一下 Tableau Public,這里發布了很多大牛的作品。
https://public.tableau.com/app/discover
它唯一的缺點就是收費,如果是學生的話,可以免費使用,否則,建議先用免費版的 Tableau Public,等到充分了解后再考慮付費。
對于本次的可視化,總共繪制有四個圖表。
高校數量分布地圖
高校數量排名前三的分別是江蘇、廣東、河南(僅供參考)
軟科高校排名TOP10
根據軟科排名來看,全國TOP10的高校絕大多數都是綜合類,理工類的只有第七名的中國科學技術大學。
高校層次分布
從采集的數據中來看, 211 的高校占比本科院校約 9.5% ,985 的高校占比本科院校約 3.5%,果然是鳳毛麟角。
高校類型分布
學校類型主要還是理工類和綜合類,二者數量基本持平,都遙遙領先于其他的類型。數量第二層級為財經類,師范類,醫藥類。
合成看板
將上述的工作表合并成一個看板,過程十分簡單,只需要將圖標拖拽到指定位置即可。再添加一個篩選操作,點擊地圖中的某個省份聯動其他工作表。
看板已發布到 Tableau Public。可以在線編輯,或下載整個可視化工作包,鏈接如下:
https://public.tableau.com/shared/ZCXWTK6SP?:display_count=n&:origin=viz_share_link
這就是今天要和大家分享的內容,包含數據采集->數據處理->可視化。
小伙伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加入Python學習交流群共同探討學習。
技術交流
歡迎轉載、收藏、有所收獲點贊支持一下!
目前開通了技術交流群,群友已超過2000人,添加時最好的備注方式為:來源+興趣方向,方便找到志同道合的朋友
- 方式①、發送如下圖片至微信,長按識別,后臺回復:加群;
- 方式②、添加微信號:dkl88191,備注:來自CSDN
- 方式③、微信搜索公眾號:Python學習與數據挖掘,后臺回復:加群
總結
以上是生活随笔為你收集整理的其实特简单,1分钟爬取全国高校信息并制成大屏可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html 立体相册
- 下一篇: Dot1Q tunnel(Q in Q)