国庆和春节假期火车票很难抢?各大互联网公司都推出了抢票服务,只要在服务费上加钱,就能增加抢票的几率。本文将和你一起探讨抢票软件背后的原理。
目录
一、效果展示二。代码1的详细解释。导入库2。确定购票基本信息3。登录123064。模拟滑块5。处理疫情的特殊要求6。点击购买车票,填写始发地、目的地、出发时间7。锁票。你有这种感觉吗?国庆、春节假期火车票很难抢?各大互联网公司都推出了抢票服务,只要在服务费上加钱,就能增加抢票的几率。一些火车票代售点和一些加快购票的软件说,只要交服务费就可以优先帮100元取票。本文与您一起探讨抢票软件背后的原理。
一、效果展示
在正式进入代码解释之前,我们先来看看本文的实现效果。
如果不想演示效果,在最后确认阶段加个延时点击确认即可。只要你在30分钟内付款,你应该能在不到45秒内锁定一张票。
二、代码详解
本节将详细讲解如何解锁抢票软件模拟登录网站自动购票。为了让大家看得更清楚,部分代码没有写成函数,让需要买票的朋友可以自己应用软件来购票。
1 导入库
首先,导入本文需要加载的库。如果您的一些库还没有安装,导致运行代码时出错,您可以使用pip方法在Anaconda提示符下安装它们。
导入json
导入时间
从验证码导入*
从selenium导入web驱动程序
由导入者
从selenium.webdriver.support导入等待
从selenium.webdriver.common.keys导入密钥
从selenium.common.exceptions导入NoSuchElementException
从selenium . web driver . common . action _ chains导入操作链
从selenium.webdriver.support导入预期条件作为EC
#导入库
2 确定好购票基本信息
导入库后,用python代码填写自己购票的基本信息。
Purpose='成人' #买成人票。如果是学生票,需要调码。
Names=['谢朝阳'] #填写购票者的姓名。
Date='2021-09-21' #填写购票日期
Start_station='深圳' #购票始发站
End_station='长沙南' #车票目的站
Password='11234567xyz' #登录12306的秘密
Username='xiezhaoyang122700' #登录12306的账户。
Trains=['G1004 ',' G80 ',' G6028 ',' G6182 ',' G6016'] #您想购买的航班
#填写基本信息
本文中的预订是2021年9月21日深圳到长沙南的高铁票。可以根据自己的实际需要进行调整。因为有些航班太早或者太晚,不方便买,所以可以在火车上选择自己满意的航班购票。在这里需要提醒大家的是,我之前试码的时候遇到过一个坑,就是时间有个位数的话,前面要填0。比如2021年9月2日,填写购票日期时要写' 2021-09-02 ',否则运行代码时永远不会填写日期。
3 登录12306
确定购票基本信息后,可以应用python模拟登录12306。代码如下:
选项=webdriver。ChromeOptions()
options . add _ argument('-disable-blink-features=automation controlled ')
浏览器=webdriver。Chrome(选项=选项)
browser.maximize_window()
log in _ URL=' https://kyfw . 12306 . cn/OTN/resources/log in . html '
# ticket _ URL=' https://kyfw . 12306 . cn/OTN/left ticket/init '
browser.get(login_url)
时间.睡眠(0.5)
等等。WebDriverWait(浏览器,5)。直到(EC.element_to_be_clickable((By。CLASS_NAME,' login-hd-account ')))。单击()
input _ name=browser . find _ element _ by _ id(' J用户名')
input _ PD=browser . find _ element _ by _ id(' J-password ')
输入名称.发送密钥(用户名)
输入_pd .发送_密钥(密码)
log in=browser . find _ element _ by _ id(' J-log in ')
login.click()
#登录12306
总体思路是:
1.用python模拟调用google浏览器;
2.输入12306网址;
3.网页加载完毕后点击账号密码登录;
4.找到账号密码的id,填写账号密码信息;
5.找到登录id并模拟单击登录按钮。
这一部分应该注意两点。
首先将匹配google版本的chromedriver放在python安装目录下,供python调用。
第二,学会找id填写账号密码信息。
首先,在谷歌Chrome中输入12306登录网址:
https://kyfw.12306.cn/otn/resources/login.html
然后点击账号密码登录,出现如下界面:
然后点击红框中的三个点,找到更多工具。点击开发者工具,出现如下界面:
点击红色框中的箭头,将鼠标移动到账户框,出现如下界面:
对应的id会出现在右边灰显的框中,点击账号框,然后将鼠标移动到右边灰显的字符上,点击右键,会出现复制元素的选项。只是复制它。
type=' text ' class=' input ' id=' j-username ' placeholder='用户名/电子邮件/手机号码' style=' height:44px;行高:44px'轮廓:黑色0px'Aria-label='请输入您的用户名/电子邮件/手机号码' title='请输入您的用户名/电子邮件/手机号码'
你找到了吗?源代码input_name中要填写的browser . find _ element _ by _ id(' J-userName ')的内容就是id='J-userName '中的信息。
4 模拟滑动滑块
输入用户名和密码后,点击立即登录,会出现以下滑块验证要求。
运行以下代码拖动滑块进行验证。
browser . implicit _ wait(5)
打印('=====开始处理滑动验证码====')
track=[300,400,500]
我急声道:
尝试:
BTN=browser . find _ element _ by _ XPath('//*[@ id=' NC _ 1 _ _ scale _ text ']/span ')
动作链(浏览器)。drag_and_drop_by_offset(btn,I,0)。执行()
除了:
时间.睡眠(2)
#拉动滑块进行验证
其中browser.implicit _ wait (5)表示隐式等待5秒,滑块拉动的距离放入轨迹中。
5 处理疫情特殊要求
完成滑块验证要求后,将出现以下疫情特殊要求:
使用以下代码单击OK。
browser . implicit _ wait(5)
browser . find _ element _ by _ XPath('/html/body/div[5]/div[2]/div[3]/a ')。单击()
时间.睡眠(2)
#疫情的特殊要求
browser.find_element_by_xpath和id的区别在于右键复制时需要复制xpath或者复制完整的XPath。
6 点击购票并填写出发地、目的地、出发时间
接下来就是选择买票,填写出发地、目的地、出发时间等信息。
browser . find _ element _ by _ XPath('//*[@ id=' J-che Piao ']/a ')。单击()
browser . find _ element _ by _ XPath('//*[@ id=' mega menu-3 ']/div[1]/ul/Li[1]/a ')。单击()
browser . find _ element _ by _ XPath('//*[@ id=' qd _ closeDefaultWarningWindowDialog _ id ']')。单击()
#选择买票
定义输入信息():
打印('=====开始买票====')
from _ station=browser . find _ element _ by _ XPath('//*[@ id=' from station text ']')
from_station.send_keys(Keys。回车)
from_station.send_keys(Keys。控制,“a”)
from _ station . send _ keys(start _ station,Keys。回车)
browser . implicit _ wait(5)
to _ station=browser . find _ element _ by _ XPath('//*[@ id=' to station text ']')
to_station.send_keys(Keys。回车)
to_station.send_keys(Keys。控制,“a”)
to _ station . send _ keys(end _ station,Keys。回车)
browser . implicit _ wait(5)
start _ date=browser . find _ element _ by _ XPath('//*[@ id=' train _ date ']')
start_date.send_keys(密钥。回车)
start_date.send_keys(密钥。控制,“a”)
start_date.send_keys(密钥。控件,“x”)
start_date.send_keys(日期,密钥。回车)
browser . implicit _ wait(5)
等等。WebDriverWait(浏览器,3)。直到(EC.element_to_be_clickable((By。ID,' query_ticket ')))。单击()
输入信息()
输入信息()
#填写始发地、目的地和出发日期。
结果如下:
这里需要注意的是,我调用了两次input_info函数,因为12306可能采取了一些反抓取措施。输入一次后,什么也找不到,显示为灰色。
7 锁定车票
最后依次查询各车次是否有票,如果有票,点击买锁票。
tr list=browser . find _ elements _ by _ XPath('。//tbody[@ id=' queryLeftTable ']/tr[not(@ datatran)]')
对于tr列表中的tr:
train num=tr . find _ element _ by _ class _ name(' number ')。文本
如果列车中有列车编号:
left ticket=tr . find _ element _ by _ XPath('。//td[4]')。文本
打印('左票',左票)
如果leftTicket==' has '或leftTicket.isdigit():
order BTN=tr . find _ element _ by _ class _ name(' BTN 72 ')
orderBtn.click()
browser . implicit _ wait(5)
passenger labels=browser . find _ elements _ by _ XPath('。//ul[@ id=' normal _ passenger _ id ']/Li/label ')
对于乘客标签中的乘客标签:
name=passengerLabel.text
如果名称中有名称:
passengerLabel.click()
browser . implicit _ wait(20)
#获取提交按钮
submit BTN=browser . find _ element _ by _ id(' submit order _ id ')
submitBtn.click()
browser . implicit _ wait(20)
confirm BTN=browser . find _ element _ by _ id(' QR _ submit _ id ')
confirmBtn.click()
时间.睡眠(2)
browser . implicit _ wait(20)
confirm BTN=browser . find _ element _ by _ id(' QR _ submit _ id ')
confirmBtn.click()
破裂
#依次查找各次列车是否有票,如有点击购买。
所以,如果你有特别喜欢的车次,可以放在车次前面,依次填上你认为还可以的车次。至此,应用python解锁抢票软件背后的原理已经讲解完毕,感兴趣的朋友可以跟着本文再去体会一下。
1306会不定期更新买票的界面,所以过了一段时间,之前的代码可能要调整了,你需要搞清楚里面的原理,这样就可以什么都不改了。这篇文章的代码没有经过高级的包装,只为了让大家更清楚的知道每一步,在高峰期买到自己喜欢的车票。
也很基础。没有进一步调整缩短时限。有兴趣的朋友可以自行研究。有问题可以和我交流。
关于Python实现12306自动火车票抢票功能的这篇文章到此为止。关于Python自动火车票抢票的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。