☰
Python+Selenium实现12306自动化抢票系统开发
2026/10/14 15:16:47 网站建设 项目流程

1. 项目背景与需求分析

每到节假日,火车票购票难的问题就会成为社会热点。作为国内最大的铁路票务平台,12306系统在高峰期面临着巨大的访问压力。传统的人工购票方式效率低下,很难在激烈的票源竞争中胜出。这就是为什么我们需要开发一款自动化抢票工具。

这类工具的核心价值在于解决以下几个痛点:

  • 人工刷新页面速度慢,容易错过放票时机
  • 购票流程繁琐,多个步骤需要快速完成
  • 候补订单需要持续监控和及时响应
  • 支付环节有时间限制,容易超时失败

2. 系统架构设计

2.1 整体技术方案

我们采用Python作为主要开发语言,配合Selenium实现浏览器自动化。系统主要包含以下模块:

  1. 登录认证模块
  2. 车票查询模块
  3. 订单提交模块
  4. 支付处理模块
  5. 候补监控模块
  6. 通知提醒模块

2.2 关键技术选型

  • 自动化控制:Selenium WebDriver + Chrome浏览器
  • 定时任务:APScheduler
  • 网络请求:Requests库
  • 验证码识别:第三方OCR服务
  • 数据存储:SQLite轻量级数据库
  • 消息通知:SMTP邮件服务+企业微信API

3. 核心功能实现

3.1 自动登录实现

12306的登录环节有几个关键点需要注意:

  1. 滑块验证码识别
  2. 动态二维码登录
  3. 账号密码登录的加密处理
def login_12306(username, password): driver.get("https://kyfw.12306.cn/otn/resources/login.html") # 切换到账号登录标签 driver.find_element(By.CLASS_NAME, "login-hd-account").click() # 处理滑块验证码 handle_slide_captcha() # 输入账号密码 driver.find_element(By.ID, "J-userName").send_keys(username) driver.find_element(By.ID, "J-password").send_keys(password) # 点击登录按钮 driver.find_element(By.ID, "J-login").click() # 处理可能的短信验证 handle_sms_verify()

3.2 智能查询与抢票

票务查询需要考虑以下几个因素:

  1. 出发/到达站点的编码转换
  2. 乘车日期的格式化处理
  3. 车次类型的筛选条件
  4. 席别优先级的设置
def query_tickets(from_station, to_station, date, train_type=None): # 转换站点名为编码 from_code = station_map[from_station] to_code = station_map[to_station] # 构造查询URL url = f"https://kyfw.12306.cn/otn/leftTicket/query?" \ f"leftTicketDTO.train_date={date}&" \ f"leftTicketDTO.from_station={from_code}&" \ f"leftTicketDTO.to_station={to_code}&" \ f"purpose_codes=ADULT" response = requests.get(url, headers=headers) data = response.json() # 解析车次信息 trains = [] for item in data['data']['result']: train_info = parse_train_info(item) if train_type and train_info['train_type'] != train_type: continue trains.append(train_info) return trains

4. 订单处理与支付

4.1 订单提交流程

订单提交是整个系统中最复杂的环节,需要严格按照以下步骤执行:

  1. 选择乘车人信息
  2. 选择席别
  3. 提交订单请求
  4. 处理排队系统
  5. 获取订单令牌
  6. 确认订单信息

重要提示:每个步骤之间需要有适当的延迟,但又要保证在支付时限内完成全部流程。

4.2 自动支付实现

支付环节需要处理多种情况:

  1. 余额支付
  2. 银行卡支付
  3. 第三方支付(支付宝/微信)
  4. 支付超时处理
def auto_payment(order_id): # 获取订单支付信息 payment_info = get_payment_info(order_id) # 根据配置选择支付方式 if config.payment_method == "balance": pay_with_balance(payment_info) elif config.payment_method == "wechat": pay_with_wechat(payment_info) else: pay_with_alipay(payment_info) # 验证支付结果 if check_payment_status(order_id): send_notification("支付成功", f"订单{order_id}已完成支付") else: send_notification("支付失败", f"订单{order_id}支付失败,请手动处理")

5. 候补订单处理

5.1 候补队列监控

候补功能是12306提供的重要服务,我们的系统需要实现:

  1. 候补订单的自动提交
  2. 候补队列位置的定期检查
  3. 候补成功的自动处理
  4. 候补失败的备选方案
def monitor_alternate(order_id): while True: status = check_alternate_status(order_id) if status == "SUCCESS": handle_alternate_success(order_id) break elif status == "FAILED": handle_alternate_failed(order_id) break else: time.sleep(config.check_interval)

6. 系统优化与注意事项

6.1 性能优化技巧

  1. 请求频率控制:过于频繁的请求会导致IP被封禁,建议设置合理的间隔时间
  2. 多账号轮询:使用多个账号分散请求压力
  3. 代理IP池:准备多个IP地址轮流使用
  4. 本地缓存:缓存车站编码等不常变化的数据

6.2 常见问题处理

  1. 验证码识别失败:

    • 尝试多次识别
    • 切换验证码类型
    • 使用更精准的OCR服务
  2. 登录会话过期:

    • 实现会话保持机制
    • 自动检测并重新登录
    • 使用更稳定的网络环境
  3. 支付超时:

    • 提前准备好支付方式
    • 简化支付流程步骤
    • 设置支付超时提醒

7. 使用建议与法律合规

7.1 合理使用建议

  1. 避免在高峰时段过度频繁请求
  2. 仅为自己和亲友购票使用
  3. 不要进行商业性质的抢票行为
  4. 尊重12306系统的访问规则

7.2 技术边界与法律风险

开发和使用抢票软件需要注意:

  1. 不得干扰12306系统正常运行
  2. 不得进行非法牟利
  3. 遵守《网络安全法》相关规定
  4. 尊重其他用户的公平购票权利

在实际开发过程中,我发现最关键的几个技术点是:验证码的稳定识别、订单提交的时序控制、以及支付环节的可靠性。这些都需要通过大量测试来优化参数。

一个实用的建议是:可以设置多个备选车次和席别,当首选方案不可用时,系统可以自动尝试次优选择,这样能显著提高抢票成功率。同时,保持程序的轻量化也很重要,过于复杂的逻辑反而可能降低响应速度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询