跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python大前端

Python 自动化抢票脚本实战:基于 Selenium 的 12306 购票流程

基于 Selenium 自动化框架构建 12306 抢票脚本,涵盖环境搭建、车站编码获取、手动登录验证、余票轮询监控、订单自动提交及邮件通知功能。代码示例展示了核心类结构与关键交互逻辑,同时强调了反爬机制应对策略与法律合规性,旨在提供一套完整的 Python 网页自动化实践方案。

信号故障发布于 2025/2/6更新于 2026/9/463 浏览
Python 自动化抢票脚本实战:基于 Selenium 的 12306 购票流程

Python 自动化抢票脚本实战:基于 Selenium 的 12306 购票流程

前言

在春运等高峰期,手动抢票往往面临页面拥堵、验证码复杂等问题。利用 Python 结合 Selenium 自动化框架,可以模拟人工操作,提高查询和提交订单的效率。本文将详细介绍如何构建一个基于 Selenium 的 12306 抢票脚本,涵盖环境搭建、登录处理、余票监控及订单提交等核心环节。

环境准备

1. 依赖安装

确保已安装 Python 3.6+ 版本。需要安装以下库:

pip install selenium webdriver-manager

webdriver-manager 用于自动管理 ChromeDriver 版本,避免手动下载驱动文件的麻烦。

2. 浏览器配置

推荐使用 Google Chrome 浏览器。需确保浏览器版本与下载的 ChromeDriver 版本匹配。

核心逻辑实现

1. 车站编码获取

12306 系统使用特定的城市编码(如 %u6DF1%u5733%2CSZQ)。若需添加新城市,可打开 12306 官网查票页面,通过浏览器开发者工具查看网络请求中的参数。

2. 登录机制

出于安全考虑,12306 强制要求扫码或账号密码登录。脚本启动后需暂停等待用户手动完成登录验证,随后保存 Session 供后续请求复用。

3. 余票监控

通过定时轮询指定车次和日期的接口,解析页面元素判断余票状态。当检测到目标席别有余票时,触发预订流程。

4. 订单提交

自动填充乘车人信息,选择席别,并提交订单。此过程需处理可能的验证码或滑块验证。

5. 邮件通知

集成 SMTP 服务,在抢票成功后发送通知邮件,防止错过支付时间。

代码实现

以下是整合后的核心类结构示例:

import time
import smtplib
from email.mime.text import MIMEText
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

class TrainTicketBot:
    def __init__(self):
        # 初始化浏览器
        self.driver = webdriver.Chrome(ChromeDriverManager().install())
        self.wait = WebDriverWait(self.driver, 10)
        
        # 配置信息
        self.passengers = ['张三', '李四']
        self.from_station = '%u5E7F%u5DDE%2CGZQ'  # 广州
        self.to_station = '%u90D1%u5DDE%2CZZF'    # 郑州
        self.train_numbers = ['Z90', 'Z190']
        self.seat_type = '硬卧'
        self.email_receiver = '[email protected]'
        
        self.login_url = 'https://kyfw.12306.cn/otn/login/init'
        self.init_my_url = 'https://kyfw.12306.cn/otn/index/initMy12306'

    def do_login(self):
        """手动登录并等待 Session 建立"""
        print('请扫码登陆或者账号登陆……')
        self.driver.get(self.login_url)
        while True:
            if self.init_my_url in self.driver.current_url:
                break
            time.sleep(1)
        print('登录成功')

    def check_ticket(self):
        """检查余票"""
        # 此处省略具体 URL 构造细节,实际需根据 12306 接口文档调整
        # 模拟查找表格行
        try:
            # 注意:12306 页面结构频繁变动,XPath 需根据实际情况调整
            rows = self.driver.find_elements(By.XPATH, '//tr[@datatran]')
            for row in rows:
                # 简单逻辑演示
                pass
        except Exception as e:
            print(f'查询出错:{e}')

    def submit_order(self):
        """提交订单"""
        print('开始尝试预订……')
        # 模拟点击预订按钮
        # self.driver.find_element(By.CSS_SELECTOR, 'td.no-br>a').click()
        # 选择乘客
        # 选择席别
        # 提交订单
        print('订单提交中...')

    def send_mail(self, receiver_address, content):
        """发送邮件通知"""
        host = 'smtp.163.com'
        port = 25
        sender = '[email protected]'
        pwd = 'your_auth_code'
        receiver = receiver_address
        
        body = f'<h3>温馨提醒</h3><p>{content}</p>'
        msg = MIMEText(body, 'html', _charset="utf-8")
        msg['subject'] = '抢票成功通知!'
        msg['from'] = sender
        msg['to'] = receiver
        
        s = smtplib.SMTP(host, port)
        s.login(sender, pwd)
        s.sendmail(sender, receiver, msg.as_string())
        s.quit()

    def run(self):
        self.do_login()
        # 主循环逻辑
        while True:
            self.check_ticket()
            # 这里应加入具体的余票判断逻辑
            time.sleep(5)

if __name__ == '__main__':
    bot = TrainTicketBot()
    bot.run()

注意事项与法律风险

  1. 反爬机制:12306 拥有较强的反爬虫策略,包括 IP 限制、验证码识别等。高频请求可能导致 IP 被封禁。建议设置合理的轮询间隔(如 5-10 秒)。
  2. 验证码处理:登录或下单时可能弹出图形验证码,目前自动化脚本通常需人工介入处理。
  3. 合规性:本脚本仅供学习 Python 自动化技术使用。请勿用于恶意攻击服务器或破坏正常购票秩序。遵守相关法律法规。

总结

通过 Selenium 模拟浏览器操作,可以实现基础的 12306 购票辅助功能。相比纯 API 调用,这种方式更稳定且易于调试。但需注意网站更新带来的兼容性维护成本。在实际应用中,建议结合多线程或分布式部署以提高效率。

目录

  1. Python 自动化抢票脚本实战:基于 Selenium 的 12306 购票流程
  2. 前言
  3. 环境准备
  4. 1. 依赖安装
  5. 2. 浏览器配置
  6. 核心逻辑实现
  7. 1. 车站编码获取
  8. 2. 登录机制
  9. 3. 余票监控
  10. 4. 订单提交
  11. 5. 邮件通知
  12. 代码实现
  13. 注意事项与法律风险
  14. 总结

更多推荐文章

查看全部
  • UniApp + Dify 实战:详解 SSE 流式响应的解析与前端渲染
  • OpenClaw 2026.3.7 更新:支持 GPT-5.4 与记忆热插拔架构
  • CKS 核心命令速查指南
  • AI 重构开发流程:技术民主化的机遇与挑战
  • OpenClaw 开源 AI 智能体平台完整介绍与教程概览
  • C++ 实现 NX 二次开发 UI 控件嵌入实战
  • C++ 类与对象详解:封装、this 指针与默认成员函数
  • Mac Big Sur 使用 Docker 运行 OpenCode 实现 AI 自动化开发
  • 使用 DeepSeek API 构建贪吃蛇游戏全流程解析
  • Windows 本地部署 OpenClaw 集成 DeepSeek 与飞书实现 AI 控制
  • 基于 FastAPI 自动构建 SSE MCP 服务器
  • Ubuntu 下 Python 连接金仓 KingbaseES 数据库实现增删改查
  • Python 全栈开发:FastAPI 高性能后端开发
  • Spring 加载 XML 配置文件的六种常用方式
  • LangChain PyPDFLoader 实战:PDF 加载、分块与图片 OCR 提取
  • Python 内置函数:enumerate()、eval()和 exec()
  • 千笔 AI 辅助论文写作工具功能解析
  • OpenGL 图形渲染基础与开发环境搭建指南
  • 金融 NLP 实战:从文本分析到风险评估应用开发
  • Mac 安装 OpenClaw 并配置飞书云文档

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online