python最新抢票脚本

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:python网络爬虫🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

很高兴和大家再次见面,由于某些原因,这篇文章只能以这种方式跟大家见面了,删掉了一些图片,改掉了文章标题,曾几何时,这篇文章百度检索top1,虽然是博主的第一篇博客,写的不是很好,但对于很多爬虫学习者还是很有意义的,也曾在评论区和好多学习者交流,一万多阅读的文章被十多个网站或者个人盗版发到其他平台,现在原版已修改,我成了盗版,没有人知道我是原作者,我也无可奈何!愿这篇文章还能跟大家见面!
本博文被很多人盗版,如需转载,请附上原文链接!

目录

    • 📋 个人简介
  • 概述
    • 环境
    • 相关模块
    • 思路
    • 代码
  • 结语

概述

每到放假过节的时候,很多人总是对于抢不到车票而烦恼,那么经过我几个小时的不懈努力,完成了基于python 的抢票脚本,现在分享给大家。

环境

python 3.7
谷歌浏览器
chromedriver.exe(浏览器驱动程序,要与浏览器版本对应,并将其添加到环境变量或放到当前py文件所在目录下)

相关模块

time (用于某些地方对程序的强制等待)
datatime (用于获取当前时间)
selenium 3.1 自动化测试模块,这里用于操作浏览器)

思路

  1. 首先进行登录(支持手机扫码),登录完成进入页面之后,我们会看到有“温馨提示”的弹窗,即当前界面,我们需要处理第一次弹窗,

  2. 然后进入到菜单栏车票下的单程中(鼠标移动触发事件),到达当前页面,处理第二次弹窗

  3. 处理完后就是信息的输入,在这里日期的输入不是输入框,是鼠标点击,在代码中已处理,输入完成后,查询列车信息(我写的只能查询动车以及火车的二等座),如果有票,则预约,然后进入新的页面。

  4. 处理乘车人信息(由于本人是学生,此代码也可抢学生票),最后提交订单。

其实说明白了,就是通过代码让浏览器模拟人来操作浏览器,从而实现购票,要求要对selenium这个模块掌握的熟练。不说了,直接上代码,量有点大,各位道友一定要撑住哈。

代码

import time
import datetime
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class Qiangpiao():def __init__(self,from_station,to_station,depart_time,train_num,passenger):self.login_url = 'https://kyfw.12306.cn/otn/resources/login.html'self.init_my_url = 'https://kyfw.12306.cn/otn/view/index.html'self.order_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'# input("出发地:")self.from_station = from_station# input("目的地:")self.to_station = to_station# 时间格式必须是M-d的方式# input("出发时间(格式必须是M-d的方式):")self.depart_time = depart_time# input("列车号:")self.train_num = train_numself.passenger = passenger#获取当前月份self.now_month = datetime.date.today().monthself.leave_month = int(self.depart_time.split('-')[0])self.leave_day = int(self.depart_time.split('-')[1])self.driver = webdriver.Chrome()def _login(self):self.driver.get(self.login_url)# 窗口最大化#self.driver.maximize_window()# 设置窗口大小self.driver.set_window_size(1300,800)#print('调整前尺寸:', self.driver.get_window_size())#显式等待#这里进行手动登录,可以扫码,也可以输入账号密码点击登录WebDriverWait(self.driver,1000).until(EC.url_to_be(self.init_my_url))print('登录成功!')def _pop_window(self):time.sleep(1)self.driver.find_element_by_xpath('//*[@class="dzp-confirm"]/div[2]/div[3]/a').click()def _enter_order_ticket(self):action = ActionChains(self.driver)   # 实例化一个动作链对象element = self.driver.find_element_by_link_text('车票')# 鼠标移动到 '车票' 元素上的中心点action.move_to_element(element).perform()# 点击'单程'self.driver.find_element_by_xpath('//*[@id="J-chepiao"]/div/div[1]/ul/li[1]/a').click()# 消除第二次弹窗self.driver.find_element_by_link_text('确认').click()def _search_ticket(self):#出发地输入self.driver.find_element_by_id("fromStationText").click()self.driver.find_element_by_id("fromStationText").send_keys(self.from_station)self.driver.find_element_by_id("fromStationText").send_keys(Keys.ENTER)#目的地输入self.driver.find_element_by_id("toStationText").click()self.driver.find_element_by_id("toStationText").send_keys(self.to_station)self.driver.find_element_by_id("toStationText").send_keys(Keys.ENTER)#出发日期输入self.driver.find_element_by_id("date_icon_1").click()if self.leave_month == self.now_month:xpath_str = f"/html/body/div[37]/div[1]/div[2]/div[{self.leave_day}]"if EC.element_to_be_clickable((By.XPATH, xpath_str)):self.driver.find_element_by_xpath(xpath_str).click()else:print("当前日期未到或已过售票日期,无法购票!")elif self.leave_month == self.now_month + 1:xpath_str = f"/html/body/div[37]/div[2]/div[2]/div[{self.leave_day}]"if EC.element_to_be_clickable((By.XPATH, xpath_str)):self.driver.find_element_by_xpath(xpath_str).click()else:print("当前日期未到或已过售票日期,无法购票!")else:print("月份超前一个月以上,无法购票!")#等待查询按钮是否可用WebDriverWait(self.driver,1000).until(EC.element_to_be_clickable((By.ID,"query_ticket")))#执行点击事件search_btn = self.driver.find_element_by_id("query_ticket")search_btn.click()#等待查票信息加载WebDriverWait(self.driver, 1000).until(EC.presence_of_element_located((By.XPATH, '//*[@id="queryLeftTable"]/tr')))def _order_ticket(self):train_num_list = []  # 列车号列表train_num_ele_list = self.driver.find_elements_by_xpath('//tr/td[1]/div/div[1]/div/a')  # 列车号元素列表for t in train_num_ele_list:    # 遍历列车号元素列表,并把列车号添加到列车号列表train_num_list.append(t.text)tr_list = self.driver.find_elements_by_xpath('//*[@id="queryLeftTable"]/tr[not(@datatran)]')  #每一列列车整行信息列表,列车号元素是tr的子元素if self.train_num in train_num_list:for tr in tr_list:train_num = tr.find_element_by_xpath("./td[1]/div/div[1]/div/a").text  #取出元素tr里的列车号if self.train_num == train_num:#动车二等座余票信息text_1 = tr.find_element_by_xpath("./td[4]").text# 火车二等座余票信息text_2 = tr.find_element_by_xpath("./td[8]").textif (text_1 == "有" or text_1.isdigit()) or (text_2 == "有" or text_2.isdigit()):#点击预订按钮order_btn = tr.find_element_by_class_name("btn72")order_btn.click()#等待订票页面WebDriverWait(self.driver,1000).until(EC.url_to_be(self.order_url))# 选定乘车人self.driver.find_element_by_xpath(f'//*[@id="normal_passenger_id"]/li/label[contains(text(),"{self.passenger}")]').click()#如果乘客是学生,对提示点击确定if EC.presence_of_element_located((By.XPATH, '//div[@id="dialog_xsertcj"]')):self.driver.find_element_by_id('dialog_xsertcj_ok').click()# 提交订单self.driver.find_element_by_id('submitOrder_id').click()time.sleep(2)# 点击确认订单self.driver.find_element_by_id('qr_submit_id').click()else:# 提交订单self.driver.find_element_by_id('submitOrder_id').click()time.sleep(2)# 点击确认self.driver.find_element_by_id('qr_submit_id').click()print("购票成功!")breakelse:print("二等座无票!")else:print("无此列车!")def run(self):#登录self._login()#消除登录后(第一次)的弹窗self._pop_window()#进入购票页面self._enter_order_ticket()#查票self._search_ticket()#订票self._order_ticket()#关闭浏览器time.sleep(6)self.driver.quit()if __name__ == '__main__':qiangpiao = Qiangpiao("兰州","乌鲁木齐","8-6","D55","小红")qiangpiao.run()

结语

看到这里你们有么有崩溃,哈哈哈,事实上作为一名计算机系的大学生,我们一定要脚踏实地,多实践多敲代码,切记,在学习过程中一定要自己动手敲,这个世界运行的底层逻辑不是白piao,是价值捆绑,作为程序员要多思考思考底层逻辑,形成闭环思维。

同时你们是否有疑惑,这程序运行一次怎么抢票,事实上代码运行是比手操作快的,而且,你完全可以设置一个for循环,然后设置一个时间(time)间隔,让其每隔一段时间运行一次,直到抢票成功时停止,让其运行个几天,这样票刚一发售,程序会立马抢到,从而实现真正意义上的抢票,同时,还有许多内容可以完善,比如座位种类,乘客多选,以及做模拟登录然后隐藏浏览器(无头浏览器了解一下)等等,有兴趣的可以试试哦!

看到这里,可以给我点个赞,点个关注吗,我的第一篇博客,请支持一下哦,你们的支持是我前进的动力,关注我,跟我一起学python~💖。

本博文被很多人盗版,如需转载,请附上原文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37954.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你用python一键抢12306火车票(附代码)

哈喽,哈喽~,一年一度的抢火车票大战正式拉开序幕… 然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现一票难求!想回趟家真难! 那么作为程序猿的你,当然要用程序猿的…

chatgpt赋能python:Python怎么抢票?

Python怎么抢票? Python是一种伟大的编程语言,因为它可以使我们的生活更加便利。有10年python编程经验的工程师会告诉你,利用Python编程可以轻松地抢到大热节目或演出的票。本文将介绍使用Python编写抢票机器人的方法。 概述 抢票机器人是…

chatgpt赋能python:Python自动抢票:让你的购票经历更加简单便捷!

Python自动抢票:让你的购票经历更加简单便捷! 随着互联网的发展,越来越多的人选择在网上购买火车、飞机等交通工具的票。但是,一些火爆的车次、航班往往在开售后仅仅几秒钟内就被抢完,让很多想出行的人非常苦恼。在这…

基于微信小程序的餐厅点餐软件设计及开发

目 录 摘要 I Abstract II 1 前言 1 1.1 选题背景 1 1.2 研究的目的和意义 1 2 相关技术简介 3 2.1 系统的实现架构 3 2.2 系统使用的技术 3 2.2.1 Eclipse 3 2.2.2 Java 4 2.2.3 MySQL简介 5 2.2.4 微信小程序简介 6 2.3 系统使用的开发环境 6 3 系统需求分析 7 3.1 功能需求 …

餐饮行业移动管理系统—Pad点餐系统

餐饮行业移动管理系统—Pad点餐系统 员工可通过PC端查询或管理饭店信息,即使更新信息,客户可以进行方便快捷的点菜操作。 功能要求: PC端功能:管理菜谱,餐厅,员工,订单信息;服务端…

基于Android移动终端的微型餐饮管理系统的设计与实现2-侧滑菜单

上周发了《 基于Android移动终端的微型餐饮管理系统的设计与实现》第一章,虽然是个简介,但是居然上了首页推荐,还有朋友评论了。写了这么久CSDN,还是第一次有人评论我的文章,真是受宠若惊,长期以来,我一直都以为,我玩的是CSDN单机版。当然,这也说明,我过去写的东西都…

安卓移动开发技术--微信界面设计

1.内容:请根据课程实现App门户界面框架设计,至少包含4个tab页,能实现tab页之间的点击切换; 2.技术:使用布局和分段,对控件进行点击监听 实现界面展示: 一.界面布局分析 1.先对button.xml界面…

移动开发--类vx界面

一、开发目标 创建一个类似vx的界面,具有vx、通讯录、发现、我 四个tab,可通过点击实现切换 二、代码解析 写4个tab,用作vx 、通讯录、发现、我四个界面 一个top.xml 一个bottom.xml 一个framelayout作为容器 mainactivity如下&#x…

【餐厅点餐平台|四】UI设计+效果展示

餐厅点餐平台导航 【餐厅点餐平台|一】项目描述需求分析 https://blog.csdn.net/weixin_46291251/article/details/126414430 【餐厅点餐平台|二】总体设计 https://blog.csdn.net/weixin_46291251/article/details/126422811 【餐厅点餐平台&#xff5…

【餐饮】智慧餐厅原型模板,餐饮APP,餐饮后台管理系统,Axure设计餐饮APP

软件版本:Axure 8.0(兼容9和10) 作品介绍: 作品包括用户端、员工端以及商户管理(后台管理) 客户端: 外卖点餐:菜品列表、菜品详情、确认订单、地址管理、修改电话、支付订单 堂食点…

基于Androidstudio餐厅点餐选座系统

完成“餐厅点餐系统”的设计。餐厅点餐系统是一个适用于餐饮行业和消费者的软件,顾客可以使用该系统自动点餐,也可到店后由服务人员点餐,系统管理员进行后台管理。 build.gradle (Module: app) 包含当前项目的applicationId、最小适配的Andro…

【花雕学AI】ChatGPT能用表情包猜电影,你能猜出来吗?揭秘它的神奇「涌现」能力

关于作者斯蒂芬 我是田纳西州纳什维尔的一名科学作家,负责数学、物理学、天文学和癌症研究。我的书Math Art: Truth, Beauty, and Equations 将于 2019 年 4 月出版。我在后院改建的办公室棚子里工作。我是范德比尔特大学的驻校作家,教授科学传播课程。 …

chatgpt赋能python:Python数据分析中如何快速取到一列数据

Python 数据分析中如何快速取到一列数据 在 Python 数据分析中,我们经常需要取到表格中的某一列数据进行分析或可视化。下面介绍了几种方法,可帮助您快速有效地取得所需要的数据。 1. 使用 Pandas 包获取数据 Pandas 是 Python 中非常常用的数据分析库…

【花雕学AI】09:发挥ChatGPT最大潜力——产生高质量内容的九种方法和建议

人工智能(AI)是当今科技领域最热门和最有前景的话题之一,它已经渗透到了我们生活和工作的方方面面,给我们带来了许多便利和惊喜。而在AI的众多分支中,自然语言处理(NLP)是最贴近人类的一个领域&…

AI教父Hinton与OpenAI CEO Sam Altman领头预警:AI可能灭绝人类!

整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 经过不到一年的时间,AI 的发展超乎所有人的想象,也大有失控的风险。 就在今天,全球部分顶尖的 AI 研究员、工程师和 CEO 就他们认为 AI 对人类构成的生存威胁发出了新…

多位知名学者最新警告「AI 可能灭绝人类」,ChatGPT 之父和 AI 教父都参与联名,如何理解?

警告“AI可能灭绝人类”是指一些知名学者和专家对于未来人工智能发展的担忧,他们认为如果AI发展得不受控制,可能会导致人类的灭绝。其中,ChatGPT之父和AI教父分别指的是OpenAI的创始人和AI领域的一些权威人物。 这种担忧主要源于以下几个方…

什么是ChatGPT?GPT4和3.5有什么不同

相信今天大家都被GPT刷屏了,我可以使用GPT帮我写文章框架,诗歌,作文等等。 那么,GPT究竟是什么呢? ChatGPT全称为“chat Generative Pre-trained Transformer”,翻译成中文就是生成型预训练变换模型&#…

不直播不露脸也能做短视频变现,想挣点生活费试试这些玩法

大家好,我是我赢助手短视频运营,最近一直有小伙伴问我,做了好久的短视频一直不赚钱,今天总结了一下,做了90天短视频还没赚了试试这5种易变现的玩法。 新手不直播不露脸也能做短视频变现,想在斗音挣点生活费…

实不相瞒,我做海外TikTok搬运视频一年的收入,可能是你10年的工资

被疫情偷走的这几年,听到的关键词几乎都是“难”,“很难”,“非常难”。 裁员成常态,收入大缩水,但花钱的地方却越来越多。 天天熬,夜夜熬。 最终换来的,是口袋空荡荡,日子紧巴巴。 …

短视频获客达人软件详情,精准截流app

互联网99%的项目离不开流量,流量所在之处,必有金钱相随。对于创业者来讲,更要注重精准引流的积累,或许引流没泛流量简单粗暴,但是賺钱更简单,选择互联网创业不是急功近利的儿戏,创业项目就应该有…