一个清明假期,差点把我困在外面回不来,没有车票,好在今天博主写了一个抢票脚本,现场实操:在pycharm里面直接运行就可以:
下方有完整代码链接!!!!!!!!
提醒:也可以抢一下未发售的票,里面定义了函数:未买到票或者为查询到票自动刷新,查票。
对于没有Python基础的人看这一篇:最新12306抢票软件已发布,在也不用自己运行脚本了-CSDN博客
票未发售时,可以先挂着,让它自己刷新着抢票!
完整链接在下方:
导入必要的库
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time
反爬虫处理(你懂得)
script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
driver.execute_script(script)
用户登录
扫码登录
输入出发地、目的地和出发日期
信息你在pycharm里面输入就可以,会自动填入网页里面:(左下角填入武汉,网页端自动写入武汉)
from_station_input = driver.find_element(By.ID, "fromStationText")
from_station_input.send_keys(here_place)
to_station_input = driver.find_element(By.ID, "toStationText")
to_station_input.send_keys(to_place)
date_input = driver.find_element(By.ID, "train_date")
date_input.send_keys(travel_date)
填完之后自动跳转道购票页面:
注意:部分浏览器可能会清楚缓存,换句话说,刚才的登录信息没有了,我直接建议换浏览器,(当然我的名字肯定打码了)
下一步会询问是否为学生:
也就是这一串代码:
如果选择了学生会点击所对应的id,自动切换如下所示:
这样就换好了:
根据车次情况预定车票
def order_ticket():
# 输入想乘坐的火车车次
train_num = input('---输入你想乘坐的火车车次---\n')
train_numbers = driver.find_elements(By.XPATH, '//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')
# 遍历车次信息,寻找目标车次
for train_number in train_numbers:
train_messages = train_number.text.replace('\n', ' ')
train_message = train_messages.split(' ')
if train_num == train_message[0]:
if '有' == train_message[10] or '有' == train_message[9]:
button = train_number.find_element(By.XPATH, './/a[@class="btn72"]')
button.click()
print('预定成功,现在正在选择乘车人')
break
else:
print('正在为你刷新页面,实时更新车票情况')
# 调用刷新页面函数
refresh_search_ticket(train_message, train_number)
break
接下来选择车次,因为选择了学生票,所以这次选二等座:
确认乘车人和座位信息 默认选择第一个人(可以自己修改)
乘车人的话,可以用代码选也可以自己选,
# 点击乘车人信息,默认第一个为本人
driver.find_element(By.ID, 'normal_passenger_id').click()
# 点击确认按钮
confirm_button = driver.find_element(By.ID, 'dialog_xsertcj_ok')
confirm_button.click()
# 选择座位
for seat, xpath in seats.items():
driver.find_element(By.XPATH, xpath).click()
print(f"已点击座位 {seat}")
confirm_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "qr_submit_id"))
)
confirm_button.click()
print(f"已点击确认按钮")