使用Python+Splinter自动刷新抢12306火车票

以下是“使用Python+Splinter自动刷新抢12306火车票”的完整攻略。

1. Splinter简介

Splinter是一个基于Selenium WebDriver的开源自动化测试框架,它允许我们用几行Python代码来控制浏览器进行自动化测试、爬取数据等工作。

2. 环境要求

  • Python 3
  • Chrome浏览器
  • ChromeDriver

3. 安装Splinter

使用pip安装Splinter:

pip install splinter

运行以下代码来检查是否安装成功:

from splinter.browser import Browser

with Browser() as browser:
    browser.visit("https://www.baidu.com")
    if browser.title == "百度一下,你就知道":
        print("Splinter安装成功!")
    else:
        print("Splinter安装失败。")

4. 实现自动刷新抢票功能

4.1 准备工作

首先,在12306官网上进行登录,并进入车票查询页面。然后,使用Chrome的开发者工具找到车次信息所在的table的id,例如这里我们假设id是"train_table"。

4.2 编写Python代码

import time
from splinter.browser import Browser

# 实例化一个Browser对象
browser = Browser(driver_name='chrome')

# 指定刷新间隔时间
interval = 5

# 进入车票查询页面
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
browser.visit(url)

# 填写表单信息并搜索
browser.select('query_leftTicketDTO.train_date', '2022-01-03')
browser.select('query_leftTicketDTO.from_station', '北京')
browser.select('query_leftTicketDTO.to_station', '上海')
browser.find_by_text('查询').click()

# 循环刷新抢票
while True:
    # 刷新页面
    browser.reload()

    # 检查车票是否已经开售
    if browser.is_text_present('预订'):
        # 找到车次信息所在的table,并输出
        table = browser.find_by_id('train_table').first
        print(table.value)

        # 休眠一段时间后再刷新
        time.sleep(interval)
    else:
        # 没有开售,输出提示信息,并继续刷新
        print('车票尚未开售。')
        time.sleep(interval)

在上述代码中,我们使用了Selenium自带的WebDriver,和Splinter最大的不同点在于我们使用了一些Splinter提供的简化代码的方法,如:browser.reload()

该程序会每隔一定时间调用一次browser.reload()方法,然后检查页面上是否有"预订"文本,如果有,在table中输出车次信息;如果没有,则输出"车票尚未开售"并继续刷新页面,直到有为止。

可以通过调整interval变量的大小来控制刷新间隔时间,调整代码中填写的时间、城市信息来查询其它日期、车站信息。

4.3 运行程序

在命令行中进入到Python代码所在的目录下,运行以下命令即可执行程序:

python auto_refresh_ticket.py

5. 示例说明

下面,我们以查询2022年1月3日从北京到上海的G37次列车为例,演示一下程序的执行过程。\

5.1 步骤一:打开浏览器

# 实例化一个Browser对象
browser = Browser(driver_name='chrome')

5.2 步骤二:进入车票查询页面

# 进入车票查询页面
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
browser.visit(url)

5.3 步骤三:填写表单信息并搜索

# 填写表单信息并搜索
browser.select('query_leftTicketDTO.train_date', '2022-01-03')
browser.select('query_leftTicketDTO.from_station', '北京')
browser.select('query_leftTicketDTO.to_station', '上海')
browser.find_by_text('查询').click()

5.4 步骤四:循环刷新抢票

# 循环刷新抢票
while True:
    # 刷新页面
    browser.reload()

    # 检查车票是否已经开售
    if browser.is_text_present('预订'):
        # 找到车次信息所在的table,并输出
        table = browser.find_by_id('train_table').first
        print(table.value)

        # 休眠一段时间后再刷新
        time.sleep(interval)
    else:
        # 没有开售,输出提示信息,并继续刷新
        print('车票尚未开售。')
        time.sleep(interval)

运行程序后,它会每隔5秒刷新一次页面,直到车票开售为止。输出结果如下所示:

车票尚未开售。
车票尚未开售。
车票尚未开售。
...
[201] G37 07:00 12:48 05:48 1站(经停南京南) ¥933.0  $128.0  %9          有          有          有
[202] G39 08:00 13:44 05:44 直达 ¥932.0  $128.0  %11         有          有          有
[203] G45 10:00 15:20 05:20 1站(经停南京南) ¥932.0  $128.0  %9          有          有          有
...

以上,就是使用Python+Splinter自动刷新抢12306火车票的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python+Splinter自动刷新抢12306火车票 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 如何使用Python在MySQL中删除表?

    要使用Python在MySQL中删除表,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python在MySQL中删除表的完整攻略: 连接 要连接到MySQL,需要提供MySQL的主机、用户名、和密码。可以使用以下代码连接: mysql.connector mydb…

    python 2023年5月12日
    00
  • Python当中的array数组对象实例详解

    Python中的array数组对象实例详解 Python中的array模块提供了一种高效的数组对象,它与Python列表(List)类似,是数组中的元素必须是同一类型。本攻略将介绍如何创建array数组对象、访问数组中的元素、修改数组中的元素、切片数组、连接数组、删除数组、计算数组中元素的个数、查元素在数组中的位置等操作。 创建array数组对象 我们可以使…

    python 2023年5月13日
    00
  • 在Python的一段程序中如何使用多次事件循环详解

    多次事件循环是指在一个程序中,需要对多个事件进行循环监听和处理。使用 Python 中的异步编程库 asyncio 可以方便地实现多次事件循环。下面给出一个示例,来演示如何在 Python 中使用 asyncio 库进行多次事件循环。 基本概念 在介绍代码示例之前,我们来简要介绍一下 asyncio 的基本概念。在 asyncio 中,事件循环(Event …

    python 2023年5月23日
    00
  • Python 元组结构代替状态类

    Python中的元组是不可变序列,一旦初始化之后,其元素不可被修改。因此,元组非常适合用来表示不可变的状态类。在本文中,我们将详细讲解如何使用Python元组结构代替状态类,以及如何使用元组状态类进行消息传递和调用。 创建元组状态类 使用Python元组代替状态类非常简单,只需要将类的状态属性编码为元组即可。例如,假设我们有一个状态类表示一个玩家的状态,包含…

    python-answer 2023年3月25日
    00
  • 如何在Python中隐藏和加密密码示例详解

    【如何在Python中隐藏和加密密码示例详解】 1. 为何需要隐藏和加密密码 在开发应用程序时,我们往往需要用户提交用户名和密码等敏感信息。但是,如果这些信息直接以明文的形式保存在代码中或者存储在数据文件中,就会存在泄露的风险。因此,我们需要将密码隐藏或加密,以保证用户的隐私安全。 2. 如何隐藏密码 隐藏密码可以通过编写配置文件、环境变量或者存储在数据库等…

    python 2023年5月20日
    00
  • 如何利用python提取字符串中的数字

    可以使用正则表达式,也可以使用字符串方法或者第三方库进行字符串中数字的提取。下面分别介绍方法和示例: 使用正则表达式提取字符串中的数字 使用正则表达式首先需要导入re模块。具体步骤如下: 1.创建一个正则表达式,使用/d+表示数字。这样的正则表达式一般用于匹配自然常数(整数、实数等) 2.使用re模块的findall方法,在字符串中查找符合正则表达式的数字字…

    python 2023年6月3日
    00
  • python基本数据类型练习题

    下面是关于“Python基本数据类型练习题”的完整攻略: 1.背景介绍 Python是一种高级编程语言,非常适合初学者入门。在Python中,数据类型是程序中最基本的元素之一,了解和掌握Python基本数据类型对于进一步学习和开发而言都是非常重要的。因此,掌握基本数据类型的练习题目,可以帮助学习者更深入、更全面的理解Python基础知识。 2.练习题目 以下…

    python 2023年5月13日
    00
  • 详解python中文编码问题

    下面我来详细讲解“详解Python中文编码问题”的完整攻略。 标题 问题描述 在Python中处理中文字符串时,常常会遇到编码问题,例如在Python2中使用默认编码为ASCII时无法正常处理包含中文字符的字符串,而在Python3中则默认使用UTF-8编码,但仍然需要注意一些编码相关问题。如何正确处理Python中文编码问题? 解决方案 统一使用UTF-8…

    python 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部