用Python爬取高德地图路径规划数据——02. 批量爬取-Python程序及详解

这个Python程序用于从高德地图API获取公交换乘路径数据,并将数据保存到JSON和CSV文件中。程序分为几个主要部分:路径数据的获取、批量处理、数据保存、CSV读取与解析。以下是对该程序的详细分析和解释:

1. 导入必要的库

import requests
import json
import time
import csv
from itertools import combinations
  • requests: 用于发送HTTP请求并接收响应。
  • json: 用于处理JSON格式的数据。
  • time: 用于在请求之间添加延迟,防止请求过于频繁。
  • csv: 用于处理CSV文件的读取和写入。
  • combinations: 从 itertools 导入,用于生成起点和终点的所有两两组合。

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 字典包含API请求的参数,包括起点 (origin)、终点 (destination)、API Key (key)、城市代码 (city1city2),以及需要返回的字段 (show_fields)。
  • 函数发送请求,并检查响应状态码。如果请求成功(状态码为200),则返回解析后的JSON数据;否则输出错误信息并返回 None

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秒的延迟,防止请求过于频繁。

4. 保存数据到JSON文件

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. 从CSV文件中读取地点坐标

def read_locations_from_csv(file_path):
    locations = []
    with open(file_path, 'r', encoding='utf-8') as file:
        csv_reader = csv.DictReader(file)
        coordinates = [(row['longitude'], row['latitude']) for row in csv_reader]

    # 为每个地点创建两两不同的组合作为起点和终点,避免起点和终点相同
    for start, end in combinations(coordinates, 2):
        start_point = f"{start[0]},{start[1]}"
        end_point = f"{end[0]},{end[1]}"
        locations.append((start_point, end_point))

    return locations
  • read_locations_from_csv 函数从CSV文件中读取地点的经纬度,并生成所有两两不同的组合作为路径的起点和终点。
  • csv.DictReader 用于逐行读取CSV文件,并生成字典,每一行作为一个字典对象。
  • combinations 函数用于生成所有可能的两两不同组合,确保不会选择相同的起点和终点。

6. 主函数 main

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

    file_path = 'C:\\Users\\Administrator\\Desktop\\输入数据2-tram_station-批量.csv'
    locations = read_locations_from_csv(file_path)

    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”,申请方法详见:用Python爬取高德地图地铁站点数据——Python程序及详解-CSDN博客

  • main 函数是程序的入口。
  • 从指定的CSV文件中读取地点坐标,并生成所有起点和终点组合。
  • 调用 batch_process 函数获取所有路径规划数据,并将结果保存到 batch_route_data.json 文件中。

7. 查看和解析JSON数据

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

8. 解析和提取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数据,并提取出路径规划的详细信息,例如:路线状态、起点和终点、路线距离、出租车费用、换乘信息、步行距离等。

9. 将解析后的数据保存到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}" 已创建并成功写入。')
  • 这段代码将解析后的路径数据写入CSV文件中,文件的每一行表示一条换乘方案的详细信息。

总结

这个程序成功地实现了从高德地图API获取公交换乘路径数据的功能,并将这些数据保存为JSON和CSV文件。它包括了从CSV读取地点信息、批量获取路径数据、解析JSON数据、并最终输出到CSV文件的完整流程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值