python爬虫:从12306网站获取火车站信息

news2024/9/25 16:30:28

代码逻辑

  • 初始化 (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.text

    def 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_dict

    def 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)

    @staticmethod
    def 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 response
    
    def 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_stations

    def 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.coloradmin.cn/o/2164123.html

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

相关文章

钰泰-ETA6027限流开关IC

描述 ETA6027 是一种负载开关,可为可能遇到大电流条件的系统和负载提供全面保护。ETA6027 提供 70mΩ 限流开关,可在 2.1-6V 的输入电压范围内工作。电流限制可通过精密电阻器进行外部编程,范围为 75mA 至 2.2A。开关控制由能够直接与低电压…

国庆节前超市现场运营重点工作

节日期间的营运现场工作,很容易由于工作量突然加大,造成很多细化工作不能很好地具体落实,完善现场工作的诸多细节,对于提升业绩会有很好的效果。其中前台需要以冲业绩的方式来完成,后台需要运用精细化的方式来对待。一…

安卓 shape 的使用

在Android开发中&#xff0c;<shape>元素是一个XML资源&#xff0c;用于定义形状&#xff0c;如矩形、圆形、椭圆形、线条等。这些形状可以用于多种场景&#xff0c;比如作为按钮的背景、视图边框或者列表项的分隔线等。<shape>元素位于drawable资源文件夹&#xf…

移动化社交:Facebook的移动战略解析

在移动互联网时代&#xff0c;社交媒体的使用方式和用户习惯发生了显著变化。作为全球最大的社交网络平台之一&#xff0c;Facebook在移动化战略上进行了深远的布局&#xff0c;以适应这一趋势并保持其在市场中的竞争力。本文将探讨Facebook的移动战略及其背后的影响。 移动优先…

云课五分钟-Arduino wokwi和步进电机实验报告快速撰写

wokwi 程序 #include <AccelStepper.h> // Define a stepper and the pins it will use AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5 // This defines the analog input pin for reading the control voltage // Tested wit…

HarmonyOS鸿蒙开发实战(5.0)自定义安全键盘场景实践

鸿蒙HarmonyOS开发实战往期必看文章&#xff1a;&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发性能实践总结&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发案例实践总结合集&#xff08;持续更新......&#xff09; 一分钟了解”纯血版&…

编译原理3——词法分析

3.1词法分析器的作用 词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将它们组成词素&#xff0c;生成并输出一个词法单元序列&#xff0c;每个词法单元对应于一个词素。 但在这个过程中&#xff0c;词法分析器还要和语法分析器进行交互。交互&…

计算机出现msvcp140.dll丢失的6种解决方法,亲测有效

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。本文将总结6种解决msvcp140.dll丢失的方法&#xff0c;帮助大家轻松解决这个问题。 一&…

1、软件测试的基础概念(1)

文章目录 一、软件测试1、软件测试&#xff08;Software Testing&#xff09;2、缺陷&#xff08;Defeat&#xff09;3、测试用例&#xff08;Test Case&#xff09;4、测试金字塔5、测试策略6、测试左移和测试右移7、质量度量 二、软件的测试分类1、单元测试2、集成测试3、系统…

2024中国新科技100强名单出炉!MIAOYUN荣获“2024云原生领航企业奖”

当前&#xff0c;新一轮科技革命和产业变革加速演进&#xff0c;只有加强颠覆性科技创新&#xff0c;才能占领科技创新的制高点&#xff0c;为发展新质生产力注入强大动能&#xff0c;不断塑造高质量发展竞争优势。近日&#xff0c;2024中国新科技100强金i奖评选名单出炉&#…

Thingsboard规则链:fetch device credentials节点详解

引言 源码剖析 应用场景与案例 结语 ThingsBoard从入门到实战课程&#xff0c;深入透析底层原理&#xff0c;快速搭建自己的IOT平台_哔哩哔哩_bilibiliThingsBoard从入门到实战课程&#xff0c;深入透析底层原理&#xff0c;快速搭建自己的IOT平台共计12条视频&#xff0c;包…

π122M31 双通道数字隔离器,工业控制领域的得力助手

π122M31 双通道数字隔离器 CAN通信隔离兼容ADuM7241ARZ电路简单、稳定性更高&#xff0c;具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 5.0kVrms…

Bugku 渗透测试1

描  述: 甲公司邀请你对他们公司进行网络安全测试&#xff0c;但是甲公司只给了一个官网链接你能打到他们内网吗&#xff1f; 打开靶场地址 1、场景1 查看网站源码&#xff0c;查看最下面&#xff0c;得到flag。 2、场景2 根据场景1提示&#xff0c;下个flag网站管理员才能…

SelMatch:最新数据集蒸馏,仅用5%训练数据也是可以的 | ICML‘24

数据集蒸馏旨在从大型数据集中合成每类&#xff08;IPC&#xff09;少量图像&#xff0c;以在最小性能损失的情况下近似完整数据集训练。尽管在非常小的IPC范围内有效&#xff0c;但随着IPC增加&#xff0c;许多蒸馏方法变得不太有效甚至性能不如随机样本选择。论文对各种IPC范…

windows下tp5创建定时任务

1、创建定时任务&#xff08;自定义命令行可参考官网自定义命令行 ThinkPHP5.0完全开发手册 看云&#xff09; 2、cmd进入项目根目录测试php think 3、新建一个task.bat 文件来运行 d://项目盘符 cd D:\wwwroot\www.xxx.com//项目根目录 php think test //项目接口 4、 Win…

TON生态系统开发指南:从零开始构建你的Web3应用

随着Web3的不断发展&#xff0c;TON&#xff08;The Open Network&#xff09;生态系统逐渐成为备受瞩目的区块链平台。依托其与Telegram的深度整合&#xff0c;TON生态为开发者提供了一个极具潜力的开发环境&#xff0c;特别是在社交、支付和金融这三个核心领域。本文旨在帮助…

嵌入式C语言自我修养:GNU C编译器扩展语法精讲

在Linux内核的源码中&#xff0c;你会发现许多这样的“奇特”代码。它们看起来可能有点陌生&#xff0c;但它们实际上是C语言的一种扩展形式&#xff0c;这种扩展在C语言的标准教材中往往不会提及。这就是为什么你在阅读Linux驱动代码或内核源码时&#xff0c;可能会感到既熟悉…

【操作系统】速成1

速成即可&#xff0c;不问时间&#xff0c;不问过去&#xff0c;只求所得。 始于2024年9月25日04&#xff1a;30 目录 2.1 CPU&#xff0c;指令&#xff0c;64vs32 2.2 磁盘&#xff0c;内存 CPU Cache 参考&#xff1a;xiaolincoding.com 2.1 CPU&#xff0c;指令&#…

深入解析Pandas DataFrame:数据组织策略——宽格式与长格式的应用与转换

在数据科学和数据分析领域&#xff0c;如何组织数据是一个关键步骤。 Pandas DataFrame 作为 Python 中处理和分析数据的强大工具&#xff0c;提供了灵活的数据组织方 式&#xff0c;其中按行展开&#xff08;宽格式&#xff09;和按列展开&#xff08;长格式&#xff09;是最…

uniapp打包自动上传小程序后台

官方文档 ip查看地址 1、下载包&#xff1a; npm install miniprogram-ci --save 2、小程序后台&#xff1a; 3、将生成的密钥放置到项目根目录 4、项目根目录创建autoUpload.js 编写自动上传代码&#xff1a; const ci require(miniprogram-ci) const path require(…