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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1分钟爬取全国高校信息,制成大屏可视化!

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1分钟爬取全国高校信息,制成大屏可视化! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

數據爬取

地址: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

完整代碼見附件:

全國高校信息采集源碼。 鏈接:https://pan.baidu.com/s/1FCXwAyeeqkoH6M_ITWWAcw 提取碼:6cbf

-?END -

對比Excel系列圖書累積銷量達15w冊,讓你輕松掌握數據分析技能,可以在全網搜索書名進行了解:

總結

以上是生活随笔為你收集整理的1分钟爬取全国高校信息,制成大屏可视化!的全部內容,希望文章能夠幫你解決所遇到的問題。

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