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

下面是“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日

相关文章

  • 单击 Javascript 按钮 python, spynner

    【问题标题】:Click Javascript button python, spynner单击 Javascript 按钮 python, spynner 【发布时间】:2023-04-07 05:40:02 【问题描述】: 我想使用 spynner 单击没有名称的按钮。该按钮如下所示: <li> <a onclick=”save(); …

    Python开发 2023年4月8日
    00
  • Python趣味爬虫之用Python实现智慧校园一键评教

    让我来详细讲解一下“Python趣味爬虫之用Python实现智慧校园一键评教”的完整攻略。 1. 搭建环境 首先,你需要在本地搭建好Python环境,推荐使用Anaconda或Miniconda。 然后,你需要安装所必须的库,包括: requests:用于发送HTTP请求 BeautifulSoup4:用于解析HTML和XML文档 lxml:用于解析HTML…

    python 2023年5月14日
    00
  • uniapp,微信小程序中使用 MQTT的问题

    使用 MQTT 在 uniapp 和微信小程序中进行通信,需要使用到一个 MQTT 的客户端库。下面将为大家提供一份详细的攻略,以帮助读者解决这个问题。在本攻略中,我们选择使用基于 Paho MQTT 的客户端库,该库支持在多种平台和语言中使用。 1. 准备工作 在使用 MQTT 客户端库之前,需要先在项目中安装该库。我们以 uniapp 项目为例,在项目根…

    python 2023年5月23日
    00
  • Python创建二维数组与初始化的实践举例

    关于“Python创建二维数组与初始化的实践举例”的攻略,可以分成以下几个步骤: 1. 定义一个二维数组 一个二维数组通常由多个一维数组组成。那么在Python中,其实可以通过以下两种方式定义一个二维数组: 方式一 使用列表生成式嵌套列表生成式,如下所示: a = [[0 for i in range(m)] for j in range(n)] 这里的a就…

    python 2023年6月5日
    00
  • Python全面分析系统的时域特性和频率域特性

    Python全面分析系统的时域特性和频域特性攻略 1. 什么是时域特性和频率域特性? 时域特性:描述系统输出相对于输入的时间响应特性,涉及信号的时间变化过程和振幅大小等。 频率域特性:描述输入信号在系统中的频率响应特性,即输出与输入信号的振幅比例和相位差随频率变化的规律。 2. 如何分析时域特性? 2.1 生成输入信号 通过NumPy库的numpy.lins…

    python 2023年5月30日
    00
  • pip报错“ValueError: invalid literal for int() with base 10: ‘3.2’”怎么处理?

    当使用Java的Hibernate框架时,可能会遇到“LockAcquisitionException”错误。这个错误通常是由以下原因之一引起的: 并发访问:如果多个线程同时访问同一个对象,则会出现此错误。在这种情况下,需要使用Hibernate的锁定机制来避免并发访问。 死锁:如果多个线程同时持有不同的锁,并且每个线程都试图获取另一个线程持有的锁,则会出现…

    python 2023年5月4日
    00
  • Python正则表达式非贪婪、多行匹配功能示例

    Python正则表达式非贪婪、多行匹配功能示例 在Python正则表达式中,有两个非常有用的功能:非贪婪匹配和多行匹配。贪婪匹配指的是尽可能多地匹配字符,而不尽可能少地匹配字符;非贪婪匹配则相反,尽可能少地匹配字符。多行匹配指的是匹配多行文本,而不是单行文本。下面将分别介绍两个功能,并提供两个示例说明。 非贪婪匹配 在正则表达式中,*和+默认是贪的,即尽可能…

    python 2023年5月14日
    00
  • 使用python实现定时报天气的示例代码

    Python实现定时报天气攻略 天气是我们日常生活中非常重要的信息之一,使用Python可以方便地获取天气信息,并实现定时报天气的功能。本攻略将介绍使用Python实现定时报天气的示例代码,包括数据获取、数据处理、定时任务和示例。 步骤1:获取数据 在Python中,我们可以使用requests库获取天气数据。以下是获取天气数据的示例: import req…

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