一 简介
利用python 批量下载高德地图全国轨道交通站点经纬度坐标信息。注意设置sleep时间,不要影响高德地图的服务效能。
二 需要导入的模块
需要导入的模块有requests,bs4,json,codecs,time,random,其中requests和bs4需要安装,其他是自带的模块。
三 具体详细代码,可直接使用
//导入模块
import requests
from bs4
import BeautifulSoup
import json
import codecs
import time
import random
//定义函数
def get_subway_data():
#网址
url = "http://map.amap.com/subway/index.html"
#这个要copy你自己电脑的
headers = { "User-Agent":"XXXXXXXXXXXXXXXXXXXXX"}
response = requests.get(url,headers=headers, timeout=50) response_content = response.content.decode("utf-8")
soup = BeautifulSoup(response_content, 'html.parser')
city_elements = soup.find_all("a", {"cityname": True, "id": True})
# Find all <a> tags with cityname and id attributes
citys_info = [{"city_name": el["cityname"], "city_id": el["id"]} for el in city_elements]
all_citys_stations_data = []
for city in citys_info:
city_name = city["city_name"]
print(city_name)
city_id = city["city_id"]
subway_url = f'http://map.amap.com/service/subway?_1708930872179&srhdata={city_id}_drw_{city_name}.json'
subway_response = requests.get(subway_url,headers=headers,timeout=50) subway_data = subway_response.json()
citys_stations_data = {}
citys_stations_data["city_name"] = city["city_name"] citys_stations_data["line_stations_data"] = []
for line in subway_data["l"]:
single_line_data = {}
single_line_data["line_name"] = line["ln"] single_line_data["stations"] = []
for station in line["st"]:
station_info = {"Station_Name": station["n"], "Latitude": float(station["sl"].split(",")[1]),"Longitude": float(station["sl"].split(",")[0])}
single_line_data["stations"].append(station_info) citys_stations_data["line_stations_data"].append(single_line_data) print(citys_stations_data) all_citys_stations_data.append(citys_stations_data)
time.sleep(60 + random.randint(0,200))
return all_citys_stations_data
all_citys_metro_lines_stations_data = get_subway_data()
json_data = json.dumps(all_citys_metro_lines_stations_data, ensure_ascii=False)
with codecs.open("all_metro_stations.json", "w", "utf-8") as file: file.write(json_data)
print(all_citys_metro_lines_stations_data)