python+splinter实现12306网站刷票并自动购票流程

yizhihongxing

下面是“Python+Splinter实现12306网站刷票并自动购票流程”的攻略:

1. 准备工作

首先,你需要安装 PythonSplinter 库。Splinter 是一个简单的 Python 库,它提供了一个简化的 API 来模拟人类用户使用网页进行交互。

安装方法:

pip install splinter

2. 刷票流程

2.1 初始化浏览器

首先,我们需要初始化一个浏览器对象。在这里,我们使用 Chrome 浏览器,需要下载 Chrome 浏览器并安装,并下载对应版本的 ChromeDriver。

from splinter.browser import Browser

# 初始化浏览器
executable_path = {'executable_path': 'chromedriver.exe'}
browser = Browser('chrome', **executable_path, headless=True)

2.2 登录 12306

在 Chrome 中打开 12306 官网并登录。如果有验证码,则需要手动输入。如果只是做技术研究,可以使用 Pytesseract 库进行验证码识别。但如果是实际购票,不建议使用此方式,因为可能会违反相关法律规定。

比如以下代码可在输入正确用户名和密码后登录,在这里我们使用 12306 的 demo 账户:

# 进入 12306 登录页面
browser.visit('https://kyfw.12306.cn/otn/resources/login.html')
browser.find_by_text('账号登录').click()

# 输入用户名和密码
browser.find_by_css('#username').fill('test123')
browser.find_by_css('#password').fill('test123')

# 手动输入验证码

# 点击登录按钮
browser.find_by_text('登 录').click()

# 等待跳转到用户中心后再进行下一步操作
while browser.url == 'https://kyfw.12306.cn/otn/resources/login.html':
    time.sleep(1)

print('登录成功')

2.3 进入刷票界面

现在我们已经登录成功了。接下来,我们要进入购票页面,选择所需的出发站、到达站、乘车时间、座位等级等信息。

# 进入购票页面
browser.visit('https://kyfw.12306.cn/otn/leftTicket/init')

# 选择出发站和到达站
browser.find_by_text('深圳').click()
browser.find_by_text('上海').click()

# 选择乘车时间
browser.find_by_id('train_date').fill('2021-12-31')

# 选择座位等级
browser.find_by_value('M').click()  # 一等座

# 查询车票
browser.find_by_text('查询').click()

print('当前余票:\n', browser.find_by_text('商务座').first.find_by_xpath('..').text)

2.4 选择车次和座位

现在我们已经成功查询到有余票的车次。下一步是选择车次和座位。这需要一些 JavaScript 代码来实现。

以下示例代码是选择第一个商务座的车次和座位:

# 选择车次和座位
browser.find_by_text('预订').first.click()

# 确认乘车信息
browser.find_by_text('确认').click()

# 选择座位
browser.execute_script('document.getElementById("1A").click();')
browser.find_by_id('qd_closeDefaultWarningWindowDialog_id').click()

print('车次和座位选择成功')

2.5 提交订单

最后一步是提交订单。

# 提交订单
browser.find_by_id('submitOrder_id').click()

# 确认订单
browser.find_by_id('qr_submit_id').click()

print('订单提交成功')

3. 完整代码示例

以下是一段完整的代码示例,实现了 12306 刷票并自动购票的过程:

import time
from splinter.browser import Browser

executable_path = {'executable_path': 'chromedriver.exe'}
browser = Browser('chrome', **executable_path, headless=True)

# 进入 12306 登录页面
browser.visit('https://kyfw.12306.cn/otn/resources/login.html')
browser.find_by_text('账号登录').click()

# 输入用户名和密码
browser.find_by_css('#username').fill('test123')
browser.find_by_css('#password').fill('test123')

# 手动输入验证码

# 点击登录按钮
browser.find_by_text('登 录').click()

# 等待跳转到用户中心后再进行下一步操作
while browser.url == 'https://kyfw.12306.cn/otn/resources/login.html':
    time.sleep(1)

print('登录成功')

# 进入购票页面
browser.visit('https://kyfw.12306.cn/otn/leftTicket/init')

# 选择出发站和到达站
browser.find_by_text('深圳').click()
browser.find_by_text('上海').click()

# 选择乘车时间
browser.find_by_id('train_date').fill('2021-12-31')

# 选择座位等级
browser.find_by_value('M').click()  # 一等座

# 查询车票
browser.find_by_text('查询').click()

print('当前余票:\n', browser.find_by_text('商务座').first.find_by_xpath('..').text)

# 选择车次和座位
browser.find_by_text('预订').first.click()

# 确认乘车信息
browser.find_by_text('确认').click()

# 选择座位
browser.execute_script('document.getElementById("1A").click();')
browser.find_by_id('qd_closeDefaultWarningWindowDialog_id').click()

print('车次和座位选择成功')

# 提交订单
browser.find_by_id('submitOrder_id').click()

# 确认订单
browser.find_by_id('qr_submit_id').click()

print('订单提交成功')

time.sleep(10)
browser.quit()

这段代码可以自动登录 12306 网站,查询出深圳到上海的商务座余票,并选择第一趟车的 1A 座位,提交订单。由于自动提交订单属于自动化行为,建议不要在实际环境中使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python+splinter实现12306网站刷票并自动购票流程 - Python技术站

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

相关文章

  • Python读写压缩文件的方法

    Python读取压缩文件的方法 要读取压缩文件,需要使用Python内置的zipfile模块。首先,需要导入该模块。 import zipfile 读取压缩文件的基本过程如下: 使用zipfile.ZipFile()函数打开压缩文件,得到一个zipfile.ZipFile对象; 使用ZipFile.namelist()方法获取压缩文件中的文件列表; 使用Zi…

    python 2023年6月5日
    00
  • python爬虫竟然被小伙用来算命

    近日,有一篇文章称,一位小伙用Python爬虫和机器学习算法,开发了一款算命应用,引起了广泛关注。下面是Python爬虫竟然被小伙用来算命的完整攻略,包括数据获取、数据处理、数据存储和示例。 步骤1:获取数据 在Python中,我们可以使用requests库获取网页数据。以下是获取星座运势数据的示例: import requests url = ‘https…

    python 2023年5月15日
    00
  • Python数据结构之队列详解

    Python数据结构之队列详解 队列是一种常用的数据结构,它遵循先进先出(FIFO)的原则,即先进入队列的元素先被取出。在Python中,我们可以使用列表或deque模块来实现队列。在本攻略中,我们将介绍队列的基本概念、实现方法和常用操作,并提供两个示例来说明如何使用队列进行数据处理。 队列的基本概念 队列是一种线性数据结构,它包含两个基本操作:入队和出队。…

    python 2023年5月14日
    00
  • 使用 Python 将图像转换为十六进制格式

    【问题标题】:Convert image into hexadecimal format with Python使用 Python 将图像转换为十六进制格式 【发布时间】:2023-04-02 02:27:01 【问题描述】: tmp 文件夹下有一个 jpg 文件。 upload_path = /tmp/resized-test.jpg 我一直在使用下面的代…

    Python开发 2023年4月8日
    00
  • Python 异常处理总结

    Python 异常处理总结 什么是异常? 当程序执行发生错误时,就会引发异常。例如:访问未定义变量、除数为 0 等。Python 中提供了一种异常处理机制,使得程序在发生异常时能够捕获并适当地进行处理,而不直接崩溃。 异常处理语句 在 Python 中,可以使用 try/except 语句来捕获并处理异常。 try: # 可能会引发异常的代码 except …

    python 2023年5月13日
    00
  • 详解Node.js和Python的区别

    Node.js和Python都是广泛应用于Web开发领域的编程语言,两者有一些异同点。下面我们来详细讲解Node.js和Python的区别。 1. 语言特性 Node.js Node.js是一种基于事件驱动、非阻塞I/O模型的服务器端JavaScript运行环境。它使用V8 JavaScript引擎,提供高效的性能和轻量级的编程模型,在处理并发I/O操作时表…

    python-answer 2023年3月25日
    00
  • python实现键盘输入的实操方法

    当使用Python进行编程时,经常需要获取用户从键盘输入的数据。对于实现键盘输入,有以下几种实现方式: 1. 使用input函数 Python语言内置了一个input函数,用于获取从键盘上输入的数据。具体实现方式如下: name = input("请输入您的姓名:") print("欢迎您," + name) 在上面的…

    python 2023年5月19日
    00
  • python线程池如何使用

    让我来为您介绍如何使用 Python 线程池。 什么是线程池 线程池是一种预先分配了一组线程的技术,可用于执行许多异步操作,从而不必每次都创建新的线程,这节省了时间和资源。 Python中的线程池 Python标准库中提供了 concurrent.futures 模块,该模块有两个类:ThreadPoolExecutor 和 ProcessPoolExecu…

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