如何实现自动抢火车票(基于 Python 3.6 + Splinter)?

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在当今的互联网时代,抢火车票已经成为许多人春节、长假等出行期间的难题。尤其是在春运期间,面对紧张的票源,手动操作和刷新网页常常会错失购买机会。为了解决这个问题,我们可以通过编写一个自动化脚本,来模拟人类操作的方式,快速抢购火车票。

  本文将带你一起实现一个自动抢火车票的 Python 脚本,使用 Python 3.6+ 和 Splinter 库来完成自动化抢票。Splinter 是一个强大的 Web 自动化库,它基于 Selenium,并提供了更简洁的 API,使得我们能够轻松操作网页元素。

项目背景与需求

  1. 目标:模拟人工操作,通过抢购火车票页面自动进行购票。
  2. 工具:Python 3.6 以上,Splinter 库,浏览器驱动(如 ChromeDriver)。
  3. 流程
    • 打开火车票购买页面。
    • 自动填写出发地、目的地、日期等信息。
    • 自动选择合适的车次。
    • 自动点击购票按钮。
  4. 难点
    • 实时刷新车票信息。
    • 自动点击和选择车票。
    • 填写验证码(可选)。

环境准备

1. 安装必要的库

首先,我们需要安装 SplinterWebDriver 依赖。

pip install splinter
pip install selenium

然后,我们需要安装一个浏览器驱动,比如 ChromeDriver。确保你已安装了 Chrome 浏览器,并下载与浏览器版本相对应的 chromedriver

下载地址:ChromeDriver

2. 配置 ChromeDriver

将下载的 chromedriver 解压并放到一个合适的位置,记住路径。

3. 测试浏览器启动

在代码中启动浏览器并进行简单的网页操作测试:

from splinter import Browser

# 启动浏览器
with Browser('chrome', executable_path='/path/to/chromedriver') as browser:
    browser.visit("https://www.12306.cn/index/")
    print(browser.title)  # 打印网页标题,验证是否打开成功

实现自动抢票功能

1. 打开购票页面并填写基本信息

我们首先需要模拟用户输入出发地、目的地、日期等信息,选择车次等操作。

from splinter import Browser
import time

def auto_buy_ticket():
    with Browser('chrome', executable_path='/path/to/chromedriver') as browser:
        # 打开火车票购买网站
        browser.visit("https://www.12306.cn/index/")

        # 等待页面加载
        time.sleep(3)

        # 填写出发地
        departure_input = browser.find_by_id("fromStationText")
        departure_input.click()
        departure_input.type("北京")  # 填写出发地

        # 填写目的地
        arrival_input = browser.find_by_id("toStationText")
        arrival_input.click()
        arrival_input.type("上海")  # 填写目的地

        # 选择出发日期
        date_input = browser.find_by_id("train_date")
        date_input.click()
        date_input.type("2025-05-01")  # 填写出发日期

        # 提交查询请求
        search_button = browser.find_by_class_name("btn72")
        search_button.click()

        # 等待页面加载
        time.sleep(5)

2. 选择合适的车次

在查询出车次列表后,我们需要遍历并自动选择合适的车次。比如,我们可以选择有票且符合某些条件的车次。

def select_ticket(browser):
    # 查找所有可用的车次
    train_rows = browser.find_by_css(".train")

    for row in train_rows:
        # 获取车次的详细信息
        train_number = row.find_by_css(".train-number").text
        seat_available = row.find_by_css(".seat-available").text

        print(f"车次: {train_number}, 座位: {seat_available}")

        # 判断座位是否可用(假设“有票”显示为“有票”字样)
        if "有票" in seat_available:
            print(f"选择车次: {train_number}")
            row.find_by_css(".btn-book").click()  # 点击抢票按钮
            break

3. 填写乘客信息并提交订单

选择车次后,接下来是填写乘客信息、验证码(如果有的话),然后提交订单。

def fill_passenger_info(browser):
    # 等待页面加载
    time.sleep(3)

    # 填写乘客信息(假设页面已经自动填充过乘客信息,直接点击确认按钮)
    passenger_button = browser.find_by_id("confirmPassenger")
    passenger_button.click()

    # 等待页面跳转
    time.sleep(2)

    # 如果页面有验证码,我们需要手动处理验证码,或使用第三方验证码识别服务
    # 这里跳过验证码处理逻辑
    # 最后点击提交按钮
    submit_button = browser.find_by_id("submitOrder_id")
    submit_button.click()

    # 提交订单并完成购票
    print("提交订单成功!")

4. 完整的自动抢票脚本

from splinter import Browser
import time

def auto_buy_ticket():
    with Browser('chrome', executable_path='/path/to/chromedriver') as browser:
        # 打开火车票购买网站
        browser.visit("https://www.12306.cn/index/")

        # 等待页面加载
        time.sleep(3)

        # 填写出发地
        departure_input = browser.find_by_id("fromStationText")
        departure_input.click()
        departure_input.type("北京")  # 填写出发地

        # 填写目的地
        arrival_input = browser.find_by_id("toStationText")
        arrival_input.click()
        arrival_input.type("上海")  # 填写目的地

        # 选择出发日期
        date_input = browser.find_by_id("train_date")
        date_input.click()
        date_input.type("2025-05-01")  # 填写出发日期

        # 提交查询请求
        search_button = browser.find_by_class_name("btn72")
        search_button.click()

        # 等待页面加载
        time.sleep(5)

        # 查找所有可用的车次
        train_rows = browser.find_by_css(".train")

        for row in train_rows:
            # 获取车次的详细信息
            train_number = row.find_by_css(".train-number").text
            seat_available = row.find_by_css(".seat-available").text

            print(f"车次: {train_number}, 座位: {seat_available}")

            # 判断座位是否可用(假设“有票”显示为“有票”字样)
            if "有票" in seat_available:
                print(f"选择车次: {train_number}")
                row.find_by_css(".btn-book").click()  # 点击抢票按钮
                break

        # 等待页面加载
        time.sleep(3)

        # 填写乘客信息(假设页面已经自动填充过乘客信息,直接点击确认按钮)
        passenger_button = browser.find_by_id("confirmPassenger")
        passenger_button.click()

        # 等待页面跳转
        time.sleep(2)

        # 如果页面有验证码,我们需要手动处理验证码,或使用第三方验证码识别服务
        # 这里跳过验证码处理逻辑
        # 最后点击提交按钮
        submit_button = browser.find_by_id("submitOrder_id")
        submit_button.click()

        # 提交订单并完成购票
        print("提交订单成功!")

if __name__ == "__main__":
    auto_buy_ticket()

小结

  通过 Python 和 Splinter 库,我们实现了一个简单的自动抢票脚本。该脚本可以模拟人工操作,快速提交车票查询和选择车次,自动填写乘客信息并完成订单提交。这个脚本只是一个基础示例,实际项目中你可能还需要处理验证码、异常捕获等问题。

  需要注意的是,自动化抢票可能违反某些网站的使用协议,因此请确保你的使用方式符合相关规定。在生产环境中,推荐使用更稳定的第三方服务,避免对目标网站造成过多压力。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值