用Python爬取高德地图路径规划数据——01. 指定起终点爬取-Python程序及详解

这个Python程序旨在从高德地图API获取路径规划数据,解析这些数据,并最终将其保存到JSON和CSV文件中。下面,我将详细讲解每个部分的功能和实现方式。

1. 导入所需的模块

import requests
import json
import time
import csv
  • requests: 用于发送HTTP请求并接收响应。
  • json: 用于处理JSON格式的数据。
  • time: 用于在请求之间添加延迟,避免频繁请求。
  • csv: 用于将解析后的数据保存到CSV文件中。

2. 获取路径规划数据

def get_route_planning(start_point, end_point, api_key):
    base_url = 'https://restapi.amap.com/v5/direction/transit/integrated'
    parameters = {
        'origin': start_point,
        'destination': end_point,
        'key': api_key,
        'city1': '0871',
        'city2': '0871',
        'show_fields':'cost'        
    }

    response = requests.get(base_url, params=parameters)
    
    if response.status_code == 200:
        result = response.json()
        return result
    else:
        print(f"Error: {response.status_code}")
        return None
  • get_route_planning 函数用于根据起点和终点的经纬度,通过高德地图API获取路径规划数据。
  • base_url 是API的基础URL,v5/direction/transit/integrated 代表公交换乘路径规划服务。
  • parameters 包含请求的参数,包括起点 (origin)、终点 (destination)、API Key (key)、城市代码 (city1city2),以及需要返回的字段 (show_fields)。
  • 通过 requests.get 发送HTTP请求并获取响应。如果响应状态码为200,则返回解析后的JSON数据;否则输出错误信息。

3. 批量处理多个路径规划

def batch_process(locations, api_key):
    route_data_all = []

    for start, end in locations:
        route_data = get_route_planning(start, end, api_key)
        if route_data:
            route_data_all.append(route_data)
            time.sleep(0.1)  # 控制请求速率,避免频繁请求被限制

    return route_data_all
  • batch_process 函数用于批量处理多个路径规划请求。
  • locations 是一个包含多个起点和终点元组的列表。
  • 函数会依次调用 get_route_planning 函数,并将每次获取的数据添加到 route_data_all 列表中。
  • time.sleep(0.1) 添加了0.1秒的延迟,用于避免请求过于频繁,防止IP被API服务暂时封禁。

4. 保存数据到文件

def save_to_file(data, filename='route_data.json'):
    with open(filename, 'w', encoding='utf-8') as file:
        json.dump(data, file, ensure_ascii=False, indent=2)
  • save_to_file 函数用于将收集到的路径规划数据保存到JSON文件中。
  • 使用 json.dump 将Python对象转换为JSON格式并写入文件。

5. 主程序入口

def main():
    your_api_key = "替换为自己的key"

    locations = [
        ("102.860168,24.870209", "102.618095,24.984176"), # 昆明南站——西山公园
        ("102.842417,24.835941", "102.720305,25.056113"), # 大学城站——火车北站
        ("102.719665,25.038080", "102.699926,25.032055"), # 东风广场——弥勒寺站
    ]

    route_data_all = batch_process(locations, your_api_key)
    
    if route_data_all:
        save_to_file(route_data_all, 'batch_route_data.json')
        print("路径规划数据已保存到 batch_route_data.json 文件中")

注意:your_api_key = "替换为自己的key"处需要将自己申请的key粘贴到此处,替换“替换为自己的key”,申请方法详见:http://t.csdnimg.cn/xeUj9icon-default.png?t=N7T8http://t.csdnimg.cn/xeUj9

  • main 函数是程序的入口。
  • 这里你可以替换 your_api_key 为你自己的高德地图API Key。
  • locations 是包含多个起点和终点经纬度的列表。
  • 程序会批量处理这些路径规划,并将结果保存到 batch_route_data.json 文件中。

6. 查看和解析JSON数据

with open('batch_route_data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)
    
print(data) # 输出读取到的数据
  • 这段代码用于读取 batch_route_data.json 文件中的数据并打印到控制台上。

7. 解析并输出JSON数据

for item in data:
    status = item['status']
    info = item['info']
    infocode = item['infocode']
    route = item['route']

    origin = route['origin']
    destination = route['destination']
    distance = route['distance']
    
    cost_info = route['cost']
    taxi_fee = cost_info.get('taxi_fee')
    
    for transit in route['transits']:
        transit_cost = transit['cost']
        transit_duration = transit_cost['duration']
        transit_transit_fee = transit_cost.get('transit_fee')

        transit_distance = transit['distance']
        walking_distance = transit['walking_distance']
        
        for segment in transit['segments']:
            if 'bus' in segment:
                bus_info = segment['bus']
                bus_name = bus_info['buslines'][0]['name']
                bus_distance = bus_info['buslines'][0]['distance']
                print(f"Bus Name: {bus_name}")
                print(f"Bus Distance: {bus_distance}")

            if 'walking' in segment:
                walking_info = segment['walking']
                walking_distance = walking_info['distance']
                print(f"Walking Distance: {walking_distance}")

            print("-----")
        print("==========")
  • 这部分代码详细解析了JSON数据,提取了路径的基本信息、花费、距离、换乘信息等,并逐段输出每个公交和步行信息。

8. 保存解析后的数据到CSV文件

csv_filename = 'transit_routes.csv'
fieldnames = ['Status', 'Info', 'Infocode', 'Origin', 'Destination', 'Distance',
              'Taxi Fee', 'Transit Duration', 'Transit Fee', 'Transit Distance',
              'Walking Distance', 'Bus Names', 'Bus Distances', 'Walking Distances']

with open(csv_filename, mode='w', newline='', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for item in data:
        status = item['status']
        info = item['info']
        infocode = item['infocode']
        route = item['route']

        origin = route['origin']
        destination = route['destination']
        distance = route['distance']

        cost_info = route['cost']
        taxi_fee = cost_info.get('taxi_fee')

        for transit in route['transits']:
            transit_cost = transit['cost']
            transit_duration = transit_cost['duration']
            transit_transit_fee = transit_cost.get('transit_fee')

            transit_distance = transit['distance']
            walking_distance = transit['walking_distance']

            transit_segments = transit['segments']
            bus_names = []
            bus_distances = []
            walking_distances = []

            for segment in transit_segments:
                if 'bus' in segment:
                    bus_info = segment['bus']
                    bus_name = bus_info['buslines'][0]['name']
                    bus_distance = bus_info['buslines'][0]['distance']

                    bus_names.append(bus_name)
                    bus_distances.append(bus_distance)
                elif 'walking' in segment:
                    walking_info = segment['walking']
                    walking_distance = walking_info['distance']

                    walking_distances.append(walking_distance)

            row_data = {
                'Status': status,
                'Info': info,
                'Infocode': infocode,
                'Origin': origin,
                'Destination': destination,
                'Distance': distance,
                'Taxi Fee': taxi_fee,
                'Transit Duration': transit_duration,
                'Transit Fee': transit_transit_fee,
                'Transit Distance': transit_distance,
                'Walking Distance': walking_distance,
                'Bus Names': ' / '.join(bus_names),
                'Bus Distances': ' / '.join(bus_distances),
                'Walking Distances': ' / '.join(walking_distances)
            }

            writer.writerow(row_data)

print(f'CSV 文件 "{csv_filename}" 已创建并成功写入。')
  • 最后,解析后的数据被组织成字典,并写入到 transit_routes.csv 文件中。
  • fieldnames 定义了CSV文件的列名。
  • 通过 csv.DictWriter,程序将每个换乘方案的详细信息写入CSV文件的一行。

总结

这个程序涵盖了从API获取数据、批量处理、数据解析、JSON和CSV文件存储等一系列功能。你可以使用这个程序来获取特定地点之间的公交换乘方案,并将详细信息保存以供后续分析和使用。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值