当前位置: 首页 > news >正文

用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)、城市代码 (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文件的完整流程

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PostgreSQL的Logical Replication Launcher进程
  • Lumos学习王佩丰Excel第十二讲:Match与Index
  • 【PyCharm】配置“清华镜像”地址
  • Educational Codeforces Round 169 (Rated for Div. 2)(A-D)
  • 深度学习--参数报错问题
  • 网络硬盘录像机NVR解決方案:海思3520D模组与全面的NVR方案支持
  • 【信息学奥赛一本通】1007:计算(a+b)×c的值
  • Unity3D 自定义窗口
  • HiveSQL:提取json串内容——get_json_oject和json_tuple
  • Go Roadmap-Basics中文笔记
  • 类与对象(中(1))
  • 【文献阅读】A Comprehensive Review of Multimodal Large Language Models
  • 在亚马逊云科技上对Stable Diffusion模型提示词、输出图像内容进行安全审核
  • UART、SPI、IIC、CAN几种通信协议的简述与对比
  • 简洁清新个人博客网页模板演示学习
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • bearychat的java client
  • Django 博客开发教程 8 - 博客文章详情页
  • Mac转Windows的拯救指南
  • React中的“虫洞”——Context
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue全家桶实现一个Web App
  • 动态魔术使用DBMS_SQL
  • 每天一个设计模式之命令模式
  • 深度学习中的信息论知识详解
  • 小而合理的前端理论:rscss和rsjs
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (1)(1.11) SiK Radio v2(一)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (3)选择元素——(17)练习(Exercises)
  • (4.10~4.16)
  • (libusb) usb口自动刷新
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (学习总结16)C++模版2
  • (一)Dubbo快速入门、介绍、使用
  • (转)VC++中ondraw在什么时候调用的
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ../depcomp: line 571: exec: g++: not found
  • .Net 6.0 处理跨域的方式
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • 。Net下Windows服务程序开发疑惑
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell