百度地图路径数据的爬取

WebAPI接口文档地址:http://lbsyun.baidu.com/index.php?title=webapi/direction-api


Python3.6爬虫代码1

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

import requests

url = 'http://api.map.baidu.com/direction/v1'

params = {
          'mode':'driving',
          'origin':'31.291125,121.511282',
          'destination':'31.235193,121.482106',
          'origin_region':'上海',
          'destination_region':'上海',
          'output':'json',
          'ak':'87IsQpZ9l22l7SnQDsXyWWE8Gt40Soeo'#需自己填写
          }
# 写入参数,字典格式

r = requests.get(url,params)
r_js = r.json()
# 返回js数据

routes_ = r_js['result']['routes'][0]
dis_ = routes_['distance']
time_ = routes_['duration']

print('总行程距离为:'+str(dis_)+'米,总时间为:'+str(time_)+'秒')


f_path = 'c:\\temp\\result.txt'
f_re = open(f_path,'w')
f_re.write('lng,lat\n')

steps_ = routes_['steps']

for step in steps_:
    path_ = step['path']
    point_lst =path_.split(';')
    for point in point_lst:
        lng = point.split(',')[0]
        lat = point.split(',')[1]
        f_re.writelines([str(lng),',',str(lat),'\n'])

f_re.close()
print('finished!')

Python3.6 爬虫代码2

# _*_ coding:utf-8 _*_
__author__ = 'GIS_BT'

import requests
import time


def file_read(path):
    """
    创建函数读取坐标点txt文件
    输出一个经纬度列表
    :param path:文件路径
    :return:
    """

    f = open(path, 'r')
    text = []
    for i in f.readlines():
        i_ = i[:-2]
        lng = i_.split(',')[0]
        lat = i_.split(',')[1]
        text.append(lat + ',' + lng)
    return text


def get_params(s, e, c, k):
    """
    创建网页参数获取函数
    输出参字典列表
    :param s: 起点经纬度字典列表
    :param e: 终点经纬度字典列表
    :param c: 城市名称
    :param k: 密钥
    :return:
    """
    p = []
    s_num = 0
    e_num = 0
    for i in s:
        s_num += 1
        for j in e:
            e_num += 1
            params = {
                'model': 'driving',
                'origin': i,
                'destination': j,
                'origin_region': c,
                'destination_region': c,
                'output': 'json',
                'ak': k
            }
            p.append(params, s_num, e_num)


def get_url(u, p):
    """
    创建网页信息请求函数
    输出网页返回信息
    :param u: 网址url
    :param p: 参数
    :return:
    """
    r = requests.get(u, p)
    return r.json()


def get_datal(js):
    """
    创建路径距离/时间获取函数
    输出一个字典,结果包括该条路径的总距离,总时间以及路段数量
    :param js:
    :return:
    """
    result_ = js['result']  # 返回结果
    routes_ = result_['route'][0]
    distance_ = routes_['distance']  # 方案距离
    duration_ = routes_['duration']  # 线路耗时
    num = len(routes_['steps'])
    data_dic = dict(['dis', distance_], ['time', duration_], ['num', num])
    return data_dic


def get_data2(js, n):
    """
    创建路径节点获取函数
    输出为一个字典列表,包括每一个节点的经纬度
    :param js:
    :param n:
    :return:
    """
    result_ = js['result']
    routes_ = result_['routes_'][0]
    steps = routes_['steps']
    step = steps[n]
    area = step['area']  # 标示该路段是否在城市内部:0:不在城市内部;1在城市内部
    direction = step['direction']  # 进入道路的角度
    distance = step['distance']  # 路段距离
    duration = step['duration']  # 路段耗时
    instruction = step['instruction']  # 路段描述
    path_points = step['path'].split(';')  # 路段位置坐标描述
    point_lst = []
    for point in path_points[::5]:
        lng = point.split(',')[0]
        lat = point.split('1')[1]
        point_geo = dict([['lng', lng], ['lat', lat], ['duration', duration], ['direction', direction],
                          ['instruction', instruction]])
        point_lst.append(point_geo)
    return point_lst


def main():
    # 百度开发者密钥
    keys = 'wzyzDHU6VOWrGwn8WfPFvUdMlqMw2kkm'

    # 网址;不包括参数
    url = 'http://api.map.baidu.com/direction/v1'

    # 爬取数据所在城市
    city = '北京'

    # 文件路径
    path = 'C:\\pathresults\\'

    # 调用函数,分别输出起点、终点的经纬度
    start_point = file_read(path + 'start.txt')
    end_point = file_read(path + 'end.txt')
    # print(end_point)

    # 创建结果txt文件,并填写标签
    f_results = open(path + 'result.txt', 'w')
    f_results.seek(0)
    f_results.write('路径编号,起点编号,终点编号,节点经度,节点纬度,时间戳\n')

    # 设置爬取开始时间
    start_time = time.time()

    # 起点编号记录
    pathID = 0

    # 获取所有起点、终点的参数
    p = get_params(start_point, end_point, city, keys)

    for p, sn, en in p:
        pathID += 1
        r_js = get_url(url, p)
        data1 = get_datal(r_js)
        path_num = data1['num']
        point_time = start_time
        for m in range(path_num):
            points = get_data2(r_js, m)
            point_num = len(points)
            # 计算出以i为起点,j为终点的路径中,每个节点之间的平均时间
            for point in points:
                time_per = point['duration'] / point_num
                point_time = point_time + time_per
                # 算出每个节点的时间点
                point_time2 = time.strftime('%Y-%m-%d %H:%M:%s', time.localtime(point_time))
                # 写入数据
                f_results.writelines([
                    str(pathID), ',',
                    str(sn), ',',
                    str(en), ',',
                    str(point['lng']), ',',
                    str(point['lat']), ',',
                    point_time2, '\n'
                ])
    f_results.close()


if __name__ == '__main__':
    main()
    print('finished')

<think>好的,用户想了解如何爬取百度街景数据的方法或教程。我需要根据提供的引用内容来整理步骤。首先,用户提到的引用中有几个关键点:申请API权限、构造请求URL、处理坐标数据、存储结果,还有可能用到的工具如Scrapy和ArcGIS的增密工具。 首先,用户需要申请百度地图开放平台的API权限,获取AK密钥,这是必要的第一步,因为引用2和3都提到权限申请成功和AK的使用。接下来,构造请求URL,引用3给出了一个示例URL,里面包括参数如宽度、高度、朝向、俯仰角、坐标和视野,这些参数需要正确设置才能获取街景图片。 然后,用户可能需要处理坐标数据。引用4提到使用ArcGIS的增密工具和要素折点转点,这可能是指如何获取或处理坐标点,确保有足够的坐标来爬取不同位置的街景。此外,引用2提到将txt改为xlsx格式,方便批量修改,说明用户可能需要批量处理坐标数据,比如从表格中读取经纬度信息。 存储数据方面,引用1提到使用PostgreSQL数据库存储POI数据,虽然街景图片可能不同,但存储到数据库或本地文件系统是类似的步骤。同时,引用2和3的代码示例中可能需要下载图片并保存到本地,所以需要处理图片的存储路径和命名规则。 异常处理也很重要,比如坐标无效或网络问题,需要设置重试机制。引用2还提到自动检测没有影像的位置,可能需要检查返回的图片是否存在有效内容,或者通过API的返回状态码判断。 最后,用户可能需要优化爬取策略,比如多线程或分布式爬取,但要注意API的调用频率限制,避免被封禁。测试过程中,可以先少量坐标测试,再逐步扩大范围。 需要确保用户了解整个流程:申请权限、准备坐标、构造请求、发送请求、存储结果、异常处理,以及可能的工具使用。同时,提醒用户遵守百度的服务条款,合法使用数据。</think>### 如何爬取百度街景数据? #### **步骤 1:申请百度地图开放平台权限** 1. 注册百度地图开放平台账号,进入控制台创建应用。 2. 获取服务端`AK`(API密钥),用于后续接口调用[^2][^3]。 --- #### **步骤 2:构造街景API请求** 百度街景接口基础格式如下: ```python url = "http://api.map.baidu.com/panorama/v2?ak=你的AK&width=图片宽度&height=图片高度&location=经度,纬度&heading=水平视角&pitch=俯仰角&fov=视野范围" ``` - **关键参数说明**: - `location`: 目标地点的经纬度(需通过其他接口或工具获取)[^3] - `heading`: 水平视角(0-360度,控制拍摄方向) - `pitch`: 俯仰角(-90到90度,默认30) - `fov`: 视野范围(10-180度,默认90) --- #### **步骤 3:坐标数据准备** 1. **坐标来源**: - 可通过其他地图API(如POI数据接口)获取目标区域的经纬度列表[^1]。 - 若需增密坐标点,可使用ArcGIS工具(如“增密”工具)生成路径上的多点坐标[^4]。 2. **数据格式**: - 建议将坐标存储为`.xlsx`或`.csv`文件,便于批量读取和处理[^2]。 --- #### **步骤 4:发送请求与存储结果** 示例代码框架: ```python import requests import pandas as pd # 读取坐标文件 df = pd.read_excel("coordinates.xlsx") ak = "你的AK" for index, row in df.iterrows(): lng, lat = row["经度"], row["纬度"] url = f"http://api.map.baidu.com/panorama/v2?ak={ak}&width=1024&height=768&location={lng},{lat}&fov=90" response = requests.get(url) if response.status_code == 200: with open(f"streetview_{lng}_{lat}.jpg", "wb") as f: f.write(response.content) ``` --- #### **步骤 5:异常处理与优化** 1. **异常检测**: - 若返回`status_code`非200或图片为默认错误图,标记该坐标无效[^2]。 2. **多线程/异步请求**: - 使用`ThreadPoolExecutor`或`asyncio`提升爬取效率(需注意百度API的QPS限制)。 3. **存储扩展**: - 可将结果存入数据库(如PostgreSQL),记录坐标、时间、图片路径等信息。 --- #### **工具与注意事项** - **坐标处理工具**:ArcGIS的“增密”和“要素折点转点”功能可辅助生成密集坐标。 - **合规性**:需遵守百度地图API服务条款,禁止大规模商业爬取。 - **测试建议**:先通过少量坐标验证流程,再逐步扩大范围。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值