目录
一、效果展示
二、代码详解
1 导入库
2 确定好购票基本信息
3 登录12306
4 模拟滑动滑块
5 处理疫情特殊要求
6 点击购票并填写出发地、目的地、出发时间
7 锁定车票
三、实现监控购买
注意
环境
代码
大家有没有这种感觉,一到国庆、春节这种长假,抢火车票就非常困难?各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率。有些火车票代售网点和一些加速买票软件,说你只要给100元服务费就可以优先帮忙抢到票。
本文和你一起探索抢票软件背后的原理。
一、效果展示
在正式进入代码讲解之前,先来看下本文的实现效果。
如果不是为了演示效果,直接在最后确定阶段加一个延时点击确定,应该不到45秒可以锁定一张票,只要在30分钟之内付款即可。
二、代码详解
本小节会详细解锁抢票软件是如何模拟登录网站,进行自动买票的。为了更清晰地给大家展示,部分代码没有写成函数,直接裸代码运行,让需要买票的朋友可以自己应用软件进行购票。
1 导入库
首先导入本文需要加载的库,如果你有些库还没有安装,导致运行代码时报错,可以在Anaconda Prompt中用pip方法安装。
1 2 3 4 5 6 7 8 9 10 11 |
-
###########################
-
Python学习交流Q群101677771
-
###########################
import json import time from captcha import * from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import wait from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions as EC #导入库 |
2 确定好购票基本信息
导入库后,在python代码中填写你购票的基本信息。
1 2 3 4 5 6 7 8 9 |
purpose = 'ADULT' #购买成人票,如果是学生票,需调整代码 names = [ '谢朝阳' ] #填写购票人姓名 date = '2021-09-21' #填写购票日期 start_station = '深圳' #购票出发站 end_station = '长沙南' #购票目的站 password = '11234567xyz' #登录12306的秘密 username = 'xiezhaoyang122700' #登录12306的账号 trains = [ 'G1004' , 'G80' , 'G6028' , 'G6182' , 'G6016' ] #你想买的班次 #填写基本信息 |
本文预订的是2021年9月21日从深圳到长沙南的高铁票,你可以根据自己的实际需要进行调整。由于有些班次的时间过早或过晚,买了也很不方便,所以可以在trains中挑选出你满意的班次进行购票。在这里需要提醒大家,我之前在尝试代码时碰到的坑,那就是时间中如果有个位数要在前面填0。比如2021年9月2日,你在填写购票日期date时要写成'2021-09-02',否则在运行代码时日期总是填不进去。
3 登录12306
确定好购票的基本信息后,就可以应用python模拟登录12306了,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
options = webdriver.ChromeOptions() options.add_argument( "--disable-blink-features=AutomationControlled" ) browser = webdriver.Chrome(options = options) browser.maximize_window() login_url = '中国铁路12306 ' #ticket_url = '中国铁路12306 ' browser.get(login_url) time.sleep( 0.5 ) wait.WebDriverWait(browser, 5 ).until(EC.element_to_be_clickable((By.CLASS_NAME, 'login-hd-account' ))).click() input_name = browser.find_element_by_id( 'J-userName' ) input_pd = browser.find_element_by_id( 'J-password' ) input_name.send_keys(username) input_pd.send_keys(password) login = browser.find_element_by_id( 'J-login'<
|