12306python抢票脚本
时间: 2025-02-14 17:14:21 浏览: 75
### 使用Python编写12306抢票脚本的方法
实现12306抢票功能涉及多个方面,包括但不限于获取车次信息、处理登录验证以及最终提交订单。下面将详细介绍如何利用Python完成这些操作。
#### 获取车次信息并存储至CSV文件
为了从12306网站抓取所需数据,可以采用`requests`库发起HTTP请求,并借助于`BeautifulSoup`或`lxml`解析HTML文档来提取有用的信息。对于具体某天出发的列车班次详情,则需构建URL参数传递给服务器查询接口。得到的数据会被整理成结构化的形式存入CSV文件内以便后续分析使用[^1]。
```python
import requests
from bs4 import BeautifulSoup
import csv
def fetch_ticket_info(departure, arrival, date):
url = "https://kyfw.12306.cn/otn/leftTicket/queryTicketPrice"
params = {
'train_no': '',
'from_station': departure,
'to_station': arrival,
'depart_date': date
}
response = requests.get(url=url,params=params)
soup = BeautifulSoup(response.text,'html.parser')
tickets_data = parse_html(soup)
with open('tickets.csv', mode='w') as file:
writer = csv.writer(file)
for ticket in tickets_data:
writer.writerow(ticket.values())
fetch_ticket_info("北京","上海","2023-10-18")
```
请注意上述代码仅为示意性质,在实际应用中可能需要调整API路径及参数名称以匹配最新版12306 API规格说明;另外由于铁路部门不断更新其安全机制,因此直接访问官方页面的方式可能会遇到反爬措施而失败。
#### 自动化发送与接收电子邮件
当用户确认好想要预订的具体行程之后,可以通过SMTP协议向指定电子邮箱地址发送带有附件(即之前生成好的CSV文件)的通知信件。而在接收到回复后再次读取消息体内的指令从而得知乘客选定的是哪一班车次准备下一步动作。这里推荐使用`smtplib`和`imaplib`两个标准模块来进行邮件收发工作。
```python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.encoders import encode_base64
from imapclient import IMAPClient
# 发送带附件的邮件...
msg = MIMEMultipart()
attachment = MIMEBase('application','octet-stream')
with open('tickets.csv','rb')as f:
attachment.set_payload(f.read())
encode_base64(attachment)
attachment.add_header('Content-Disposition',"attachment; filename=tickets.csv")
msg.attach(attachment)
server = smtplib.SMTP('smtp.example.com')
server.login(user,password)
server.sendmail(sender,receivers,msg.as_string())
# 接受邮件并解析内容...
HOST = 'imap.example.com'
USERNAME = ''
PASSWORD = ''
server = IMAPClient(HOST, use_uid=True)
server.login(USERNAME,PASSWORD)
select_info = server.select_folder('INBOX')
messages = server.search(['FROM', sender])
for msgid,data in server.fetch(messages,['ENVELOPE']).items():
envelope = data[b'ENVELOPE']
print(envelope.subject.decode()) # 打印主题
server.logout()
```
同样需要注意替换掉示例中的主机名(`smtp.example.com`)以及其他敏感字段如用户名密码等真实值前缀。
#### 处理图形验证码
针对12306购票过程中的人机识别环节——图形验证码问题,当前较为流行的解决方案有两种:
一种方式是集成第三方OCR服务提供商所提供的SDK工具包,比如腾讯云AI开放平台就提供了专门用于破解此类图片型挑战题目的API接口,只需上传待解密图像即可返回对应的文字描述结果供程序进一步调用下单函数时作为输入项之一传入。
另一种则是基于机器学习模型训练自定义分类器自行搭建一套完整的预测体系,不过这通常要求开发者具备一定算法理论基础并且掌握深度神经网络框架TensorFlow/Keras等相关技能才能较好地胜任这项任务。
阅读全文
相关推荐



















