利用Python爬取高德地图全国地铁站点信息

利用Python中的requests库进行地铁站点信息的获取,同时将数据保存在本机excel中

# 首先引入所需要的包
import requests
from bs4 import BeautifulSoup
import pandas as pd
import json



# 发送 GET 请求获取网页内容
url = 'http://map.amap.com/subway/index.html'
response = requests.get(url)
# 第一步:爬取两个 div 中的城市数据(包括 ID 和拼音),生成城市集合
if response.status_code == 200:
    # 解码
    response_content = response.content.decode('utf-8')
    # 使用 Beautiful Soup 解析网页内容
    soup = BeautifulSoup(response_content, 'html.parser')
    # 从这里开始,你可以使用 Beautiful Soup 对象(soup)来提取所需的信息
    # 例如,查找标题
    title = soup.title
    # 通过Beautiful Soup来找到城市信息元素,并提取这个元素的信息
    for soup_a in soup.find('div', class_='city-list fl').find_all('a'):
        city_name_py = soup_a['cityname']
        city_id = soup_a['id']
        city_name_ch = soup_a.get_text()
        city_info_list.append({'name_py': city_name_py, 'id': city_id, 'name_ch': city_name_ch})
        # 获取未显示出来的城市列表
    for soup_a in soup.find('div', class_='more-city-list').find_all('a'):
        city_name_py = soup_a['cityname']
        city_id = soup_a['id']
        city_name_ch = soup_a.get_text()
        city_info_list.append({'name_py': city_name_py, 'id': city_id, 'name_ch': city_name_ch})
        print(city_info_list)
else:
    print("无法获取网页内容")

for city_info in city_info_list:
    city_id = city_info.get("id")
    city_name = city_info.get("name_py")
    city_name_ch = city_info.get("name_ch")
    print("开始爬取城市" + city_name_ch + "的数据")
    city_lines_list = []
    # 第二步:遍历城市集合,构造每一个城市的 url,并下载数据
    # 构造每个城市的url
    url = "http://map.amap.com/service/subway?_1717380520536&srhdata=" + city_id + '_drw_' + city_name + '.json'
    res = requests.get(url)
    content = res.content.decode('utf-8')
    # 将内容字符串转换成json对象
    content_json = json.loads(content)
    # 提取该城市的所有地铁线list
    line_info_list = content_json.get("l")
    # 第三步:开始处理每一个地铁线,提取内容到dataframe中
    for line_info in line_info_list:
        # 地铁线名字
        line_name = line_info["kn"]
        # 处理地铁线站点
        df_per_zd = pd.DataFrame(line_info["st"])
        df_per_zd = df_per_zd[['n', 'sl', 'poiid', 'sp', 't', 'su', 'sid']]
        df_per_zd['gd经度'] = df_per_zd['sl'].apply(lambda x: x.split(',')[0])
        df_per_zd['gd纬度'] = df_per_zd['sl'].apply(lambda x: x.split(',')[1])
        df_per_zd.drop('sl', axis=1, inplace=True)
        df_per_zd['路线名称'] = line_info['ln']
        df_per_zd['城市名称'] = city_name_ch
        df_per_zd.rename(columns={"n": "站点名称", "poiid": "POI编号", "sp": "拼音名称", "t": "换乘标志 1:换乘,0:不可换乘", "su": "su", "sid": "sid编号"}, inplace=True)
        # 先将这条地铁线处理过的dataframe存起来,我们后面给他放到一张表里
        city_lines_list.append(df_per_zd)
    # 这段代码就是将地铁线数据列表聚合到一张表里,形成每个城市的地铁站数据
    city_subway_data = pd.concat(city_lines_list, ignore_index=True)
    # 第四步:将处理好的文件保存为xlsx
    city_subway_data.to_excel(city_name_ch + '.xlsx', sheet_name='Sheet1')

  • 21
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
爬取高德地图数据可以使用`requests`库和`BeautifulSoup`库。首先,需要获取全国地铁列表页面的HTML内容。可以通过以下代码实现: ```python import requests from bs4 import BeautifulSoup url = 'https://ditie.mapbar.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') ``` 接下来,需要从HTML中提取地铁信息。可以通过观察HTML源代码,发现地铁信息保存在`<div class="subway_list">`标签下的`<a>`标签中。可以使用以下代码提取地铁名称和链接: ```python subway_list = soup.find('div', {'class': 'subway_list'}) subways = subway_list.find_all('a') subway_info = [] for subway in subways: name = subway.text link = subway['href'] subway_info.append({'name': name, 'link': link}) ``` 接下来,需要访问每个地铁线路的页面获取地铁站信息。可以使用以下代码实现: ```python for subway in subway_info: link = subway['link'] response = requests.get(link) soup = BeautifulSoup(response.text, 'html.parser') station_list = soup.find('div', {'class': 'station_list'}) stations = station_list.find_all('a') station_info = [] for station in stations: name = station.text lat = station['lat'] lng = station['lng'] station_info.append({'name': name, 'lat': lat, 'lng': lng}) subway['stations'] = station_info ``` 现在,`subway_info`列表就包含了全国所有地铁线路的信息,每个地铁线路包含它所包含的地铁站信息。可以将这些信息写入CSV文件中: ```python import csv with open('subway.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['subway', 'station', 'lat', 'lng'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for subway in subway_info: for station in subway['stations']: writer.writerow({ 'subway': subway['name'], 'station': station['name'], 'lat': station['lat'], 'lng': station['lng'] }) ``` 数据可视化可以使用`matplotlib`库和`pandas`库。可以使用以下代码读取CSV文件并创建一个包含所有地铁站信息数据框: ```python import pandas as pd df = pd.read_csv('subway.csv') ``` 接下来,可以使用以下代码绘制全国地铁站分布图: ```python import matplotlib.pyplot as plt plt.figure(figsize=(10, 8)) plt.scatter(df['lng'], df['lat'], s=2, alpha=0.5) plt.title('Subway stations in China') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show() ``` 可以在地图上看到所有地铁站的分布情况。如果想要根据地铁线路对站进行着色,可以使用以下代码: ```python import matplotlib.cm as cm colors = cm.rainbow(df['subway'].factorize()[0] / len(df['subway'].unique())) plt.figure(figsize=(10, 8)) plt.scatter(df['lng'], df['lat'], s=2, alpha=0.5, c=colors) plt.title('Subway stations in China') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show() ``` 这样可以看到每个地铁线路的站都被着不同的颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值