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,笔者对此并不熟悉,于是自己抽取出查询车站的代码并完善了相关功能,不再需要其他配置。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV图像分割(1)图像分割函数grabCut()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 运行 GrabCut 算法。 该函数实现了 GrabCut 图像分割算法 OpenCV 中的 grabCut() 函数是一种用于图像分割的技术,它可以帮助用户从图…

stable diffusion这个插件牛,高清【图片换脸】,高清【视频换脸】 一键完成!

前言 最近发现一个很不错的sdwebui的插件,不仅能完成图片换脸,还能进行视频换脸,而且效果比之前的 faceid和reactor要好很多,更像更高清,哈哈,废话不多说,直接上干货~插件是 easyPhoto&#xff…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月24日,星期二

每天一分钟,知晓天下事! 2024年9月24日 星期二 农历八月廿二 1、 外卖新规征求意见:规范外卖满减、起送费等机制,剑指餐饮浪费。 2、 发改委:预计全年将实现200万辆低排放标准乘用车退出。 3、 商务部:中…

高通平台Android源码下载

1)、打开:Android releases | CodeLinaro Wiki,选择相应的硬件版本Android系统 2)、repo 源码 repo init --depth1 -u https://git.codelinaro.org/clo/la/platform/manifest.git -b release -m LA.UM.8.6.2.c31-03300-89xx.0.xm…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代,智算中心作为人工智能和大数据技术的核心支撑设施,正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定,卓振思众动环监控应运而生,成为智算中心管理的重要组成部分…

论文复现| Free-Form Image Inpainting with Gated Convolution

论文地址具有上下文注意的生成图像修复 论文代码:GitHub 01配置环境 根据原文代码中read me中要求,进行环境配置以及包的安装。 Run 安装python3。 安装tensorflow(在1.3.0,1.4.0,1.5.0,1.6.0,1.7.0版本上进行了测试)。 安装tensorflow工具包neuralgym(运行pi…

【零基础入门AI:83%的文本推荐系统都在用的算法 TF-IDF】

什么是推荐系统? 在如今这个信息爆炸的时代,推荐系统是根据用户的信息或者行为,向用户推荐用户可能会感兴趣的内容。其中基于文本的推荐系统,比如搜索引擎,头条、微信这类资讯类应用的搜索功能,就是在一个…

图表示学习中的Transformer:Graphormer的突破

人工智能咨询培训老师叶梓 转载标明出处 在自然语言处理和计算机视觉等领域,Transformer架构已经成为主导选择。然而,在图级别的预测任务中,它的表现并不如主流的图神经网络(GNN)变体。这一现象引发了一个思考&#x…

轻松重置 MySQL 8.0 Root 密码的简便方法!

在Windows环境下安装MySQL数据后,如果忘记了 MySQL 8.0 的 root 密码,不必担心!通过 --skip-grant-tables 和 named-pipe 模式登录后,只需几步简单的 SQL 命令即可重置密码:刷新权限表、修改密码、再刷新权限&#xff…

SpringBoot | Maven快速上手

文章目录 一、Maven1.1 Maven 简介:1.2 Maven 的核心功能:1.2.1 项目构建:1.2.2 依赖管理: 1.3 Maven 仓库:1.3.1 本地仓库:1.3.2 中央仓库:1.3.3 私服: 二、第一个 SpringBoot 程序…

数据处理与统计分析篇-day09-数据透视表与日期时间处理

一. 数据透视表 概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。 所进行的计算与数据跟数据透视表中的排列有关。之所以称为数据透视表,是因为可以动态地改变它们的版面布置&#…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展,水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员,针对取得河道采砂许可证的采砂公司及采砂船,实施在线自动监控,旨在提高监管效率…

OSError: [Errno 16] Device or resource busy: ‘.nfs*‘报错解决办法

目录 1 项目场景&问题描述:2 原因分析:2.1 问题背景: 3 解决方案:3.1 创建存放临时文件的目录3.2 使用该目录3.2.1 设置环境变量 TMPDIR3.2.2 运行时设置(推荐)3.2.3 代码中设置 4 总结 1 项目场景&…

瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法

本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…

CSS05-Emment语法

Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度,Vscode内部已经集成该语法。 作用: 1.快速生成HTML结构语法 2.快速生成CSS样式语法

linux 安装 tomcat9、java环境

一、安装 Java环境 1. 下载文件 https://repo.huaweicloud.com/java/jdk/ 或者网盘:通过网盘分享的文件:jdk-8u192-linux-x64.tar.gz 链接: https://pan.baidu.com/s/1V3pQWzgSLJxdrUdmmKueRA 提取码: qspw 2. 查看Linux系统是否有自带的jdk&#xf…

【TabBar嵌套Navigation案例-产品推荐-CollectionView的layout设置 Objective-C语言】

一、我们接着来做这个产品推荐页面啊 1.我们之前,把这个产品推荐页面做出来了,就是长的丑了点儿,所以呢,我们需要去给它设置一下itemSize啦,等等一些东西, 好,首先呢,在这个里边,我们找到我们的layout这块儿, 然后呢,这个layout里边,我们一个一个来设置, 首先呢…

Excel DATE函数怎么用,DATE函数的使用方法来了

大家好,这里是效率办公指南! 📅 在处理Excel中的日期数据时,我们经常需要创建特定的日期或从多个单元格中合并日期。DATE 函数是Excel中一个非常实用的工具,它可以帮助我们从年、月、日的单独信息中创建一个正确的日期…

Kylinsec操作系统

外网源 发布地址:http://mirrorlist.kylinsec.com.cn:8888/publicrepo/

Git(5):分支合并merge和rebase

git merge 假设有两个分支:master 分支和 feature 分支,现在需要将 feature 分支合并到 master 分支。 git checkout mastergit merge feature在合并分支时,git 提供了不同的合并策略,用于处理不同的合并场景。 Fast-forward 如…