轻松实现全国高校地理位置数据爬取
一個城市的歷史底蘊,不光可以從經濟、文化和人文景點,還可以從高校的數量可以看出來。所以,今天就來試試如何爬取全國高校的分布數據。
天要爬取的網站是:中國教育在線,對應的網址是:https://gkcx.eol.cn/school/search
因為對應的是位置點,所以最主要的應該是經緯度點坐標數據。
但是在該網站中無法獲取到高校的經緯度數據,所以在文末會教你利用地址解析的方式獲取到經緯度坐標。
以下是正文:
爬蟲流程
打開對應網址后,F12 打開開發者工具,切換到 Network 選項卡下的 XHR
通過在網頁中點擊 上一頁、下一頁 按鈕可以發現有如下的請求:
多次點擊后可以發現對應的只是請求參數 page 在發生變化
對應每一頁的請求參數 page 對應的該頁在整個數據集中所處的位置
而總的數據集個數在每個請求的 response 中可以獲取到
從而通過 總個數/每頁個數=頁面數 確定總的請求次數
在每次請求的響應中可以看到返回的數據有很多,包括:高校地址、所在城市、地區、直屬機構、類別、是否雙一流 以及對應的瀏覽次數等數據
綜上,前期的數據爬取中,總體流程如下:
獲取總記錄數,計算請求次數
遍歷請求次數,構造每一次請求的 url
解析并獲取數據
最后,通過百度地圖反向解析高校的經緯度數據,這個在文末會介紹到
爬蟲實現
基于上面的爬蟲流程,依次進行爬蟲的代碼實現
首先是獲取到總記錄數,
url?=?'url' res?=?requests.post(url,?headers={'User-Agent':?get_ua()}) data?=?json.loads(res.text)#?解析數據 if?data["message"]?==?'成功':size?=?data["data"]["numFound"]由于每次請求返回的數據是 JSON 格式,通過上述方式可以直接獲取到總記錄數
從而可以很方便的計算出總請求次數:
#?計算請求次數 page_cnt?=?int(size/page_size)?if?size%page_size==0?else?int(size/page_size)+1 print('一共{0}頁數據'.format(page_cnt))其次, 遍歷請求次數,構造每一次的請求 url
其實主要是更新下標 index
for?index?in?range(1,?page_cnt+1):print('正在爬取第?{0}/{1}?頁數據'.format(index,?page_cnt))url?=?'https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page={0}&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&top_school_id=[2941]&type=&uri=apidata/api/gk/school/lists'?\.format(index)res?=?requests.post(url,?headers={'User-Agent':?get_ua()})data?=?json.loads(res.text)最后是解析每一頁的數據
由于數據是 JSON 格式,可以很方便的通過 DataFrame 進行轉換
#?解析數據 if?data["message"]?==?'成功':df_data?=?pd.DataFrame(data["data"]["item"])df_result?=?df_result.append(df_data)最后對整體數據進行保存即可。
地址解析,匹配經緯度
地址解析主要是通過百度開發者平臺,對高校的地址進行解析
平臺提供的接口是這樣的:
對應的,我們將每個 高校的地址 作為 query 參數,將 省份+城市 作為 region 參數,設置 tag 為 高等院校,構造訪問 url
相應的代碼如下:
df_data?=?pd.read_csv(filepath,?encoding='gbk') for?row_index,?data_row?in?df_data.iterrows():region?=?data_row['province_name']+data_row['city_name']query?=?data_row['name']url?=?'http://api.map.baidu.com/place/v2/search?query={0}&tag={1}®ion={2}&output=json&ak={3}'.format(query,?"高等院校",?region,??'你的key')最后是對每次的請求進行解析,獲取到百度地圖返回的經緯度數據
思路比較簡單,相應代碼如下:
res?=?requests.get(url,?headers={'User-Agent':?get_ua()}) data?=?json.loads(res.text) if?len(data["results"])?>?0:df_data?=?pd.DataFrame(data["results"])df_data['lat']?=?df_data['location'].apply(lambda?x:?x['lat'])df_data['lng']?=?df_data['location'].apply(lambda?x:?x['lng'])#?返回數據bd_lng?=?df_data.loc[0,?"lng"]bd_lat?=?df_data.loc[0,?"lat"]個人開發者在百度開放平臺每天有 3w 次地點檢索的免費配額,在使用的時候可以注意下
本次的高校數據集大概不到 3000 條,建議在運行之前可以先寫好測試 demo
最終數據及效果
爬取到的高校數據共 2827 條,每個數據 46 個字段
部分數據截圖如下:
將高校經緯度打在地圖上,分布是這樣的:
這份數據和目前教育部公布的數據還是有一些小小的出入,但是在可容忍范圍之內,所以誤差可以暫時忽略。
-?END -
本文為轉賬分享&推薦閱讀,若侵權請聯系后臺刪除 ------------------------------------- 長按識別下方二維碼,并關注公眾號1.回復“PY”領取1GB?Python數據分析資料2.回復“BG”領取3GB 名企數據分析報告總結
以上是生活随笔為你收集整理的轻松实现全国高校地理位置数据爬取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 平台 apk提取神器
- 下一篇: 获取Google Play Store中