-
前言:本文写作的初衷是笔者参与了一个道路实况图的制作项目中,本人负责路况数据的抓取,本来是想要用高德地图的api来进行数据的抓取,但是很不巧的是
…
高德地图的路况查询api服务已经不能用了,于是我只好去找百度地图的api,而csdn上没有一个关于百度地图路况api的详细介绍的,特别是像制作路况图这样的要抓取大量数据的,所以我就只好自己写一篇。前期准备 首先要找到百度地图api的服务文档,先去百度地图api的官网
因为要抓取大量数据,所以我这边选用的是矩形道路查询的借口
这里是返回示例,也是我认为在写抓取代码中最值得研究的部分
除了这两部分,还有一些要注意的点,首先,每个要使用api的用户需要一个密钥,也就是第二张图里请求参数里的“ak”,这个可以自己去百度地图api里申请。第二每个ak每天只能调用2000次,矩形路况查询的矩形有大小限制,这意味着,我们如果要获取一整个城市的实时路况数据的话,要讲一个城市分成若干个矩形,而这若干个肯定是大于两千个的,所以,要么就用一个ak重复下载,要么就多搞几个ak下载。
那下面就直接上代码了!!!
import pandas as pd
import requests
AkDict = {
1: 'ak1',
2: 'ak2',
3: 'ak3',
4: 'ak4',
5: 'ak5',
6: 'ak6',
7: 'ak7',
8: 'ak8',
9: 'ak9'
} #有条件的朋友可以多加点ak
num = 0
AkNum = 1 #由于一个ak只有2000次调用额度,这里加了一个计数器和一个key来在2000次之后换ak
x = []
url = 'https://api.map.baidu.com/traffic/v1/bound'
headers = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome'
'/100.0.4896.88 Safari/537.36'
}
# 设置初始点经纬度
baselng = 111.890888587
baselat = 27.8512231429
# 设置经纬度宽
widelng = 0.012
widelat = 0.012
for i in range(0, 80):
startlat = round(baselat + i * widelat, 6)
endlat = round(startlat + widelat, 6)
for j in range(0, 200): #这里要着重注意(如果一次使用多个ak)!!!i 和 j 的成绩的最大值不能大于或等于你的ak数乘以2000!!!
startlng = round(baselng + j * widelng, 6)
endlng = round(startlng + widelng, 6)
locStr = str(startlat) + "," + str(startlng) + ";" + str(endlat) + "," + str(endlng)
num += 1
if num % 2000 == 0:
AkNum += 1
params = {
"bounds": locStr,
"road_grade": 0,
"ak": AkDict[AkNum]
}
res = requests.get(url=url, params=params, headers=headers, timeout=(3, 7))
data = res.json()
if data.get('road_traffic') is not None:
for k in range(0, len(data.get('road_traffic'))):
road_traffic = data.get('road_traffic')
evaluation = data.get('evaluation')
road_name = road_traffic[k].get('road_name')
status = evaluation.get('status')
if (data.get('road_traffic')[k]).get("congestion_sections") is not None:
congestion_sections = (road_traffic[k]).get('congestion_sections')
status = (congestion_sections[0]).get('status')
speed = (congestion_sections[0]).get('speed')
congestion_distance = (congestion_sections[0]).get('congestion_distance')
congestion_trend = (congestion_sections[0]).get('congestion_distance')
section_desc = (congestion_sections[0]).get('section_desc') #这里是需要的数据,要哪些就保留那些
else:
speed = congestion_distance = congestion_trend = section_desc = ''
x.append([road_name, status, speed, congestion_distance, congestion_trend, section_desc, startlat, startlng])
print(data)
df = pd.DataFrame(x)
df.to_csv('csc.csv')
感谢您的阅读



