Python仅需5分钟轻松爬取全国“地铁”数据!
全国共有40个城市开通了地铁,累计车站数量为5968个
而我只用了5秒就爬完了这个数据
此时此刻,正在阅读的你们文章在想什么?小声地说一句:麻雀啄牛屁股——麻雀吃牛~
今天我就教大家如何用Python快速搞定。我先给你一个指示。稍后可以找到源代码和逻辑
1。基本代码
第一件事是获取所有开通地铁的城市
代码分为两部分,一部分是官网显示的城市列表,另一部分是城市列表图中未显示的
之间主要功能代码如下:
"""获取有地铁站点的城市名"""
df_city_list = get_city_list()
print('[ 提示 ]: 共检测到 {0} 个开通地铁的城市'.format(df_city_list.shape[0]))
第二步,遍历每个城市,获取对应城市的所有地铁线路
,并合并最终结果。最终结果是所有城市地铁站的全部信息
df_city_data = pd.DataFrame()
for row_index, data_row in df_city_list.iterrows():
print('[ 提示 ]: 正在爬取第 {0}/{1} 个城市 {2} 的数据中...'.format(row_index + 1, df_city_list.shape[0], data_row['name_ch']))
"""遍历每个城市获取地铁站点信息"""
df_per_city = get_per_info(data_row)
df_city_data = df_city_data.append(df_per_city, ignore_index=True)
程序流程图如下:
最终爬取的数据如下:
共40个城市,5968条数据
2 . 爬虫思路
请后台直接回复获取源代码文件地铁站
今天的源代码其实在我写之前就已经存在了,但是由于已经很久没有同步了随着官方更新,运行过程中会出现错误
这次我也修复了现有的bug,优化了一些逻辑,比之前的代码更好。它会跑得更快。
今天的数据来自高德地图。以下是高德地图针对全国地铁站的可视化界面。这个很不错。
页面是这样的:
对了,如果有不擅长写代码但又想获取数据进行分析挖掘的读者,可以在后台回复地铁数据文件,我会将其发送给您。
首先在浏览器中打开F12,进入上面的城市列表
对应的城市列表直接显示在div标签中,但是城市分为两部分,一部分在城市列表中,另一部分在城市列表中部分位于多城市列表中。
并且每个城市标签都有对应的城市ID和拼音城市。
点击城市,视觉界面发生变化时网络上会出现一个链接。
链接名称包含城市的ID和拼音,对应的数据就是我们想要的地铁站数据。
总结整个过程,思路如下:
- 迭代两个div中的城市数据(包括ID和拼音),生成城市集合
- 迭代城市集合,生成城市集合各个城市的URL
- 访问URL.遍历对应城市的地铁站数据
代码的重现比较简单,但由于篇幅问题,这里只展示了部分基本代码
先,下载城市列表的第一部分:
# 获取显示出的城市列表
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()
name_dict.append({'name_py': city_name_py, 'id': city_id, 'name_ch': city_name_ch})
参考资料上面的写法会得到未显示的列表城市,并将它们合并在一起,得到所有城市的列表
最后一步就是获取地铁线路每个城市的。基本代码如下:
# 遍历每一条地铁线路
for data_line in data['l']:
df_per_metro = pd.DataFrame(data_line['st'])
df_per_metro = df_per_metro[['n', 'sl', 'poiid', 'sp']]
df_per_metro['gd经度'] = df_per_metro['sl'].apply(lambda x: x.split(',')[0])
df_per_metro['gd纬度'] = df_per_metro['sl'].apply(lambda x: x.split(',')[1])
df_per_metro.rename(columns={'n': '站点名称', 'sp': '拼音名称', 'poiid': 'POI编号'}, inplace=True)
以上为基本源码,非核心部分省略,如有需要请查看源码文件。
摘自小毅写的初级学习笔记
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。