用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 resultelse: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
)、城市代码 (city1
和city2
),以及需要返回的字段 (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文件的完整流程