Python实战:从12306官网获取全国火车票代售点信息,并通过Pyecharts可视化。

本文主要是介绍Python实战:从12306官网获取全国火车票代售点信息,并通过Pyecharts可视化。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python实战:从12306官网获取全国火车票代售点信息,并通过Pyecharts画出柱状图、折线图、饼图、漏斗图,分析各省火车票代售点数量分布。

通过本文,可以获取12306对于全国省的编码,获取全国 3253 个火车票代售点信息,通过Pyecharts可视化分析,画出柱状图、折线图、饼图、漏斗图。

分析网页

打开 12306 官网,https://www.12306.cn/,点击“信息查询”下面的“代售点”。

键盘 F12 快捷键,或者鼠标右击“检查”打开浏览器的检查页面,刷新网页,在检查页面可以看到allProvince这个请求。(本文首发在“程序员coding”公众号)

allProvince请求 response 的 data 值就是全国的省。

获取全国的省名称:

编写 Python 代码主要用到的库是 requests 和 pandas,首先 requests 库发送请求,获取 response,转换为 json 格式。然后用 pandas 库的 json_normalize 函数将 json 数据展平。最后用 pandas 库将数据保存到 excel 表格内。

完整代码如下:

import requests
import pandas as pd
import time
from datetime import datetimeurl = "https://kyfw.12306.cn/otn/userCommon/allProvince"headers = {"Cookie": "Cookie","User-Agent": "User-Agent"
}content_json = requests.get(url=url, headers=headers).json()
print("等待3s")
time.sleep(3)  # 防止被检测(不要低于3)
print(content_json)  # 用于观察
# df = pd.DataFrame(content_json['data'])
content_list = pd.json_normalize(content_json['data'], errors='ignore')if __name__ == '__main__':# 当前时间作为文件名后缀curr_time = datetime.now()timestamp = datetime.strftime(curr_time, '%Y-%m-%d %H-%M-%S')# time = time.time()  # 时间# 将 DataFrame 保存为 excel 文件content_list.to_excel(f"全国火车票代售点的省-{timestamp}.xlsx", index=False)print("保存完成!")# 查看 DataFrame 的行数和列数。rows = content_list.shapeprint("请求得到的表格行数与列数:", rows)

生成的 excel 表如下:(本文首发在“程序员coding”公众号)

获取全国火车票代售点

在“所在地区”的输入框内任意选择一个省份。

在检查页面可以看到query?province这个请求。

query?province请求 response 的 data 值就是这个省的全部代售点信息。

获取全国火车票代售点

接下来就可以构建代码,使用 pandas 读取全国的省 excel 表,用表中的省这一列执行 apply 函数,获取全国火车票代售点:

完整代码如下:

`import requests
import pandas as pd
import time
from datetime import datetime
from tqdm import tqdmcontent_list = []def ticket_sale_agency(province):url = "https://kyfw.12306.cn/otn/queryAgencySellTicket/query"headers = {"Cookie": "Cookie","User-Agent": "User-Agent"}data = {"province": province,"city": "","county": "",}content_json = requests.get(url=url, headers=headers, params=data).json()print("等待3s")time.sleep(3)  # 防止被检测(不要低于3)print(content_json)  # 用于观察# df = pd.DataFrame(content_json['data'])df = pd.json_normalize(content_json['data']['datas'], errors='ignore')content_list.append(df)if __name__ == '__main__':df = pd.read_excel("./全国火车票代售点的省-2023-12-29 18-12-23.xlsx")tqdm.pandas(desc='获取全国火车票代售点进度条', unit="请求")  # tqdm显示进度条df.progress_apply(lambda x: ticket_sale_agency(x['chineseName']), axis=1)# 调用函数,批量获取地址经纬度,使用tqdm时,将pandas中apply操作替换为progress_apply,并且每个单独的progress_apply前要先执行tqdm.pandas()# concat合并Pandas数据df = pd.concat(content_list)# 将 DataFrame 保存为 excel 文件# 当前时间作为文件名后缀curr_time = datetime.now()timestamp = datetime.strftime(curr_time, '%Y-%m-%d %H-%M-%S')# time = time.time()  # 时间df.to_excel(f"全国火车票代售点-{timestamp}.xlsx", index=False)print("保存完成!")# 查看 DataFrame 的行数和列数。rows = df.shapeprint("请求得到的表格行数与列数:", rows)

pycharm 控制台输出如下,成果获取全国 3253 个火车票代售点信息,全部字段如下:bureau_code、station_telecode、belong_station、province、city_code、city、county、windows_quantity、agency_name、address、addressencode、phone_no、start_time_am、stop_time_am、start_time_pm、stop_time_pm

生成的 excel 表如下:

可视化

Python 常用的可视化库主要包括 Matplotlib、Seaborn、Pyecharts 等,其中 Pyecharts 是我国开发人员开发的,相比较 Matplotlib、Seaborn 等可视化库,Pyecharts 十分符合国内用户的使用习惯,生成的图的可视化效果非常好,其凭借良好的交互性,精巧的图表设计,得到了众多开发者的认可。

接下来,我将通过 Pyecharts 库实现统计各省火车票代售点数量,画出柱状图、折线图、饼图、漏斗图。

在这个过程中,强烈推荐看一下官方文档快速入门案例,理解 Pyecharts 的“链式调用”和 “一切皆 Options 配置”这两个思想。

柱状图

import numpy as np
import pandas as pd
from collections import Counter
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType# 导入excel数据
df = pd.read_excel("全国火车票代售点-2023-12-29 18-24-34.xlsx")# 统计频率,并降序排序,freq数据类型是Series
freq = df["province"].value_counts().sort_values(ascending=True)# 生成柱状图
bar = (# 创建柱状图对象Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT,width='1000px', height='600px',page_title="各省火车票代售点数量"))# 设置 x 轴数据.add_xaxis(province_list)  # freq的index索引转为列表# 设置 y 轴数据.add_yaxis("各省火车票代售点数量", count_list, label_opts=opts.LabelOpts(position="top"))  # freq的值转为列表# # 翻转 x 轴 / y 轴# .reversal_axis()# 使用 options 配置项.set_global_opts(title_opts=opts.TitleOpts(title="火车票代售点数量", subtitle="按省统计"),xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 45})))
# 生成柱状图
bar.render("各省火车票代售点数量-柱状图.html")

翻转 x 轴 / y 轴后,柱状图显示效果如下:(本文首发在“程序员coding”公众号)

折线图

from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType
# 折线图
line = (Line().add_xaxis(xaxis_data=province_list).add_yaxis(series_name="折线图",y_axis=count_list,symbol="emptyCircle",is_symbol_show=True,label_opts=opts.LabelOpts(is_show=True),).set_global_opts(tooltip_opts=opts.TooltipOpts(is_show=False),xaxis_opts=opts.AxisOpts(type_="category", name_rotate=60, axislabel_opts={"rotate": 45}),yaxis_opts=opts.AxisOpts(type_="value",axistick_opts=opts.AxisTickOpts(is_show=True),splitline_opts=opts.SplitLineOpts(is_show=True),),)
)
line.render("各省火车票代售点数量-折线图.html")

饼图

from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType
# 饼图
pie = (# 初始化配置项,参考 `global_options.InitOpts`Pie().add(series_name="各省火车票代售点数量",  # 系列名称data_pair=data_pair_temp,  # 馈入数据radius="35%",  # 饼图半径比例center=["50%", "50%"],  # 饼图中心坐标label_opts=opts.LabelOpts(is_show=False, position="center"),  # 标签位置).set_global_opts(title_opts=opts.TitleOpts(title="各省火车票代售点数量", pos_left="center"),legend_opts=opts.LegendOpts(is_show=True, pos_left="right", orient="vertical")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c} {d}%"))  # {d}%为百分比)
pie.render("各省火车票代售点数量-饼图.html")

漏斗图

from pyecharts.charts import Funnel
from pyecharts import options as opts
from pyecharts.globals import ThemeType
`# 漏斗图
funnel = (Funnel(init_opts=opts.InitOpts(theme=ThemeType.LIGHT,width='1000px', height='600px',page_title="各省火车票代售点数量")).add("各省", [list(data) for data in zip(province_list, count_list)]).set_global_opts(title_opts=opts.TitleOpts(title="火车票代售点数量", subtitle="按省统计", pos_left="center"),legend_opts=opts.LegendOpts(is_show=False, pos_left="right", orient="vertical")))
funnel.render("各省火车票代售点数量-漏斗图.html")

这篇关于Python实战:从12306官网获取全国火车票代售点信息,并通过Pyecharts可视化。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845288

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提