python爬虫:从12306网站获取火车站信息
代码逻辑
- 初始化 (init 方法):
- 设置请求头信息。
- 设置车站版本号。
- 同步车站信息 (synchronization 方法):
- 发送GET请求获取车站信息。
- 返回服务器响应的文本。
- 提取信息 (extract 方法):
- 从服务器响应中提取车站信息字符串。
- 去掉字符串末尾的多余字符。
- 处理信息 (process 方法):
- 提取并处理车站信息。
- 打印车站总数。
- 创建一个新的车站字典,只包含所需的字段。
- 调用 save_station 方法保存车站信息。
- 保存车站信息 (save_station 方法):
- 将车站信息保存到本地JSON文件。
- 查找含有关键词的车站 (find_keyword_station 静态方法):
- 从本地文件加载车站信息。
- 根据关键词查找符合条件的车站。
- 查找以指定字符结尾的车站 (find_stations_with_last_char 方法):
- 从本地文件加载车站信息。
- 找出以指定字符结尾的车站名称。
- 调用 save_matching_stations 方法保存结果。
- 保存匹配的车站 (save_matching_stations 方法):
- 将匹配的车站信息保存到本地JSON文件。
- 查找所在城市的车站 (find_stations_in_city 方法):
- 从本地文件加载车站信息。
- 找出所在城市为指定城市的车站。
- 主程序入口 (if name == “main” 块):
- 实例化 Station 类。
- 调用 process 方法处理车站信息。
- 调用 find_stations_with_last_char 方法查找以特定字符结尾的车站。
- 调用 find_keyword_station 方法查找含有关键词的车站。
- 调用 find_stations_in_city 方法查找所在城市的车站。
完整代码
import json
import re
import requests# 定义车站信息的URL
URL_STATION_NAME = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js'class Station:def __init__(self):# 设置请求头self.headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/123.0.0.0 Safari/537.36"}# 获取车站版本号self.version = '1.9320'def synchronization(self):# 发送GET请求获取车站信息response = requests.get(URL_STATION_NAME, headers=self.headers, params={"station_version": self.version})return response.textdef extract(self):# 提取响应中的车站信息response = self.synchronization()response = response.replace("var station_names =", '').strip()return response[:-2] # 去掉末尾的多余字符def process(self):# 处理提取的数据response = self.extract()response = re.findall(r'@(.*?)\|\|\|', response)print(f'共有{len(response)}个车站')response = [i.split("|") for i in response]# 创建一个新的车站字典,只包含所需的字段station_dict = []for item in response:station_info = {"车站名": item[1],"车站代码": item[2],"车站编号": item[5],"所在城市": item[7],"城市编号": item[6]}station_dict.append(station_info)self.save_station(station_dict)return station_dictdef save_station(self, station_dict):# 将车站信息保存到本地文件with open('resource/station_dict.json', 'w', encoding='utf-8') as f:json.dump(station_dict, f, ensure_ascii=False, indent=4)@staticmethoddef find_keyword_station(keyword, _type='station'):# 查找含有keyword的站名with open('resource/station_dict.json', 'rt', encoding='utf-8') as f:station_dict = json.load(f)if _type == 'station':response = [item for item in station_dict if keyword.lower() in item["车站名"].lower()]elif _type == 'code':response = [item for item in station_dict if keyword.lower() in item["车站代码"].lower()]else:response = []return responsedef find_stations_with_last_char(self, char):# 查找所有字典的key里最后一个字是指定字符的站名,并保存结果到JSON文件with open('resource/station_dict.json', 'rt', encoding='utf-8') as f:station_dict = json.load(f)# 使用列表推导式来找到符合要求的站名matching_stations = [item for item in station_dict if item['车站名'].endswith(char)]# 保存结果到JSON文件self.save_matching_stations(matching_stations, char)return matching_stationsdef save_matching_stations(self, matching_stations, char):# 将车站信息保存到本地文件filename = f'resource/stations_with_last_char_{char}.json'with open(filename, 'w', encoding='utf-8') as f:json.dump(matching_stations, f, ensure_ascii=False, indent=4)def find_stations_in_city(self, city_name):# 查找所在城市为指定城市的车站with open('resource/station_dict.json', 'rt', encoding='utf-8') as f:station_dict = json.load(f)# 使用列表推导式来找到符合要求的站名,并排除不需要的字段matching_stations = [{k: v for k, v in item.items() if k not in ['所在城市', '城市编号']}for item in station_dict if city_name.lower() in item['所在城市'].lower()]return matching_stations# 主程序入口
if __name__ == "__main__":station = Station()station.process()result = station.find_stations_with_last_char('东')print(f"找到 {len(result)} 个以 '东' 结尾的站名")result = station.find_stations_with_last_char('西')print(f"找到 {len(result)} 个以 '西' 结尾的站名")result = station.find_stations_with_last_char('南')print(f"找到 {len(result)} 个以 '南' 结尾的站名")result = station.find_stations_with_last_char('北')print(f"找到 {len(result)} 个以 '北' 结尾的站名")# 查找含有'湛江'的站名keyword = '湛江'result = station.find_keyword_station(keyword, _type='station')print(result)# 查找所在城市为'湛江'的车站city_name = '湛江'result = station.find_stations_in_city(city_name)print(f"找到 {len(result)} 个位于 '{city_name}' 的车站:")print(result)
运行结果
本文参考了这个项目,在此表示感谢,但由于该项目需要配置flask,笔者对此并不熟悉,于是自己抽取出查询车站的代码并完善了相关功能,不再需要其他配置。
相关文章:

python爬虫:从12306网站获取火车站信息
代码逻辑 初始化 (init 方法): 设置请求头信息。设置车站版本号。 同步车站信息 (synchronization 方法): 发送GET请求获取车站信息。返回服务器响应的文本。 提取信息 (extract 方法): 从服务器响应中提取车站信息字符串。去掉字符串末尾的…...

Android个性名片界面的设计——约束布局的应用
节选自《Android应用开发项目式教程》,机械工业出版社,2024年7月出版 做最简单的安卓入门教程,手把手视频、代码、答疑全配齐 【任务目标】 使用约束布局、TextView控件实现一个个性名片界面的设计,界面如图1所示。 图1 个性名片…...

Python 课程18-SQLAlchemy
前言 SQLAlchemy 是一个功能强大的 Python SQL 工具包和对象关系映射(ORM)库,它使得开发者能够通过 Python 代码与数据库进行交互,而不必编写 SQL 查询。SQLAlchemy 提供了对多种数据库的支持,包括 MySQL、PostgreSQL…...

Module did not self-register: ‘drivelist.node‘报错解决
报错如下: node_modules/bindings/bindings.js:121throw e;^Error: Module did not self-register: xxxx/node_modules/drivelist/build/Release/drivelist.node.at process.func [as dlopen] (electron/js2c/asar.js:140:31)at Object.Module._extensions..node (…...

zabbix基本概念与组件
文章目录 一、zabbix简介二、zabbix构成三、zabbix监控对象四、zabbix常用术语五、 Zabbix 6.0 新特性1.Zabbix server高可用防止硬件故障或计划维护期的停机2.Kubernetes系统从多个维度采集指标 六、zabbix 工作原理1、主动模式2、…...

Linux常用网络工具及示例
Linux系统中有许多用于网络管理、监控和故障排除的工具。以下是一些常用的网络工具及其基本用法示例: 1. ping - 测试主机之间的网络连接。 ping www.google.com 2. netstat - 显示网络连接、路由表、接口统计等信息。 netstat -an # 显示所有网络连接和监听…...

Go容器化微服务系统实战
1-1 本课的go微服务有什么不同? 聚焦于容器化可观测的购物微服务系统实战,通过介绍Go语言的应用趋势、容器化优势及微服务适用性,旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术&#…...

研究生三年概括
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、研一1.上学期2. 下学期 二、研二1.研二上2.研二下 三、研三1.研三上2.研三下 前言 不知道是谁说的了,人生的路很长,关键的就那么几…...

MongoDB在Linux系统中的安装与配置指南
在这篇文章中,我们将介绍如何在CentOS 7服务器上安装MongoDB,并通过DataX将数据从MongoDB迁移到MySQL数据库。这将包括MongoDB的安装、配置、数据准备以及使用DataX进行数据迁移的详细步骤。 MongoDB简介 MongoDB是一个高性能、开源、无模式的文档型数据…...

Linux下如何实现不用加路径调用启动脚本
配置Systemctl启动 Linux下便于启停服务,可以配置systemcl,配置如下描述 说明 只有root用户可配置,文件路径为 /etc/systemd/system/XXX.service,本文将用nginx.service举例说明 1、创建文件 首先创建一个nginx.service文件,用于配置ngi…...

编程练习2 数据单元的变量替换
示例1: 1,2<A>00 示例2: 1,2<A>00,3<A>00 示例3: <B>12,1,2<B>1 示例4: <B<12,1 输出依次如下: #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…...

mysql的查询操作
MySQL的查询操作是数据库管理和数据检索的核心。通过SQL(Structured Query Language,结构化查询语言)语句,用户可以执行包括数据检索、数据插入、更新和删除在内的多种操作。在本文中,我们将重点讨论数据检索ÿ…...

0基础学前端 day2
大家好,欢迎来到无限大的频道。 今天继续带领大家开始0基础学前端。 一、CSS简介与基础 层叠样式表(CSS,Cascading Style Sheets)是用来进行网页样式和布局设计的语言。通过CSS,开发者可以控制网页中元素的颜色、字体…...

Invalid Executable The executable contains bitcode
Invalid Executable The executable contains bitcode xcode世界xcode16后,打包上传testflight时三方库报错:Invalid Executable - The executable ***.app/Frameworks/xxx.framework/xxx contains bitcode. 解决方案: 执行一下指令删除该f…...

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
一、引言 有很多工具可以分析FLV格式,这里推荐flvAnalyser。其支持: 1.FLV 文件分析(Tag 列表、时间戳、码率、音视频同步等),HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01); 2.RTMP/HTT…...

Java服务端开发中的网络安全:防护DDoS与数据泄露的策略
Java服务端开发中的网络安全:防护DDoS与数据泄露的策略 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java服务端开发中,网络安全是我们必须重点关注的领域,…...

CodeMeter 8.20AxProtector 11.50版本更新
CodeMeter是一款强大的软件保护和许可管理工具,此次8.20版本更新引入了多个重要的新功能和优化,进一步提升了不同平台上的兼容性与使用体验。本次更新扩展了对CmCloudContainer的支持,优化了Python、Rust等语言的加密能力,并修复了…...

C语言在嵌入式系统中的应用有哪些?
C语言在嵌入式系统中的应用非常广泛,这主要得益于其高效的运行速度、优秀的代码优化能力以及丰富的函数库。以下是C语言在嵌入式系统应用中的几个关键方面: 1. 硬件直接访问能力 底层硬件操作:C语言提供了直接访问底层硬件的机制࿰…...

Android 系统WIFI AP模式
在 Android 系统中,AP 模式(Access Point Mode,热点模式)允许设备作为 Wi-Fi 热点,其他设备可以通过连接这个热点进行互联网访问或局域网通信。要让 Android 设备工作在 AP 模式,你可以通过应用层的 API 控…...

java jdk8内存序列化为xml
在Java JDK 8中,将对象内存序列化为XML格式,可以使用JAXB(Java Architecture for XML Binding),它是JDK 8的一部分,并且被广泛用于Java对象与XML之间的转换。以下是一个使用JAXB在JDK 8中将Java对象序列化为…...

脚本注入网页:XSS
跨站脚本攻击(Cross-Site Scripting,简称 XSS)是一种常见的网络安全漏洞。它是指攻击者在网页中注入恶意脚本代码,当用户访问该网页时,恶意脚本会在用户的浏览器中执行,从而导致一系列安全问题。这些问题可…...

Python将ONNX转为Json脚本
Python脚本 import onnx from onnx.shape_inference import infer_shapes import numpy as npfrom google.protobuf.json_format import MessageToJson, Parse import argparse import osdef convertToJson(onnx_model_path):onnx_model = onnx.load(onnx_model_path)message …...

医学数据分析实训 项目九 糖尿病风险预测
文章目录 综合实践二 糖尿病遗传风险预测一、分析目标二、实现步骤三、数据准备四、特征工程五、模型构建六、性能度量七、提交要求 综合实践任务二 糖尿病遗传风险预测代码(一)数据准备(二)特征工程(三)模…...

C语言-文件操作-一些我想到的、见到的奇怪的问题
博客主页:【夜泉_ly】 本文专栏:【C语言】 欢迎点赞👍收藏⭐关注❤️ C语言-文件操作-一些我想到的、见到的奇怪的问题 前言1.在不关闭文件的情况下,连续多次调用 fopen() 打开同一个文件,会发生什么?1.1过…...

变电站设备检测系统源码分享
变电站设备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…...

电机foc线上课程开课啦
凌鸥学园电机控制学习盛宴,诚邀您的加入 🎓免费学习,荣誉加冕 凌鸥学园提供免费的电机控制课程,从基础到专业,全程无负担。 📚全面课程体系,灵活学习模式 凌鸥学园提供从基础到专业的全面课程…...

解决Mac 默认设置 wps不能双面打印的问题
目录 问题描述: 问题解决: 问题描述: 使用mac电脑的时候,发现wps找不到双面打印的按钮,导致使用wps打开的所有文件都不能自动双面打印 问题解决: mac的wps也是有双面打印的选项,只是默认被关…...

智谱清影 - CogVideoX-2b-部署与使用
🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 体验地址:[丹摩DAMODEL官网](https://www.damodel.com/console/overview) CogVideoX 简介本篇将详细介绍使用丹摩服务器部…...

python queue.Queue介绍
queue.Queue 是 Python 中的线程安全队列,适合用于多线程或多进程环境中进行任务和数据的共享。queue.Queue 提供了 FIFO(先进先出)队列的实现,并包含线程锁机制以保证在多线程环境下数据的安全性。 queue.Queue 的主要方法&…...

Qt 每日面试题 -3
21、static和const的使用 static : 静态变量声明,分为局部静态变量,全局静态变量,类静态成员变量。也可修饰类成员函数。 有以下几类∶ 局部静态变量 : 存储在静态存储区,程序运行期间只被初始化一次,作用域仍然为局部…...