【详解】实现自动抢火车票(基于Python3.6+splinter)
实现自动抢火车票(基于Python3.6+splinter)
随着网络购票的普及,节假日或热门线路的火车票往往一票难求。为了提高抢票效率,我们可以利用Python编写一个自动抢票脚本。本文将介绍如何使用Python 3.6和splinter库来实现这一功能。
环境准备
安装Python
确保你的系统中已安装Python 3.6或更高版本。你可以从Python官网下载并安装。
安装splinter
splinter是一个用于自动化浏览器操作的Python库,它支持多种浏览器。我们可以通过pip安装splinter及其依赖项:
pip install splinter
安装浏览器驱动
根据你选择的浏览器(如Chrome、Firefox等),需要安装相应的WebDriver。例如,对于Chrome,你需要下载ChromeDriver,并将其路径添加到系统的PATH环境变量中。
编写抢票脚本
导入必要的库
from splinter import Browser
import time
初始化浏览器
# 使用Chrome浏览器
browser = Browser('chrome')
登录12306
def login(username, password):
# 打开12306登录页面
browser.visit('12306/otn/resources/login.html')
# 填写用户名和密码
browser.find_by_id('J-userName').fill(username)
browser.find_by_id('J-password').fill(password)
# 点击登录按钮
browser.find_by_id('J-login').click()
# 等待用户手动完成验证码输入
input("请在浏览器中完成验证码输入后按回车键继续...")
选择出发地和目的地
def select_trip(departure, arrival, date):
# 跳转到购票页面
browser.visit('12306/otn/leftTicket/init')
# 选择出发地和目的地
browser.find_by_id('fromStationText').fill(departure)
browser.find_by_id('toStationText').fill(arrival)
# 选择日期
browser.find_by_id('train_date').fill(date)
# 查询车次
browser.find_by_id('query_ticket').click()
提交订单
def submit_order():
# 等待查询结果加载
time.sleep(5)
# 选择第一个可预订的车次
if browser.is_element_present_by_css('.no-br'):
browser.find_by_css('.no-br')[0].click()
# 确认乘客信息
browser.find_by_id('normalPassenger_0').click()
# 提交订单
browser.find_by_id('submitOrder_id').click()
# 确认订单
time.sleep(5)
browser.find_by_id('qr_submit_id').click()
主函数
def main():
username = 'your_username'
password = 'your_password'
departure = '北京'
arrival = '上海'
date = '2023-10-01'
login(username, password)
select_trip(departure, arrival, date)
submit_order()
if __name__ == '__main__':
main()
注意事项
- 验证码:由于12306网站的验证码机制较为复杂,目前无法通过脚本自动识别,因此需要用户手动完成。
- 反爬虫机制:12306网站有严格的反爬虫机制,频繁请求可能会导致IP被封禁。建议合理设置请求间隔,避免对服务器造成过大压力。
- 法律风险:使用自动化脚本抢票可能违反12306网站的使用条款,请谨慎使用。
虽然该脚本还存在一些限制,但可以作为一个基础框架进行扩展和完善。希望本文对你有所帮助!
创建一个自动抢火车票的脚本需要考虑多个方面,包括登录、选择车次、填写乘客信息等。下面是一个基于Python 3.6和Splinter库的简化示例。请注意,这仅用于教育目的,实际使用时应遵守相关法律法规。
首先,确保安装了必要的库:
pip install splinter
示例代码
from splinter import Browser
import time
# 配置浏览器驱动(这里以Chrome为例)
executable_path = {'executable_path': '/path/to/chromedriver'}
# 初始化浏览器
browser = Browser('chrome', **executable_path)
def login(url, username, password):
# 打开12306登录页面
browser.visit(url)
# 填写用户名和密码
browser.fill('loginUserDTO.user_name', username)
browser.fill('userDTO.password', password)
# 点击登录按钮
browser.find_by_id('loginSub').click()
# 等待页面加载完成
time.sleep(5)
def search_ticket(departure, arrival, date):
# 跳转到购票页面
browser.visit('12306/otn/leftTicket/init')
# 填写出发地和目的地
browser.fill('train_start_station', departure)
browser.fill('train_arrive_station', arrival)
# 选择日期
browser.execute_script(f"document.getElementById('train_date').value='{date}'")
# 查询车票
browser.find_by_id('query_ticket').click()
# 等待查询结果加载
time.sleep(5)
def select_ticket_and_passenger():
# 选择第一个有余票的车次
tickets = browser.find_by_css('.ticket-list tbody tr')
for ticket in tickets:
if '有' in ticket.text:
ticket.find_by_css('.no-br')[0].click()
break
# 选择乘客
browser.find_by_text('常用联系人').click()
browser.find_by_text('张三').click()
# 提交订单
browser.find_by_id('submitOrder_id').click()
# 确认订单
browser.find_by_id('qr_submit_id').click()
def main():
url = '12306/otn/resources/login.html'
username = 'your_username'
password = 'your_password'
departure = '北京'
arrival = '上海'
date = '2023-10-01'
try:
login(url, username, password)
search_ticket(departure, arrival, date)
select_ticket_and_passenger()
finally:
# 关闭浏览器
browser.quit()
if __name__ == '__main__':
main()
注意事项
- 合法性:确保你的行为符合12306网站的使用条款和相关法律法规。
- 验证码:12306通常会有图形验证码或滑动验证,需要手动处理或使用第三方服务。
- 性能:频繁请求可能会被12306封IP,建议使用代理或适当增加延时。
- 错误处理:增加异常处理机制,确保脚本在遇到问题时能够优雅地退出或重试。
进一步优化
- 多线程/多进程:可以使用多线程或多进程来提高抢票成功率。
- 动态代理:使用动态代理池来避免IP被封。
- 日志记录:记录每一步的操作日志,便于调试和追踪问题。
希望这个示例对你有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。实现自动抢火车票的脚本可以利用Python的splinter
库来模拟浏览器操作,完成登录、选择车次、填写乘客信息等步骤。以下是一个简单的示例,展示如何使用Python 3.6和splinter
库来构建一个自动抢票的脚本。请注意,这个脚本仅用于学习目的,实际使用时需要遵守相关法律法规。
安装必要的库
首先,你需要安装splinter
和geckodriver
(Firefox的WebDriver):
pip install splinter
你还需要下载对应版本的geckodriver
并将其路径添加到系统环境变量中。
示例代码
from splinter import Browser
import time
# 配置浏览器
browser = Browser('firefox')
def login(username, password):
# 打开12306网站
browser.visit('12306/index/otn/resources/login/init')
# 切换到账号登录
browser.find_by_text('账号登录').click()
# 输入用户名和密码
browser.fill('loginUserDTO.user_name', username)
browser.fill('userPassword', password)
# 点击登录按钮
browser.find_by_id('loginSub').click()
# 等待页面加载完成
time.sleep(5)
def search_ticket(departure, arrival, date):
# 跳转到购票页面
browser.visit('12306/index/otn/leftTicket/init')
# 填写出发地、目的地和日期
browser.fill('train_start_station', departure)
browser.fill('train_arrive_station', arrival)
browser.fill('train_date', date)
# 点击查询按钮
browser.find_by_id('query_ticket').click()
# 等待查询结果加载
time.sleep(5)
def select_ticket():
# 选择第一个有余票的车次
tickets = browser.find_by_css('.ticket-list .ticket-item')
for ticket in tickets:
if '无' not in ticket.text:
ticket.click()
break
def confirm_order(passenger_name):
# 选择乘客
browser.find_by_text(passenger_name).click()
# 点击提交订单
browser.find_by_id('submitOrder_id').click()
# 确认订单
browser.find_by_id('qr_submit_id').click()
if __name__ == '__main__':
# 用户名和密码
username = 'your_username'
password = 'your_password'
# 出发地、目的地和日期
departure = '北京'
arrival = '上海'
date = '2023-10-01'
# 乘客姓名
passenger_name = '张三'
# 登录
login(username, password)
# 查询车票
search_ticket(departure, arrival, date)
# 选择车次
select_ticket()
# 确认订单
confirm_order(passenger_name)
# 关闭浏览器
browser.quit()
代码说明
- 配置浏览器:使用
splinter
的Browser
类来配置浏览器实例。 - 登录:打开12306登录页面,输入用户名和密码,点击登录按钮。
- 查询车票:跳转到购票页面,填写出发地、目的地和日期,点击查询按钮。
- 选择车次:遍历查询结果,选择第一个有余票的车次。
- 确认订单:选择乘客,点击提交订单,最后确认订单。
注意事项
- 验证码:12306网站有图形验证码和滑动验证,这些验证码需要手动处理或使用第三方服务。
- 安全性:不要将用户名和密码硬编码在脚本中,可以使用环境变量或配置文件来管理敏感信息。
- 合法性:使用自动化脚本抢票可能会违反12306的使用条款,因此请确保你的行为符合相关法律法规。
希望这个示例对你有所帮助!如果有任何问题或需要进一步的帮助,请随时告诉我。
- 点赞
- 收藏
- 关注作者
评论(0)