爬虫实战 |
您所在的位置:网站首页 › 全国地铁规划图 › 爬虫实战 |
原文链接:小一教你轻松爬取全国40城5000+地铁站点数据!附源码和数据集 大家好,我是小一 上一篇文章讲了一个失败的数据分析案例,导致失败最最主要的原因就两个字:数据 有时候,爬虫爬到的数据是很珍贵、很稀缺,但是在实际项目最好还是多点谨慎,保证万无一失。 今天介绍一种新的 获取城市地铁站点数据的方法,而且不再只是北上广深四个城市,而是 全国开通地铁的城市。 对了,你觉得全国有多少个城市开通了地铁? 正文今天爬取数据的链接是:http://map.amap.com/subway/index.html 这个是高德地图对于全国地铁站点的一个可视化界面,做的相当不错。 页面长这样: 既然是可视化那肯定有数据支撑,要不就是 有数据接口 要不就是 直接显示在页面上 巧的是,它都有! 首先,浏览器打开 F12,定位到上方的城市列表,如图: 对应的城市列表是直接显示在 div 标签里面的,不过城市是被分成了两部分,一部分在 city-list 里面,一部分在 more-city-list 里面。 而且在每一个城市的 a 标签里面有对应的城市 ID 和城市拼音。 随便点击一个城市,在可视化界面发生变化的同时看到 Network 中出现了一个链接。如图: 链接名称中包含了这个城市的 ID 和拼音,对应的数据就是我们要的地铁站点数据。 不过显然这个数据需要往下稍微深入一点才能发现: 但是既然有了接口,那获取数据也就很简单的事情 总结一下流程,思路如下: 爬取两个 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?_1618387860087&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代码的运行界面如下: 最终一共是 5001 条数据,对应的全国 40 个开通地铁的城市。 部分数据截图如下: 再通过热力图简单看一下这些城市的分布情况: 数据已经有了,抽样验证了一下,发现只有少数站点的区域不对,手动处理一下就行。 爬到的数据已经确认无误,接下来就是如何分析的问题了,下节分析部分会详细介绍。 ok,以上就是全部内容,感兴趣的同学可以去练练手,原文链接中 可免费获取数据集和源码 ▶原文链接:小一教你轻松爬取全国40城5000+地铁站点数据!附源码和数据集作者:xiaoyi 文章首发:公众号【小一的学习笔记】 未经允许禁止转载,需要转载请微信联系授权(微信号:zhiqiuxiaoyi) |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |