利用高德API获取整个城市的公交路线并可视化(一)

如果说我比别人看得更远些,那是因为我站在了巨人的肩上。——牛顿

参考:Python:利用高德API获取公交路线并可视化_python爬取高德路网数据-CSDN博客

【大数据】城市公交网络分析与可视化(四):绘制城市公交(地铁)线路图_python爬取公交网络数据并生成文件-CSDN博客

记录于2024年6月,因为高德API的key策略调整,增加了安全密钥这个一部分,同时拾人牙慧,优化了抓取一个城市的公交站点及其途径站点数据方法,避免公交车命名规范而导致城市公交数据抓取不全问题。

方法思路

1、遍历8684官网对应城市所有公交站点名称并形成.txt

2、依此读取该城市所有公交站点名称,并输出公交线路数据及途径站点坐标等。

第一步先遍历8684官网深圳市所有公交站点名称并形成txt,需要换城市直接修改url就行,就是把shenzhen改成其他城市即可,完整代码如下;

#运行环境 Python 3.11

# -*- coding: utf-8 -*-
import requests  # 导入requests
from bs4 import BeautifulSoup  # 导入bs4中的BeautifulSoup
import os

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}

all_url = 'http://shenzhen.8684.cn'  # 深圳市公交8684的URL地址

start_html = requests.get(all_url, headers=headers)

Soup = BeautifulSoup(start_html.text, 'lxml')

all_list = Soup.find_all('div', class_='list')
all_Num = all_list[0].find_all('a')  # 数字开头
all_Word = all_list[1].find_all('a')  # 字母/拼音开头

Network_list = []

# 数字开头公交
for a in all_Num:
    href = a['href']  # 取出a标签的href 属性
    html = all_url + href
    second_html = requests.get(html, headers=headers)

    Soup2 = BeautifulSoup(second_html.text, 'lxml')

    all_cc = Soup2.find('div', class_='cc-content').find_all('div')[-1]
    all_xNum = all_cc.find_all('a')
    for a2 in all_xNum:
        title = a2.get_text()  # 取出a1标签的文本
        Network_list.append(title)

# 字母开头公交
for b in all_Word:
    href = b['href']  # 取出a标签的href 属性
    html = all_url + href
    second_html = requests.get(html, headers=headers)

    Soup3 = BeautifulSoup(second_html.text, 'lxml')

    all_cc2 = Soup3.find('div', class_='cc-content').find_all('div')[-1]
    all_xWord = all_cc2.find_all('a')
    for b2 in all_xWord:
        title = b2.get_text()  # 取出a1标签的文本
        Network_list.append(title)


# 定义保存函数,将运算结果保存为txt文件
def text_save(content, filename, mode='a'):
    file = open(filename, mode, encoding='utf-8')
    for i in range(len(content)):
        file.write(str(content[i]) + ',')
        print("\r已输出{}公交车".format(content[i]), end='')
    file.close()


# 输出处理后的数据
text_save(Network_list, '深圳公交线路.txt');

至此,第一步完成,我们得到了一个'深圳公交线路'.txt;

下面进行第二步,利用高德API抓取公交线路相关信息,首先登录/注册账号高德开放平台 | 高德地图API (amap.com)

然后去控制台\rightarrow应用管理\rightarrow我的应用\rightarrow新建新应用\rightarrow添加key\rightarrow服务平台选择'Web服务'\rightarrow提交\rightarrow得到对应的key和安全密钥

至此得到了公交线路查询的key及其安全密钥,以往代码不能用的原因也是因为缺少了新的安全密钥的关系;

PS:完整代码如下,(但是运行前检查以下问题1、把url里面的key和安全密钥换成自己,2、把city改成你抓取的城市,读取txt的路径也改成你自己的,可以把txt放在你运行文件.py的路径下,对了,结果也会在里面);

#运行环境 Python 3.11

import requests
import json
import pandas as pd


def Bus_inf(city, line):
    url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=你自己的key&jscode=你自己的安全密钥&output=json&city={}&offset=1&keywords={}&platform=JS'.format(
        city, line)
    try:
        r = requests.get(url).text
        rt = json.loads(r)
        if rt.get('buslines') and rt['buslines']:
            busline = rt['buslines'][0]
            dt = {
                'line_name': busline['name'],  # 公交线路名字
                'start_stop': busline['start_stop'],  # 始发站
                'end_stop': busline['end_stop'],  # 终点站
                'bounds': busline['bounds'],  # 行车区间
                'distance': busline['distance'],  # 全程长度
                'station_name': [],  # 沿途站点名
                'station_coords': [],  # 沿途站点坐标
                'station_sequence': [],  # 沿途站点第几站
            }

            # 3、获取沿途站点站名、对应坐标和“第几站”信息
            for st in busline['busstops']:
                dt['station_name'].append(st['name'])
                dt['station_coords'].append(st['location'])
                dt['station_sequence'].append(st['sequence'])

                # 将dt转换为DataFrame,并将索引设置为当前公交线的索引(从1开始计数)
            return pd.DataFrame([dt], index=[len(all_buslines) + 1])
        else:
            return pd.DataFrame()  # 没有找到公交线路信息,返回空DataFrame
    except Exception as e:
        print(f"Error fetching bus info for line {line}: {e}")
        return pd.DataFrame()  # 读取数据失败,返回空DataFrame


if __name__ == "__main__":
    city = '深圳'  # 需要查询公交信息的城市
    all_buslines = pd.DataFrame()
    with open("深圳公交线路.txt", "r", encoding="utf-8") as f:
        bus_name = f.read().strip().split(",")  # 读取所有线路名,并去除可能的换行符和空格

    for i in bus_name:
        df_line = Bus_inf(city, i.strip())  # 去除线路名两侧的空格
        if not df_line.empty:  # 如果DataFrame不为空(即成功获取了线路信息)
            all_buslines = pd.concat([all_buslines, df_line])

            # 想知道有效公交线路数,可以直接从all_buslines的索引长度获取
    effective_bus_num = len(all_buslines.index)
    print(f"有效公交线路数为:{effective_bus_num}个")

    # 将结果保存为CSV文件
    all_buslines.to_csv(f"{city}公交基本信息.csv", index=False, encoding='utf-8-sig')

我获取了公交线路名称、始发站、终点站、行车区间、全程长度、途径站点名、途径站点坐标、途径站点第几站这几个标签,如果需要其他标签可以在高德API开发者文档中查询。

结果如下,至此深圳市公交线路及其坐标等标签都在表格文件中了。

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值