爬虫实战:我国城市的地铁数据以及分析

文章目录

  • 1 引言
  • 2 项目背景
  • 3 技术栈和工具选择
  • 4 数据爬取
    • 4.1 爬虫设计
    • 4.2 代码实现
    • 4.3 数据保存
    • 4.4 关键点分析
  • 5 数据处理与分析
    • 5.1 数据清洗
    • 5.2 数据分析
    • 5.3 关键点分析
  • 6 完整代码以及结果展示
  • 7 小分享

在这里插入图片描述

1 引言

本文将指导你如何通过Python从高德地图爬取中国城市地铁站数据,并使用Pandas及Matplotlib进行数据分析和可视化。我们将深入探讨爬虫代码的设计与实现,着重讲解数据获取、处理和分析的关键步骤。从技术细节到实际应用,本文旨在提供一个实战示例,展示如何利用编程技能解锁城市地铁数据的潜力,为进一步的城市规划和交通管理研究提供数据支持。

2 项目背景

城市地铁作为公共交通的重要组成部分,其数据反映了城市的交通动脉和发展蓝图。随着数据分析技术的发展,从地铁数据中提取信息,不仅可以优化日常出行,还能为城市规划和公共资源分配提供决策支持。尽管如此,地铁数据通常不易直接获取,需要通过特定手段进行采集。

选择高德地图作为数据源,是因为它提供了详尽的城市地铁信息,包括站点名称、位置坐标等,适合进行此类分析。本项目通过编写Python爬虫,自动化地从高德地图API获取数据,然后利用Pandas进行数据清洗和整理,最终通过Matplotlib和Seaborn进行数据的可视化分析,旨在揭示城市地铁网络的基本特征和潜在价值。此过程不仅展示了数据科学在城市交通领域的应用,也提供了一个实用的技术示例,供同领域研究者或爱好者参考。

3 技术栈和工具选择

本项目的实现主要依赖于Python,一个在数据科学和自动化领域广泛应用的编程语言。Python凭借其强大的库支持和简洁的语法,成为本项目的首选。下面是项目中关键技术和工具的概览及选择理由:

  1. Requests库:用于发起HTTP请求。选择Requests是因为它简单易用,可以快速从网络上获取数据。
  2. Pandas库:负责数据处理和分析。Pandas提供了DataFrame对象,非常适合于处理表格数据,易于数据筛选、清洗和处理。
  3. Matplotlib和Seaborn库:用于数据可视化。这两个库能够生成高质量的图表,帮助我们从视觉上理解数据模式和趋势。
  4. JSON库:处理JSON数据格式。高德地图API返回的数据格式为JSON,使用Python内置的JSON库可以方便地解析这些数据。

4 数据爬取

为了分析城市地铁网络,首先需要从高德地图API获取相关数据。本部分将详细介绍爬虫的设计与实现过程,包括如何构造请求、解析数据,并将数据保存为可用格式。

4.1 爬虫设计

爬虫的核心任务是自动化地发送请求到高德地图的API,并处理返回的数据。高德地图提供了一个接口,通过城市的ID和名称可以返回该城市地铁的详细信息,包括站点名称、位置坐标等。

4.2 代码实现

使用Python的requests库发送HTTP GET请求,获取地铁数据。然后,利用json库解析这些数据。以下是一个简化的示例代码:

import requests
import json
import pandas as pd

def get_metro_data(cityid, cityname):
    url = f'http://map.amap.com/service/subway?1469083453978&srhdata={cityid}_drw_{cityname}.json'
    response = requests.get(url)
    data = json.loads(response.text)
    
    # 解析数据
    metro_info = []
    for line in data['l']:
        for station in line['st']:
            metro_info.append({
                '城市名称': data['s'][:-2],
                '线路名称': line['kn'],
                '站点名称': station['n'],
                '经度': float(station['sl'].split(',')[0]),
                '纬度': float(station['sl'].split(',')[1])
            })
    return pd.DataFrame(metro_info)

# 示例:获取某城市地铁数据
df = get_metro_data('010', '北京')
print(df.head())

4.3 数据保存

获取的数据以DataFrame形式组织,并使用pandas的to_excel方法保存为Excel文件,方便后续分析。

df.to_excel('北京市地铁站数据.xls', index=False)

4.4 关键点分析

  1. 请求构造:利用城市ID和名称构造请求URL,这是获取数据的关键步骤。
  2. 数据解析:解析返回的JSON数据,提取所需的站点信息。
  3. 数据存储:将解析后的数据保存为Excel文件,便于后续处理和分析。

5 数据处理与分析

拥有了原始的城市地铁数据后,下一步是通过数据处理和分析来揭示地铁网络的特征。这部分主要介绍如何使用Pandas进行数据清洗、处理,以及如何进行基础的数据分析。

5.1 数据清洗

首先,需要对爬取的数据进行清洗,确保数据的质量和可用性。主要步骤包括检查和处理缺失值、去重,以及数据类型转换:

import pandas as pd

# 加载数据
df = pd.read_excel('地铁站数据.xls')

# 检查缺失值
print(df.isnull().sum())

# 去除缺失值
df.dropna(inplace=True)

# 去重
df.drop_duplicates(inplace=True)

# 数据类型转换示例
# df['经度'] = df['经度'].astype(float)
# df['纬度'] = df['纬度'].astype(float)

5.2 数据分析

数据清洗后,我们可以开始对数据进行分析,以探索各城市地铁站的分布、地铁线路的数量等信息。以下是一些基本的数据分析示例:

# 统计每个城市的地铁站数量
station_count = df.groupby('城市名称')['站点名称'].count()

# 统计每条线路的站点数量
line_station_count = df.groupby(['城市名称', '线路名称'])['站点名称'].count()

print(station_count)
print(line_station_count)

5.3 关键点分析

  1. 数据清洗是数据分析的前提,确保了分析结果的准确性。
  2. 分组统计操作是Pandas中非常强大的功能,可以轻松实现对数据的聚合操作,为我们提供了地铁数据的多维度视角。
  3. 通过简单的统计和分组,我们能够快速获取到每个城市地铁站的数量和每条线路的站点数量等关键信息,为后续的深入分析打下基础。

6 完整代码以及结果展示

import requests
import json
import pandas as pd
import requests
import pandas as pd
def get_metro_data(cityid,cityname):
    url ='http://map.amap.com/service/subway?1469083453978&srhdata='+cityid+'_drw_'+cityname+'.json'
    response = requests.get(url)
    html = response.text
    hjson = json.loads(html)
    
    city = hjson['s'][:-2]      #城市名称
    cityid = hjson['i']         #城市编码
    ln = []                     #线路名称
    ls = []                     #线路编码
    station = []                #站点名称
    sid = []                    #站点编码
    lon = []                    #经度
    lat = []                    #纬度
    poiid = []                  #POI编码
    sp = []                     #站点拼音
    for i in range(len(hjson['l'])):
        for j in range(len(hjson['l'][i]['st'])):
            ln.append(hjson['l'][i]['kn'])
            ls.append(hjson['l'][i]['ls'])
            station.append(hjson['l'][i]['st'][j]['n'])
            sid.append(hjson['l'][i]['st'][j]['sid'])
            lon.append(float(hjson['l'][i]['st'][j]['sl'].split(',')[0]))
            lat.append(float(hjson['l'][i]['st'][j]['sl'].split(',')[1]))
            poiid.append(hjson['l'][i]['st'][j]['poiid'])
            sp.append(hjson['l'][i]['st'][j]['sp'])
    
    dict = {'城市名称':city,
            '城市编码':cityid,
            '线路名称':ln,
            '线路编码':ls,
            '站点名称':station,
            '站点编码':sid,
            '经度':lon,
            '纬度':lat,
            'POI编码':poiid,
            '拼音':sp
            }
    df = pd.DataFrame(dict)
    df.to_excel(city + '地铁站数据.xls',index=False)

    print(city + '地铁数据已获取')

f = open('metro.txt',encoding='utf-8')
cityid = []
cityname = []
for line in f.readlines():
    cityid.append(line.split()[1])
    cityname.append(line.split()[2])

metro.txt下载链接

print(cityname)

在这里插入图片描述

for i in range(len(cityid)):
    get_metro_data(cityid[i],cityname[i])

在这里插入图片描述

df = pd.read_excel('上海市地铁站数据.xls')
df

在这里插入图片描述

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 步骤1: 加载数据
# 假设'上海市地铁站数据.xls'已经被替换为实际的文件路径
df = pd.read_excel('上海市地铁站数据.xls')

# 步骤2: 数据清洗
# 检查数据中的缺失值
print(df.isnull().sum())
# 根据需要进行缺失值处理,这里假设简单地去除包含缺失值的行
df.dropna(inplace=True)

# 步骤3: 数据分析
# 例如,计算每条线路的站点数量
stations_per_line = df.groupby('线路名称')['站点名称'].nunique().sort_values(ascending=False)

# 步骤4: 数据可视化
# 配置Matplotlib以支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用于正常显示负号

plt.figure(figsize=(10, 8))
stations_per_line.plot(kind='bar')
plt.title('各线路站点数量')
plt.xlabel('线路名称')
plt.ylabel('站点数量')
plt.xticks(rotation=45)  # 旋转X轴标签,以便更好地展示长名称
plt.tight_layout()
plt.show()

在这里插入图片描述

7 小分享

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/536588.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5G-A有何能耐?5G-A三载波聚合技术介绍

2024年被称作5G-A元年。5G-A作为5G下一阶段的演进技术,到底有何能耐呢? 三载波聚合(3CC)被认为是首个大规模商用的5G-A技术,将带来手机网速的大幅提升。 █ 什么是3CC 3CC,全称叫3 Component Carriers…

前端js基础知识(八股文大全)

一、js的数据类型 值类型(基本类型):数字(Number)、字符串(String)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol,大数值类型(BigInt) 引用数据类型:对象(Object)、数组…

HNUST湖南科技大学嵌入式开发板使用-2024

目录 1.需要准备的软件(版本必须相同)꒰ঌ( ⌯ ⌯)໒꒱ 2.下载链接地址⌯▾⌯ 3.软件安装教程 4.安装好了,正常情况会是什么样子呢?(๑•̌.•๑) 4.1.拆入第一个接口(串口com接口是用来上传代码的ฅ˙Ⱉ˙ฅ) 4.2.拆入第三个接口(SWD Jlink口…

android android.permission.MANAGE_EXTERNAL_STORAGE使用

android11 及以上版本&#xff0c;如果release版本要读取外部存储公共目录&#xff0c;即sdcard公共目录&#xff0c;需要在androidManifest.xml下申明 <uses-permission android:name"android.permission.MANAGE_EXTERNAL_STORAGE" /> 如果要发版到海外&…

数据资产与数据要素的重要性及数据资产入表的实践指南

## 引言在当今快速发展的数字化时代&#xff0c;数据资产已经成为企业最宝贵的资源之一。数据资产不仅对企业的运营决策有着至关重要的影响&#xff0c;而且在企业的财务健康和市场竞争力方面扮演着核心角色。数据要素&#xff0c;作为构成数据资产的基本单元&#xff0c;其管理…

Centos Docker Oracle11g 密码过期修改

症状&#xff1a; Centos Oracle11g环境变量配置 如果没有配置环境变量&#xff0c;需要先配置Oracle环境变量&#xff0c;否则执行sqlplus时会提示&#xff1a;SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory 配置方法&#xff1a; 第一步&a…

C++ 2024-4-2 作业

1.模板类实现顺序栈 #include <iostream> #define MAX 8 using namespace std; template<typename T> class stack {T data[MAX];int top; public:stack():top(-1){}bool empty_stack();bool full_stack();void push_stack(T data);void pop_stack();void show();…

定长子串中元音的最大数目

题目链接 定长子串中元音的最大数目 题目描述 注意点 s 由小写英文字母组成返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数1 < k < s.length 解答思路 根据滑动窗口的思想&#xff0c;维持一个大小为k的窗口&#xff0c;每次移动窗口时整体向右…

【ROS2笔记三】构建ROS2功能包

3.构建ROS2功能包 文章目录 3.构建ROS2功能包3.1ROS2中包的组成部分3.2创建ROS2功能包并编写节点3.2.1使用CMake创建功能包3.2.2编写cpp节点代码 3.3编译运行节点3.4使用面向对象的方式编写ROS2节点3.5使用RCLPY编写节点Reference 3.1ROS2中包的组成部分 ROS2可以使用CMake或者…

用于显著提高检索速度和降低成本的二进制和标量嵌入量化

我们引入了嵌入量化的概念&#xff0c;并展示了它们对检索速度、内存使用、磁盘空间和成本的影响。我们将讨论理论上和实践中如何对嵌入进行量化&#xff0c;然后介绍一个 演示&#xff0c;展示了 4100 万维基百科文本的真实检索场景。 演示地址https://hf.co/spaces/sentence-…

C语言——贪吃蛇小游戏

目录 前言 一、贪吃蛇游戏 1.1 游戏背景 1.2 游戏功能 1.3 技术要点 二、Win32 API 2.1 控制台程序 2.2 控制台屏幕上的坐标COORD 2.3 GetStdHandle 2.4 GetConsoleCursorInfo 2.4 CONSOLE_CURSOR_INFO 2.5 SetConsoleCursorInfo 2.6 SetConsoleCursorPosition …

第十届蓝桥杯省赛真题(C/C++大学B组)

试题 A: 组队 答案&#xff1a;490 试题 B: 年号字串 #include <bits/stdc.h> using namespace std;int main() {//26进制数 int n;cin>>n;string s "111";for(int i s.length() - 1;i >0;i--){s[i] A - 1 n % 26;n / 26;}cout<<s<<…

交换机与路由器缓冲区:寻找完美大小

*本文系SDNLAB编译自瞻博网络技术专家兼高级工程总监Sharada Yeluri领英 在路由器和交换机中&#xff0c;缓冲区至关重要&#xff0c;可以防止网络拥塞期间的数据丢失。缓冲区到底要多大&#xff1f;这个问题在学术界和工业界一直备受争议。本文探讨了高端路由器中数据包缓冲的…

Matlab 实时读取串口并绘图

Matlab 实时读取串口并绘图 Vofa Vofa 是一个很好的跨平台上位机软件&#xff0c;但是它无法保存数据&#xff0c;而且作者也并没有要继续更新的意思&#xff0c;保存数据功能应该是遥遥无期了。因此本文使用 Matlab 实时读取串口数据&#xff0c;并使用 plot 函数绘制。 vo…

性能分析-nginx(tomcat、nginx【配置】、负载均衡)

tomcat 像kyj项目请求直接对接 tomcat&#xff0c;tomcat的连接池就会直接影响“并发用户数” 如果这种情况下做性能测试的时候&#xff0c;并发用户数不能满足要求&#xff0c;可以适当加大线程池的配置。 如&#xff1a;项目性能测试发现项目所在机器&#xff0c;资源利用率…

hexo接入github Discussions评论系统

评论存储仓 可以是你的博客项目的(github)仓库&#xff0c;也可以单独新建一个评论存储仓库。 我的博客项目在gitee上&#xff0c;就以新建存储仓为例&#xff1a; 使用Discussions评论系统必须开通Discussions模块&#xff01; 安装giscus插件 https://github.com/apps/…

书客、月影、欧普护眼大路灯哪款好?三款落地灯真实对比测评

作为在照明电器领域资深的评测员&#xff0c;我对市面上各种新颖的照明家电有着深入的探索和研究。大路灯能够提供舒适健康的照明光线&#xff0c;目前正受到许多用眼人群的广泛欢迎。&#xff0c;当然随着大路灯的普及&#xff0c;市场中也充斥着一些低劣的大路灯产品&#xf…

中国平安金融壹账通交付管理中心总经理崔羽先生受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 中国平安金融壹账通交付管理中心总经理崔羽先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“项目管理成与败&#xff0c;人才是第一要素”。大会将于5月25-26日在北京举办&#xff0c;敬请关注&#xff01; 议题简要…

消息队列之-----------------zookeeper机制

目录 一、ZooKeeper是什么 二、ZooKeeper的工作机制 三、ZooKeeper特点 四、ZooKeeper数据结构 五、ZooKeeper应用场景 5.1统一命名服务 5.2统一配置管理 5.3统一集群管理 5.4服务器动态上下线 5.5软负载均衡 六、ZooKeeper的选举机制 6.1第一次启动选举机制 6.2非…

Java中的TCP通信

TCP通信 TCP通信Socket客户端ServerSocket服务端 例子&#xff1a;一发一收例子&#xff1a;多发多收异常捕获 例子&#xff1a;服务器与多个客户端同时通信多客户端通信架构服务端代码ServerReaderThread 服务端读数据线程 TCP通信 特点&#xff1a;面向连接、可靠通信 通信双…