怎样用VFP爬取全国40城5000地铁站点数据
怎样用VFP爬取全国40城5000地铁站点数据,生成Excel表格?具体字段有:站点名称 拼音名称 gd经度 gd纬度 路线名称 城市名称 行政区名称 bd经度 bd纬度
网页地址:http://map.
请高手赐教,万分感谢!!!
程序代码:import requests
import json
from typing import Dict, List, Any
def get_chengdu_subway_data(url: str) -> Dict[str, Any]:
"""
获取成都地铁数据
Args:
url: 数据接口URL
Returns:
解析后的JSON数据
"""
try:
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 发送GET请求
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 如果请求失败会抛出异常
# 解析JSON数据
data = response.json()
return data
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return {}
except json.JSONDecodeError as e:
print(f"JSON解析失败: {e}")
return {}
def parse_subway_data(data: Dict[str, Any]) -> Dict[str, List[Dict]]:
"""
解析地铁数据
Args:
data: 原始地铁数据
Returns:
结构化的地铁线路信息
"""
if not data:
return {}
result = {
'lines': [],
'stations': []
}
# 提取基本信息
city_name = data.get('s', '')
city_code = data.get('i', '')
print(f"城市: {city_name} (代码: {city_code})")
print("=" * 50)
# 解析线路信息
lines = data.get('l', [])
for line in lines:
line_info = {
'line_name': line.get('ln', ''),
'line_name_en': line.get('kn', ''),
'line_color': line.get('cl', ''),
'line_status': line.get('su', ''),
'stations': []
}
# 解析站点信息
stations = line.get('st', [])
for station in stations:
station_info = {
'station_id': station.get('si', ''),
'station_name': station.get('n', ''),
'station_name_en': station.get('sp', ''),
'coordinates': station.get('sl', ''),
'position': station.get('p', ''),
'is_transfer': station.get('t', '0') == '1', # 是否为换乘站
'transfer_lines': station.get('r', '').split('|') if station.get('r') else [],
'status': station.get('su', '')
}
line_info['stations'].append(station_info)
result['lines'].append(line_info)
# 打印线路信息
print(f"线路: {line_info['line_name']} ({line_info['line_name_en']})")
print(f"颜色: {line_info['line_color']}")
print(f"站点数量: {len(line_info['stations'])}")
print("站点列表:")
for i, station in enumerate(line_info['stations'], 1):
transfer_flag = " (换乘站)" if station['is_transfer'] else ""
print(f" {i:2d}. {station['station_name']}{transfer_flag}(经纬:{station['coordinates']})")
print("-" * 30)
return result
def get_station_transfer_info(data: Dict[str, Any]) -> Dict[str, List[str]]:
"""
获取换乘站信息
Args:
data: 原始地铁数据
Returns:
换乘站及其对应的线路
"""
transfer_stations = {}
lines = data.get('l', [])
for line in lines:
line_name = line.get('ln', '')
stations = line.get('st', [])
for station in stations:
if station.get('t', '0') == '1': # 换乘站
station_name = station.get('n', '')
if station_name not in transfer_stations:
transfer_stations[station_name] = []
if line_name not in transfer_stations[station_name]:
transfer_stations[station_name].append(line_name)
return transfer_stations
def main():
# 成都地铁数据URL
url = "http://map./service/subway?_1764553326419&srhdata=5101_drw_chengdu.json"
print("正在获取成都地铁数据...")
# 获取数据
data = get_chengdu_subway_data(url)
if not data:
print("未能获取到数据")
return
# 解析数据
parsed_data = parse_subway_data(data)
# 获取换乘站信息
transfer_info = get_station_transfer_info(data)
# 打印换乘站信息
print("\n换乘站信息:")
print("=" * 50)
for station, lines in transfer_info.items():
print(f"{station}: {', '.join(lines)}")
# 保存解析后的数据到文件(可选)
try:
with open('chengdu_subway_data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"\n原始数据已保存到: chengdu_subway_data.json")
with open('chengdu_subway_parsed.json', 'w', encoding='utf-8') as f:
json.dump(parsed_data, f, ensure_ascii=False, indent=2)
print(f"解析数据已保存到: chengdu_subway_parsed.json")
except Exception as e:
print(f"保存文件时出错: {e}")
if __name__ == "__main__":
main()核心代码都有了, 想怎么使用数据, 稍微改造即可