如果说我比别人看得更远些,那是因为我站在了巨人的肩上。——牛顿
参考: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);
然后去控制台应用管理
我的应用
新建新应用
添加key
服务平台选择'Web服务'
提交
得到对应的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开发者文档中查询。
结果如下,至此深圳市公交线路及其坐标等标签都在表格文件中了。
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。