以下是“使用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技术站