Python을 사용하여 전국 대학의 분포를 표시합니다.

王林
풀어 주다: 2023-04-11 20:04:25
앞으로
1570명이 탐색했습니다.

Python을 사용하여 전국 대학의 분포를 표시합니다.

데이터 수집

대학의 분포를 보여주기 위해서는 먼저 전국 대학의 위치 데이터를 얻어야 합니다. 이 기사의 데이터는 Palm College 입학 시험 네트워크(https://www.gaokao.cn/school/search)에서 가져온 것입니다.

Python을 사용하여 전국 대학의 분포를 표시합니다.

이 글을 작성하는 시점인 2022년 6월 기준으로 총 2822개의 대학 정보를 획득하였습니다. 데이터를 확인한 후 몇 가지 null 값을 제외하고 전체 데이터는 매우 완전하며 사용에 영향을 미치지 않습니다. 데이터에는 총 44개의 필드가 있습니다. 이 기사에서는 일부 필드만 사용하며 처리할 필요가 없으며 사용 시 필요할 때 얻을 수 있습니다.

Python을 사용하여 전국 대학의 분포를 표시합니다.

데이터 수집 방법 소개(기본 크롤러 지식):

1. Palm College 입학 시험 네트워크에 등록하고 로그인합니다. 페이지에서 모든 학교를 선택하세요.

2. F12 키를 누르고 네트워크 > Fetch/XHR을 클릭한 다음 페이지에서 및 버튼을 여러 번 클릭하면 XHR 페이지에 액세스한 API 및 기타 정보가 표시됩니다.

3. 비교를 위해 페이지를 넘길 때마다 API를 복사해 보면 페이지를 넘길 때 변경되는 두 가지 매개 변수가 있습니다. 페이지는 현재 방문한 페이지 수입니다. signsafe는 md5 값으로, 역으로 풀 수는 없지만 이전 값을 저장했다가 나중에 임의로 사용할 수 있습니다. 이 정보를 통해 방문한 페이지 수와 signsafe 값을 지속적으로 변경하여 모든 학교 데이터를 얻을 수 있습니다.

응답의 numFound 매개변수 값은 총 학교 수입니다. 각 페이지에 표시된 학교 수로 나누어 총 페이지 수를 구할 수도 있습니다. 페이지에서 를 직접 클릭하면 총 학교 수를 볼 수도 있습니다. 페이지에 따라 방문 횟수가 결정됩니다.

4. 웹사이트를 이용하려면 로그인이 필요하기 때문에 접속 시 Request Method(이번에는 POST), User-Agent 등 헤더를 얻어야 합니다.

5 위의 정보를 사용하여 모든 페이지의 URL을 루프아웃하고 요청을 사용하여 모든 대학의 데이터를 가져온 다음 Pandas를 사용하여 Excel에 데이터를 작성합니다.

주의 사항: 데이터를 얻을 때 크롤러 코드에 대한 특정 시간 간격을 설정해야 합니다. 액세스가 가장 많은 기간에는 크롤러 코드를 실행하지 마세요.

추가설명:

최근 인민일보 발표: 전국의 일반대학 수는 2759개로, 본 기사의 이동대학 입시사이트에서 얻은 2822개와 63개 다르다. 이는 주로 일부 학교의 지점별 통계 방법이 다르기 때문입니다. 이 기사에서 보여주는 것은 분포이며, 이 차이는 거의 영향을 미치지 않습니다.

Python을 사용하여 전국 대학의 분포를 표시합니다.


구하는 위도와 경도

Palm 대학 입시 네트워크는 대학 입시를 위한 자원 봉사 서비스를 작성하는 웹사이트입니다. 비록 얻은 데이터가 44개 필드이지만 그렇습니다. 학교의 위도와 경도는 포함되지 않습니다. 지도에 대학의 위치를 ​​더 잘 표시하려면 학교 주소를 기준으로 해당 경도와 위도를 얻어야 합니다.

이 기사는 Baidu 지도 개방형 플랫폼(https://lbsyun.baidu.com/apiconsole/center#/home)을 사용하여 Baidu 지도의 개방형 인터페이스를 사용하여 해당 지역의 경도와 위도를 얻을 수 있습니다. 지리적 위치.

단계는 다음과 같습니다.

1. Baidu 계정에 등록하고 로그인합니다. 이 계정은 전체 Baidu 생태계에 대한 공통 계정이 될 수 있습니다(예: 네트워크 디스크, Wenku 등의 계정이 공통).

2. Baidu Map Open Platform에 로그인하고 를 클릭한 다음 에서 를 클릭하고 를 클릭하여 애플리케이션을 만듭니다. 애플리케이션 이름을 사용자 정의하고 기타 정보를 안내에 따라 입력하고 실명 인증을 거쳐 개인 개발자가 됩니다.

Python을 사용하여 전국 대학의 분포를 표시합니다.


3. 애플리케이션이 생성되면 이 AK 값을 사용하여 Baidu의 API를 호출할 수 있습니다.

import requests


def baidu_api(addr):
url = "http://api.map.baidu.com/geocoding/v3/?"
params = {
"address": addr,
"output": "json",
"ak": "复制你创建的应用AK到此"
}
req = requests.get(url, params)
res = req.json()
if len(res["result"]) > 0:
loc = res["result"]["location"]
return loc
else:
print("获取{}经纬度失败".format(addr))
return {'lng': '', 'lat': ''}
로그인 후 복사

4. Baidu Map API를 성공적으로 호출한 후 모든 대학의 위치를 ​​읽고 위 함수를 순차적으로 호출하여 모든 대학의 경도와 위도를 얻어 엑셀로 다시 작성합니다.

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['经纬度'] = lng_lat
df['经度'] = df['经纬度'].apply(lambda x: x['lng'])
df['纬度'] = df['经纬度'].apply(lambda x: x['lat'])
df.to_excel('school_lng_lat.xlsx')
로그인 후 복사

최종 데이터 결과는 아래와 같습니다.

Python을 사용하여 전국 대학의 분포를 표시합니다.

개인 개발자는 일일 할당량 제한이 있으므로 코드 디버깅 시 주의가 필요합니다. 먼저 모든 데이터를 사용하고 데모를 먼저 실행해 보세요. 그렇지 않으면 하루를 기다리거나 해당 금액만큼 구매해야 합니다.

Python을 사용하여 전국 대학의 분포를 표시합니다.

대학 위치 표시

데이터가 준비되었으니 지도에 표시해 보겠습니다.

이 기사에서는 Baidu의 오픈 소스 데이터 시각화 도구 Echarts를 사용하여 Python 언어용 pyecharts 라이브러리를 제공하므로 사용이 매우 편리합니다.

설치 명령:

pip install pyecharts
로그인 후 복사

1. 대학 위치 표시

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

def multi_location_mark():
"""批量标注点"""
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['经度'], row_data['纬度'])
data_pair = [(name, 2) for 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='全国高校位置标注图', pos_left='650', pos_top='20',
title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16))
).render('high_school_mark.html')
로그인 후 복사

Python을 사용하여 전국 대학의 분포를 표시합니다.

라벨링 결과에 따르면 대학은 주로 해안 지역에 분포합니다. , 중부 및 동부 지역, 특히 서부 지역은 상대적으로 고도가 낮은 지역입니다.

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['经度'], row_data['纬度'])
data_pair = [(name, 2) for 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='全国高校分布热力图', 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')
로그인 후 복사

Python을 사용하여 전국 대학의 분포를 표시합니다.

히트맵에서 대학이 더 밀집된 곳은 주로 해안, 북부, 상하이 지역입니다. , 광저우, 양쯔강과 황하 유역이 서쪽에 더 많은 곳이 있는 유일한 곳입니다.

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='全国高校按省分布密度图', 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")
로그인 후 복사

Python을 사용하여 전국 대학의 분포를 표시합니다.

도별 분포밀도 지도를 보면 대학이 많은 지방이 중앙부와 중앙부에 집중되어 있음을 알 수 있습니다. 동부 지역, 특히 중국 중부와 동부 지역, 베이징과 상하이 근처의 여러 지역.

4. 211개, 985개 대학의 분포

211개, 985개 대학의 데이터를 필터링하여 다시 그려보세요. (코드를 반복적으로 붙여넣을 필요는 없으며 필터링 코드 한 줄만 추가하면 됩니다.)

Python을 사용하여 전국 대학의 분포를 표시합니다.

위 내용은 이 글의 전체 내용입니다.

위 내용은 Python을 사용하여 전국 대학의 분포를 표시합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:51cto.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿