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将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S