下面是“Python+Splinter实现12306网站刷票并自动购票流程”的攻略:
1. 准备工作
首先,你需要安装 Python
和 Splinter
库。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技术站