基于高德开放平台的重庆公交数据爬取
1.公交数据爬取
高德开放平台数据获取需要三步骤:1.申请“Web服务API”密匙(key);2.组成请求头URL;3.接受请求返回的数据(JSON)并解析数据
1.1 请求头URL
-
密匙申请
首先需要申请高德开发者账号,再在个人主页的【应用管理】—>【我的应用】页面创建新应用,点击“添加新Key”,输入"gongjiao",服务平台选择“Web服务”,提交完成密匙申请
-
请求头URL组成
<‘https://restapi.amap.com/v3/place/text?key=97ddbeeea64e8ad2c106f5c008a554b7&keywords=长寿102路(古佛–圣天湖)&types=&city=重庆&children=1&offset=20&page=1&extensions=all’>
1.2 数据获取
-
导入库
import requests import json import pandas as pd import time from lxml import etree
-
请求返回数据
r = requests.get(url).text rt = json.loads(r) #将获取的字符串转化为json数据 rt
-
获取目标信息
dt = { } dt['name'] = rt['buslines'][0]['name'] #获取公交线名键值对 dt['polyline'] = rt['buslines'][0]['polyline'] #获取公交线折点坐标键值对 dt['basic_price'] = rt['buslines'][0]['basic_price'] #获取公交线价格键值对 st_name = [] st_coords = [] for i in rt['buslines'][0]['busstops']: #获取公交站点名,站点坐标 st_name.append(i['name']) st_coords.append(i['location']) dt['station_name'] = st_name dt['station_coords'] = st_coords dm = pd.DataFrame([dt]) #将数据转为dataframe格式 dm
图1.2 部分数据
1.3 批量获取重庆公交线路数据
1.3.1 定义公交数据爬取函数–下载线路数据
def get_dt(city,line): #定义公交线路数据抓取函数,参数城市名,公交线路名
url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=97ddbeeea64e8ad2c106f5c008a554b7&output=json&city={}&offset=1&keywords={}&platform=JS'.format(city,line)
r = requests.get(url).text #制定格式化的请求头
rt = json.loads(r) #将获取的字符串转化为json数据
try: #尝试是否进行
if rt['buslines']: #如果有rt中有“buslines”这个键进行
print('data avalible..')
if len(rt['buslines'])== 0: #如果有“buslines”为空进行
print('no data in list...')
else: #不为空进行
dt = {
}
dt['name'] = rt['buslines'][0]['name'] #获取公交线名键值对
dt['polyline'] = rt['buslines'][0]['polyline'] #获取公交线折点坐标键值对
dt['basic_price'] = rt['buslines'][0]['basic_price'] #获取公交线价格键值对
st_name = [] #获取公交站名键值对
st_coords = [] #获取公交站点坐标键值对
for i in rt['buslines'][0]['busstops']:
st_name.append(i['name'])
st_coords.append(i['location'])
dt['station_name'] = st_name
dt['station_coords'] = st_coords
dm = pd.DataFrame([dt])
return(dm)
else:
pass
except:
print('error...try it again...')
time.sleep(2)
get_dt(city,line)
1.3.2 定义下载这个城市所有公交线的列表函数
这里用到公交线路名网址:'http://chongqing.gongjiao.com/lines_6.html’可先查看网页构成、以及查看网页源代码。
def get_lines(cityE,city): #定义城市线路名爬取函数,参数城市名(拼音),城市名(中文)
lst = []
for i in range(1,10):
url = 'http://{}.gongjiao.com/lines_{}.html'.format(cityE,i)
r = requests.get(url)