当前位置: 首页 > 科技观察

使用Python展示全国高校分布

时间:2023-03-17 15:17:49 科技观察

数据获取要展示高校分布,首先要获取全国高校的位置数据。本文数据来自掌上高考网(https://www.gaokao.cn/school/search)。到2022年6月写这篇文章时,一共获得了2822所高校。查了资料,除了少数null值,整个数据都很完整,不影响使用。数据中共有44个字段。本文只会用到几个字段,可以不用管,用的时候按需获取。数据获取方式介绍(爬虫基础知识):1、注册登录掌上高考网。在页面选择所有学校。2.按F12键,点击Network>Fetch/XHR,然后在页面多次点击按钮,XHR上会显示访问的API等信息页。3.复制每次翻页的API对比一下,发现有两个参数在翻页的时候变化:page和signsafe,page是当前访问的页数,signsafe是一个md5值,不能取反,但是你可以保存以前的值,并在以后的随机变化中使用它们。有了这些信息,通过不断改变访问的页面数和signsafe值,就可以得到所有学校的数据。Response中numFound参数的值为学校总数。将它除以每页显示的学校数量,得到总页数。也可以直接点击页面的<最后一页>查看总页数,从而确定访问次数。4、因为网站需要登录才能使用,所以访问时需要获取headers,比如RequestMethod(这次用的是POST)、User-Agent等5、有了以上信息,循环出所有页面的url,使用requests发送请求获取所有大学的数据,然后使用pandas将数据写入excel。温馨提示:您在获取数据时,必须遵守本网站的相关声明。爬虫代码尽量设置一定的时间间隔,不要在访问高峰期运行爬虫代码。补充说明:人民网最新公告:全国普通高校数量为2759所,与本文掌上高考网站获取的2822所相差63所。差异主要是部分学校统计方法不同造成的。本文展示了分布,这种差异无关紧要。经纬度获取掌上高考是一个高考志愿网站。得到的数据虽然有44个字段,但是没有学校的经纬度。为了更好的在地图上显示大学的位置,需要根据学校的地址获取对应的经纬度。本文使用百度地图开放平台:https://lbsyun.baidu.com/apiconsole/center#/home,可以使用百度地图开放接口获取地理位置的经纬度。使用步骤为:1、注册并登录一个百??度账号,可以是整个百度生态的通用账号(比如网盘、图书馆等的账号是通用的)。2、登录百度地图开放平台,点击进入<控制面板>,然后点击<应用管理>中的<我的应用>,再点击<创建应用>创建应用。自定义应用名称,根据提示和要求填写其他信息,实名认证成为个人开发者。3、创建应用后,会得到一个应用,使用这个AK值调用百度的API。参考代码如下。importrequestsdefbaidu_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()iflen(res["result"])>0:loc=res["result"]["location"]returnlocelse:print("获取{}经纬度失败".format(addr))return{'lng':'','lat':''}4.成功调用百度地图API后,读取所有高校所在位置,依次调用以上函数,获取所有高校的经纬度,改写成excel。importpandasaspdimportnumpyasnpdefget_lng_lat():df=pd.read_excel('school.xlsx')lng_lat=[]forrow_index,row_dataindf.iterrows():addr=row_data['address']ifaddrisnp.nan:addr=row_data['city_name']+row_data['county_name']#print(addr)loc=baidu_api(addr.split(',')[0])lng_lat.append(loc)df['latitudeand经度']=lng_latdf['经度']=df['纬度和经度'].apply(lambdax:x['lng'])df['纬度']=df['经度和纬度'].apply(lambdax:x['lat'])df.to_excel('school_lng_lat.xlsx')最终数据结果如下图:个人开发者在使用百度地图开放平台时要注意,每天都有quota限制,所以调试代码的时候不要用到所有数据,先用demoworks,不然要等一天或者买quota。大学位置显示数据已经准备好,然后将它们显示在地图上。本文使用百度开源数据可视化工具Echarts。Echarts为Python语言提供了pyecharts库,使用起来非常方便。安装说明:pipinstallpyecharts1.Markedhighschoollocationfrompyecharts.chartsimportGeofrompyechartsimportoptionsasoptsfrompyecharts.globalsimportGeoTypeimportpandasaspddefmulti_location_mark():"""markedpoint"""geo=Geo(init_opts=opts.InitOpts(bg_color='black',width='1600px',height='900px'))df=pd.read_excel('school_lng_lat.xlsx')forrow_index,row_dataindf.iterrows():geo.add_coordinate(row_data['name'],row_data['degree'],row_data['degree'])data_pair=[(name,2)fornameindf['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,颜色='#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',标题e_textstyle_opts=opts.TextStyleOpts(color='white',font_size=16))).render('high_school_mark.html')从标注结果来看,高校主要分布在沿海、中东部地区,而西部地区,尤其是高海拔地区相对较少2.绘制高中分布热力图frompyecharts.chartsimportGeofrompyechartsimportoptionsasoptsfrompyecharts.globalsimportChartTypeimportpandasaspddefdraw_location_heatmap():"""绘制热力图"""geo=Geo(init_opts=opts.InitOpts(bg_color='black',width='1600px',height='900px'))df=pd.read_excel('school_lng_lat.xlsx')forrow_index,row_dataindf.iterrows():geo.add_coordinate(row_data['name'],row_data['经度'],row_data['纬度'])data_pair=[(name,2)fornameindf['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')从热图来看,高校集中的地方主要是沿海地区,北部,上海,广州,黄河流域长江之滨,西部只有四川和重庆3.按省绘制分布密度图frompyecharts.chartsimportMapfrompyechartsimportoptionsasoptsimportpandasaspddefdraw_location_density_map():"""绘制各省高校分布密度图"""map=Map(init_opts=opts.InitOpts(bg_c??olor='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])]forprovinceins.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")从省份分布可以看出高等院校数量多的省份密度图集中在中东部地区,尤其是靠近北京和上海的几个省份。4、211和985高校分布筛选出211和985高校的数据,重新绘制。(代码不再重复粘贴,只加一行筛选代码)以上就是本文的全部内容。