教你轻松爬取全国40城5000+地铁站点数据!(附源码)

大家好,我是 辰哥~

今天介绍一种新的 获取城市地铁站点数据的方法,而且不再只是北上广深四个城市,而是 全国开通地铁的城市

对了,你觉得全国有多少个城市开通了地铁?

文末附源码

▶正文

今天爬取数据的链接是:http://map.amap.com/subway/index.html

这个是高德地图对于全国地铁站点的一个可视化界面,做的相当不错。

页面长这样:

3afae4d8941714e84c01e75a22a8ee45.png

既然是可视化那肯定有数据支撑,要不就是 有数据接口 要不就是 直接显示在页面上

巧的是,它两个都有!

首先,浏览器打开 F12,定位到上方的城市列表,如图:

d73257be92ac357f700365c6744879d0.png

对应的城市列表是直接显示在 div 标签里面的,不过城市是被分成了两部分,一部分在 city-list 里面,一部分在 more-city-list 里面。

而且在每一个城市的 a 标签里面有对应的城市 ID 和城市拼音。

随便点击一个城市,在可视化界面发生变化的同时看到 Network 中出现了一个链接。如图:

9c4f8a50797c89c98012165277c1f4d8.png

链接名称中包含了这个城市的 ID 和拼音,对应的数据就是我们要的地铁站点数据。

不过显然这个数据需要往下稍微深入一点才能发现:

e87178f568b1d1bc4c93af69433e1bd7.png

但是既然有了接口,那获取数据也就很简单的事情

总结一下流程,思路如下:

  • 爬取两个 div 中的城市数据(包括 ID 和拼音),生成城市集合

  • 遍历城市集合,构造每一个城市的 url

  • 访问 url,爬取对应城市的地铁站点数据

对了,最后还能加一步:通过地铁站点名去查询其对应所在的城市行政区。例如:深圳市翻身地铁站属于宝安区

实现起来比较简单,代码大致如下:

▶获取城市列表
url = 'http://map.amap.com/subway/index.html'
res = requests.get(url, headers={'User-Agent': get_ua()})
res.encoding = res.apparent_encoding
soup = BeautifulSoup(res.text, 'html.parser')

name_dict = []
# 获取显示出的城市列表
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 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()
    name_dict.append({'name_py': city_name_py, 'id': city_id, 'name_ch': city_name_ch})

df_name = pd.DataFrame(name_dict)

一共 有 40 个城市,解析拿到每个城市对应的 ID 和拼音

然后,对每个城市的 url 构造如下:

# 构造每个城市的url
url = "http://map.amap.com/service/subway?_1818387860087&srhdata=" + id + '_drw_' + cityname + '.json'
▶解析城市地铁站点

从 json 中可以很方便的解析每个城市的地铁站点数据

例如:站点所属的地铁线路、站点经纬度等

核心解析代码如下:

# 核心代码
df_per_zd = df_per_zd[['n', 'sl', 'poiid', 'sp']]
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['路线名称'] = data_line['ln']
df_per_zd['城市名称'] = name

代码的运行界面如下:

4c07bfce7821f324b68b56e3196ef53c.png

最终一共是 5001 条数据,对应的全国 40 个开通地铁的城市。

部分数据截图如下:

d3c708af3fce26007f47c7998a326ac5.png

再通过热力图简单看一下这些城市的分布情况:

54c0ba5e7467428448c4a352616d4e28.png

数据已经有了,抽样验证了一下,发现只有少数站点的区域不对,手动处理一下就行。

爬到的数据已经确认无误,接下来就是如何分析的问题了,下节分析部分会详细介绍。

以上就是爬虫部分的全部内容

感兴趣的同学可以去练练手

本文仅供读者学习使用,不做其他用途!

后台回复:211102,即可领取本文的全部代码

往期文章

626fe2658bb5ea4da67ce837e1c03e40.png

输出好看的表格,就用这个 Python 库!


1045f8df75029b64c7d71bcbe5c837a8.png

用Python+可视化工具制作漂亮地图


2649124fac8a4bf915236d0fa6b3eec4.png

手把手教你用Python爬取某网小说数据,并进行可视化分析

评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值