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):
# 初始化浏览器
.driver = webdriver.Chrome(ChromeDriverManager().install())
.wait = WebDriverWait(.driver, )
.passengers = [, ]
.from_station =
.to_station =
.train_numbers = [, ]
.seat_type =
.email_receiver =
.login_url =
.init_my_url =
():
()
.driver.get(.login_url)
:
.init_my_url .driver.current_url:
time.sleep()
()
():
:
rows = .driver.find_elements(By.XPATH, )
row rows:
Exception e:
()
():
()
()
():
host =
port =
sender =
pwd =
receiver = receiver_address
body =
msg = MIMEText(body, , _charset=)
msg[] =
msg[] = sender
msg[] = receiver
s = smtplib.SMTP(host, port)
s.login(sender, pwd)
s.sendmail(sender, receiver, msg.as_string())
s.quit()
():
.do_login()
:
.check_ticket()
time.sleep()
__name__ == :
bot = TrainTicketBot()
bot.run()


