我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章将为大家详细讲解有关Python如何实现12306自动抢火车票功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、效果展示

在正式进入代码讲解之前,先来看下本文的实现效果。

如果不是为了演示效果,直接在最后确定阶段加一个延时点击确定,应该不到45秒可以锁定一张票,只要在30分钟之内付款即可。

二、代码详解

本小节会详细解锁抢票软件是如何模拟登录网站,进行自动买票的。为了更清晰地给大家展示,部分代码没有写成函数,直接裸代码运行,让需要买票的朋友可以自己应用软件进行购票。

1 导入库

首先导入本文需要加载的库,如果你有些库还没有安装,导致运行代码时报错,可以在Anaconda Prompt中用pip方法安装。

import jsonimport timefrom captcha import * from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import waitfrom selenium.webdriver.common.keys import Keysfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.support import expected_conditions as EC#导入库

2 确定好购票基本信息

导入库后,在python代码中填写你购票的基本信息。

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了,代码如下:

options = webdriver.ChromeOptions()options.add_argument("--disable-blink-features=AutomationControlled")  browser = webdriver.Chrome(options=options)browser.maximize_window()login_url = 'https://kyfw.12306.cn/otn/resources/login.html'#ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'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')login.click()#登录12306

整体思路是: 

应用python模拟调用google浏览器;

输入12306网址;

等网页加载完全后点击账户密码登录;

找到账号密码的id,把账户密码信息填充进去;

找到登录id,模拟点击登录按钮。

在这一小节中要注意两个点。

一、要在python安装目录中放和google版本匹配的chromedriver,供python调用。

二、要学会找填写账户密码信息的id。

首先,在google浏览器中输入12306登录网址:

https://kyfw.12306.cn/otn/resources/login.html

接着点击账户密码登录,会出现如下界面:

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

然后点击红框中的三个点,找到更多工具,点击开发者工具,会出现如下界面:

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

点击红框中的箭头,把鼠标移动到账户框上去,就会出现如下界面:

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

右边变灰的框里就会出现对应的id,点击账号框,再把鼠标移动到右边变灰的字符上去,点击右键,会出现copy element的选项,复制下来即可。

<input type="text" class="input" id="J-userName" placeholder="用户名/邮箱/手机号"  aria-label="请输入用户名/邮箱/手机号" title="请输入用户名/邮箱/手机号">

发现了吗?源代码input_name中要填写的browser.find_element_by_id('J-userName')内容,即为id="J-userName"中的信息。

4 模拟滑动滑块

输入完用户名和密码,点击立即登录后,会出现如下滑块验证要求。

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

运行如下代码即可拖动滑块进行验证。

browser.implicitly_wait(5)print('=====开始处理滑动验证码=====')track = [300, 400, 500]  for i in track:    try:        btn = browser.find_element_by_xpath('//*[@id="nc_1__scale_text"]/span')        ActionChains(browser).drag_and_drop_by_offset(btn,i,0).perform()    except:        time.sleep(2)  #拉动滑块验证

其中,browser.implicitly_wait(5)表示隐性等待5秒,track中放的是滑块拉动的距离。

5 处理疫情特殊要求

完成滑块验证要求后,会出现如下疫情特殊要求提示:

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

用如下代码点击确认即可。

browser.implicitly_wait(5)browser.find_element_by_xpath('/html/body/div[5]/div[2]/div[3]/a').click()time.sleep(2)  #疫情特殊要求

browser.find_element_by_xpath和id的区别是,在右键复制时要copy XPath或copy full XPath。

6 点击购票并填写出发地、目的地、出发时间

接下来是选择买票,并将出发地、目的地、出发时间等信息填写进去。

browser.find_element_by_xpath('//*[@id="J-chepiao"]/a').click()browser.find_element_by_xpath('//*[@id="megamenu-3"]/div[1]/ul/li[1]/a').click()browser.find_element_by_xpath('//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()#选择买票def input_info():    print('=====开始买票=====')    from_station = browser.find_element_by_xpath('//*[@id="fromStationText"]')    from_station.send_keys(Keys.ENTER)    from_station.send_keys(Keys.CONTROL, 'a')    from_station.send_keys(start_station, Keys.ENTER)    browser.implicitly_wait(5)    to_station = browser.find_element_by_xpath('//*[@id="toStationText"]')    to_station.send_keys(Keys.ENTER)    to_station.send_keys(Keys.CONTROL, 'a')    to_station.send_keys(end_station, Keys.ENTER)    browser.implicitly_wait(5)    start_date = browser.find_element_by_xpath('//*[@id="train_date"]')    start_date.send_keys(Keys.ENTER)    start_date.send_keys(Keys.CONTROL, 'a')    start_date.send_keys(Keys.CONTROL, 'x')    start_date.send_keys(date, Keys.ENTER)    browser.implicitly_wait(5)    wait.WebDriverWait(browser, 3).until(EC.element_to_be_clickable((By.ID,'query_ticket'))).click()input_info()input_info()#将出发地、目的地、出发日期填进去

得到结果如下:

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

这里需要注意的是我调用了两遍input_info函数,因为12306可能采取了一些反爬措施,一遍输入进去后查不出东西,显示为灰色。

7 锁定车票

最后是依次查找trains中的车次是否有票,有的话点击购买锁定车票。

trList = browser.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")for tr in trList:    trainNum = tr.find_element_by_class_name("number").text    if trainNum in trains:        leftTicket = tr.find_element_by_xpath(".//td[4]").text        print('leftTicket', leftTicket)        if leftTicket == '有' or leftTicket.isdigit():            orderBtn = tr.find_element_by_class_name("btn72")            orderBtn.click()            browser.implicitly_wait(5)            passengerLabels = browser.find_elements_by_xpath(".//ul[@id='normal_passenger_id']/li/label")            for passengerLabel in passengerLabels:                 name = passengerLabel.text                if name in names:                     passengerLabel.click()             browser.implicitly_wait(20)            # 获取提交按钮            submitBtn = browser.find_element_by_id("submitOrder_id")            submitBtn.click()            browser.implicitly_wait(20)            confirmBtn = browser.find_element_by_id("qr_submit_id")            confirmBtn.click()            time.sleep(2)            browser.implicitly_wait(20)            confirmBtn = browser.find_element_by_id("qr_submit_id")            confirmBtn.click()            break #依次查找trains中的车次是否有票,有的话点击购买

关于“Python如何实现12306自动抢火车票功能”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章将为大家详细讲解有关Python如何实现12306自动抢火车票功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、效果展示在正式进入代码讲解之前,先来看下本文的实现效果。如果不是为了演示效果,直
2023-06-22

如何用Python自动刷新抢12306火车票

如何用Python自动刷新抢12306火车票,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一年一度的春运又来了,今年我自己写了个抢票脚本。使用Python+Splinter自动
2023-06-17

如何使用python爬虫实现最新12306抢票

这篇文章将为大家详细讲解有关如何使用python爬虫实现最新12306抢票,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.环境python 3.7谷歌浏览器chromedriver.exe(浏览器驱动程
2023-06-26

Java多线程如何实现模拟12306火车站售票系统

这篇文章主要介绍Java多线程如何实现模拟12306火车站售票系统,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!该系统一共涉及到3个类:车票(Ticket)12306系统(System12306)售票窗口(Windo
2023-06-15

怎么用Python实现全自动购买火车票

这篇文章主要讲解了“怎么用Python实现全自动购买火车票”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python实现全自动购买火车票”吧!这个是实现结果,因为一天只能取消三次,所以
2023-06-15

Android辅助功如何实现自动抢红包

这篇文章主要介绍Android辅助功如何实现自动抢红包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、描述最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下
2023-05-30

Python如何实现考试自动答题功能

这篇文章主要介绍“Python如何实现考试自动答题功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python如何实现考试自动答题功能”文章能帮助大家解决问题。一、准备环境1)运行环境 开发环境
2023-07-05

如何利用ChatGPT和Python实现自动问答功能

如何利用ChatGPT和Python实现自动问答功能引言:随着自然语言处理和人工智能的快速发展,自动问答系统成为各个领域中的热门应用之一。通过使用ChatGPT和Python,我们可以快速实现一个自动问答系统,从而提供高效的问答服务。本文将
2023-10-25

基于Python如何实现微信自动回复功能

这篇文章主要介绍“基于Python如何实现微信自动回复功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现微信自动回复功能”文章能帮助大家解决问题。实现自动回复的功能,我们需要
2023-07-02

Spring Security如何实现自动登陆功能

这篇文章主要介绍Spring Security如何实现自动登陆功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!当我们在登录像QQ邮箱这种大多数的网站,往往在登录按键上会有下次自动登录这个选项,勾选后登录成功,在一段
2023-06-25

java web如何实现自动登录功能

这篇文章主要介绍java web如何实现自动登录功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下主要思路就是:当用户访问网站的首页时,浏览器端会先检擦浏览器中存在的cookie中是否又登录的用户的用户名
2023-05-31

Python一行代码如何实现自动发邮件功能

这篇文章主要介绍了Python一行代码如何实现自动发邮件功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 用Python每天给女神发送舔狗问候用Python自动发送最基
2023-06-15

JavaScript如何实现图片自动播放功能

今天小编给大家分享一下JavaScript如何实现图片自动播放功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、自动轮播
2023-07-06

MyBatis-Plus如何实现字段自动填充功能

这篇文章给大家分享的是有关MyBatis-Plus如何实现字段自动填充功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在项目中,我们有一些公共的字段需要做修改如:gmt_create:创建时间creat
2023-06-25

如何通过Oracle实现自动发邮件功能

在内网项目、外网项目中多有 需要自动监控发邮件提醒的功能,因为邮件功能最便捷、便宜、不用开接口,不用接口费用。现 提供 我在一个内网项目中的使用案例:案例背景:在有限的资源下,能够自动给下级单位发布 数据考核评分(自动评分)和各 业务数据扣分 汇总统计后的数量
如何通过Oracle实现自动发邮件功能
2019-09-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录