,,Python实现12306自动抢火车票功能

,,Python实现12306自动抢火车票功能

国庆和春节假期火车票很难抢?各大互联网公司都推出了抢票服务,只要在服务费上加钱,就能增加抢票的几率。本文将和你一起探讨抢票软件背后的原理。

目录

一、效果展示二。代码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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: