【详解】实现自动抢火车票(基于Python3.6+splinter)

举报
皮牙子抓饭 发表于 2025/03/18 21:29:22 2025/03/18
【摘要】 实现自动抢火车票(基于Python3.6+splinter)随着网络购票的普及,节假日或热门线路的火车票往往一票难求。为了提高抢票效率,我们可以利用Python编写一个自动抢票脚本。本文将介绍如何使用Python 3.6和splinter库来实现这一功能。环境准备安装Python确保你的系统中已安装Python 3.6或更高版本。你可以从​​Python官网​​下载并安装。安装splinte...

实现自动抢火车票(基于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()

注意事项

  1. 验证码:由于12306网站的验证码机制较为复杂,目前无法通过脚本自动识别,因此需要用户手动完成。
  2. 反爬虫机制:12306网站有严格的反爬虫机制,频繁请求可能会导致IP被封禁。建议合理设置请求间隔,避免对服务器造成过大压力。
  3. 法律风险:使用自动化脚本抢票可能违反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()

注意事项

  1. 合法性:确保你的行为符合12306网站的使用条款和相关法律法规。
  2. 验证码:12306通常会有图形验证码或滑动验证,需要手动处理或使用第三方服务。
  3. 性能:频繁请求可能会被12306封IP,建议使用代理或适当增加延时。
  4. 错误处理:增加异常处理机制,确保脚本在遇到问题时能够优雅地退出或重试。

进一步优化

  • 多线程/多进程:可以使用多线程或多进程来提高抢票成功率。
  • 动态代理:使用动态代理池来避免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()

代码说明

  1. 配置浏览器:使用​​splinter​​的​​Browser​​类来配置浏览器实例。
  2. 登录:打开12306登录页面,输入用户名和密码,点击登录按钮。
  3. 查询车票:跳转到购票页面,填写出发地、目的地和日期,点击查询按钮。
  4. 选择车次:遍历查询结果,选择第一个有余票的车次。
  5. 确认订单:选择乘客,点击提交订单,最后确认订单。

注意事项

  1. 验证码:12306网站有图形验证码和滑动验证,这些验证码需要手动处理或使用第三方服务。
  2. 安全性:不要将用户名和密码硬编码在脚本中,可以使用环境变量或配置文件来管理敏感信息。
  3. 合法性:使用自动化脚本抢票可能会违反12306的使用条款,因此请确保你的行为符合相关法律法规。

希望这个示例对你有所帮助!如果有任何问题或需要进一步的帮助,请随时告诉我。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。