栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python爬虫 + 百度地图api 获取城市的实时路况信息

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python爬虫 + 百度地图api 获取城市的实时路况信息

​

  1. 前言:本文写作的初衷是笔者参与了一个道路实况图的制作项目中,本人负责路况数据的抓取,本来是想要用高德地图的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')

感谢您的阅读

​

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025213.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号