2020年6月学习内容存档一
一、前言
2019年的时候曾发布过一篇关于通过8684公交信息查询网采集公交数据的方法:
文上上:Python案例 公交数据的采集与MongoDB储存zhuanlan.zhihu.com最近在进行相关研究中发现该方法随着8684网站更新的原因,一些参数出现了无法使用的现象。其中最核心的问题就是下面这一部分的数据8684已经进行了删除:
在新的网站中,网址向百度地图API的请求获得经纬度来获取地图显示的内容已经被删除,所以如果需要获取站点经纬度的话就只能通过请求高德/百度地图API来获取。但该方法也存在诸多不足:
- 名称的重复性可能会导致站点位置请求失败。
- 公交线路由站点连接组成,很难与实际路网数据重合,对于分析来说具有极大的不可靠性。
二、思路
于是,这种方法在我最近的研究中就被弃用了。我转向了目前的地图开发商公开的一些公交数据,看是否有获取的可能。具体的原理及我们向各类地图输入公交线路的关键词,来获取一条线路的基本信息,通过请求全市所有的线路来获取完整的公交数据。
https://wap.amap.com/?type=pcm&from=banner&src=pc (二维码自动识别)
如图,通过请求,高德API提供了线路的基本信息已经运行路线来帮助我们进行公交信息的查询。与Web服务API请求不同的是,公交数据采取的是高德地图 JS API 获取,这里需要数据获取者具有一定的JS、HTML基础。
高德地图 JS API 是一套 JavaScript 语言开发的的地图应用编程接口,移动端、PC端一体化设计,一套 API 兼容众多系统平台。目前 JS API 免费开放使用。 JS API 提供了2D、3D地图模式,满足绝大多数开发者对地图展示、地图自定义、图层加载、点标记添加、矢量图形绘制的需求,同时也提供了 POI 搜索、路线规划、地理编码、行政区查询、定位等众多开放服务接口。
举例:根据『公交路线』,获得公交线路起终点、途经点、首末班车时间等详细信息。以查询『536』公交路线为例,一次完整的公交路线查询如下:
AMap
三、数据获取
仔细查询高德的开发文档发现,其实JS请求本质上也是会返回一个JSON文件,所以我们只需要找到本地向服务器请求的请求头以及返回的方式就可以回到Web服务请求的轮子进行数据获取。具体的数据解析方法这里不进行说明,最后发现的请求参数主要包括以下几个字段:(图一为官方字段,后面文字为本人解析字段)
offset:和extensions类似,输入0返回全部,输入1返回单线(同一个公交线路一般包括数据相反的两条,这个参数就是做这个区分)
output:输出形式,包含json和xml两种格式。
platform:解析方法,默认JS
请求链接:
https:// restapi.amap.com/v3/bus /linename?parameters
数据解析后,返回的文件结果如下:
[{
整的来说,信息量非常丰富,尤其是polyline字段详细的描绘了这条公交线路的运行路程,这样就解决了和路网数据不匹配的问题。代码上也非常简单,只需要三个部分组成即可。
3.1 数据请求部分
数据请求部分用简单的Web服务请求方式即可,代码如下:
def
3.2 数据解析部分
这一部分主要涉及对JSON数据文件的解析,思路上主要是把数据分成了三个部分,三个文件来处理:
- 首先是每一条线路的基本信息,包括票价、时间、类型等属性,目的是在线路空间可视化后能对其进行属性补充。
- 其次是每条线路的站点信息。
- 最后是线路的运行信息。
在方法上基本一致,这里放上站点信息采集部分的代码仅供参考:
def
3.3 数据转换部分
由于本文使用的高德地图火星坐标系,所以这里需要对坐标处理成地球坐标系来方便在GIS中空间可视化,特设计了该部分,由于内容敏感,具体代码大家可自行搜索 ,这里不进行说明。
四、可视化
由于是JS的采集方式,所以采集数据非常快,基本上一个城市的数据仅需要半小时左右即可全部采集完。但这里建议大家设置一个随机休息参数来防止触发网站的反爬机制,代码如下:
import
最后会生成3个文件:
01:线路信息数据:
02:站点信息数据:
03:线路数据:
之后,只需要导入GIS,通过显示XY数据、点集装线等工具即可把数据可视化,这里都是简单操作,不进行说明。
以深圳为例,最后结果如图。
- 黄色线路均为采集的数据,一共81w点,点集转线后变成1600条折线。
- 黑色点为站点数据,一共6k点。
个人原因,完整代码文章不能奉上,但依据文章思路,基本能写出。
以上,希望有所帮助!