Python脚本抢票【笔记】

Python脚本抢票【笔记】

  • 前言
  • 版权
  • 推荐
  • Python脚本抢票【Python】
  • microsoft edge驱动器下载以及使用
  • 最后

前言

2024-4-17 18:19:15

以下内容源自《【笔记】》
仅供学习交流使用

版权

禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://jsss-1.blog.csdn.net
禁止其他平台发布时删除以上此话

推荐

打响春运第一枪,为购票做准备,用Python制作一个12306抢票脚本!

python最新抢票脚本

Python脚本抢票【Python】

试了一下,没有实现。

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("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("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,"panel_cities").find_element(By.CLASS_NAME,self.from_station).send_keys(Keys.ENTER)# self.driver.find_element(By.ID,"fromStationText").send_keys(Keys.ENTER)# city_elements=self.driver.find_element(By.ID,"panel_cities").find_element(By.XPATH, "//span[contains(text(), '西安')]")# # 循环遍历找到的元素,点击符合条件的元素# for element in city_elements:#     if element.text == self.from_station:#         element.click()#目的地输入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,"train_date").click()if self.leave_month == self.now_month:xpath_str = f"//div[@class='cal-wrap']/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"//div[@class='cal-wrap']/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("西安","绥德","4-30","K214","姬烁")qiangpiao.run()'''
[python最新抢票脚本]
(https://blog.csdn.net/qq_57421630/article/details/119152956)
'''

microsoft edge驱动器下载以及使用

microsoft edge驱动器下载以及使用

在这里插入图片描述

最后

2024-4-27 15:50:10

迎着日光月光星光,直面风霜雨霜雪霜。

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

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

相关文章

容器工作流

背景 目前某平台使用计算容器和解析容器,这两种容器目前通过rabbitmq消息来进行链接,形成容器工作流,使用容器工作流框架可以省去两个容器中间环节的控制,不需要再使用java代码对容器的操作,通过容器工作流框架即可控…

SpringMVC进阶(数据格式化以及数据校验)

文章目录 1.数据格式化1.基本介绍1.基本说明2.环境搭建 2.基本数据类型和字符串转换1.需求分析2.环境搭建1.data_valid.jsp首页面2.Monster.java封装请求信息3.MonsterHandler.java处理请求信息4.monster_addUI.jsp添加妖怪界面5.单元测试 3.保存妖怪信息1.MonsterHandler.java…

路由嵌套是什么?怎么进行路由嵌套

路由嵌套: 此时我们从一个组件切换到另一个组件时,会直接跳转页面,所以我们需要一个东西让组件们可以在一个页面显示,这时候就需要进行路由嵌套。我们要找到组件之间的关系,大组件嵌套小组件,从大组件中打…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242.有效的字母异位词 字符串仅包含小写字母,那么可以使用数组声明26位大小,遍历其中一个字符串,记录字符的个数,然后遍历另一个字符串,减去相应字符,最后都为0则符合条件 class Solution:def isAnagram(…

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云:跨地域服务器通信(上) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

构建数据驱动的文化价值体系,还得靠数据分析

在您的业务中创建以数据为中心的文化需要思维方式的转变,这不会在一夜之间发生。但是,这是一个目标变得越来越容易实现,这是由您的员工以激情和热情朝着这个目标努力的驱动力所驱使的,而不是高层要求他们这样做的目标。 有多种因…

Redis面试题超详细(2024最新)

1、Redis是单线程执行还是多线程执行?它有线程安全问题吗?为什么吗? Redis版本在6.0之前都是使用的单线程运行的。所有的客户端的请求处理、命令执行以及数据读写操作都是在一个主线程中完成得。这种设计目的就是为了防止多线程环境下的锁竞争…

git变更远端仓库名之后如何修改本地仓库配置的另一种方法?(删remote指针、添加、绑定master)

背景 如果某个远端的仓库地址变化后,本地仓库可以修改对应的remote。 之前谈过几种方法,比如重新设置一个新的remote的指针,绑定到新地址。然后删除origin,然后把新指针mv到origin。比如直接seturl修改(git remote se…

深度学习从入门到精通——词向量介绍及应用

词向量介绍 词向量(Word embedding),即把词语表示成实数向量。“好”的词向量能体现词语直接的相近关系。词向量已经被证明可以提高NLP任务的性能,例如语法分析和情感分析。词向量与词嵌入技术的提出是为了解决onehot的缺陷。它把…

ESP32-S3的MQTT实战

昨天,我们讲了socket通信,当服务器和客户端建立起连接时,就可以互相通信了。在互联网应用大多使用WebSocket接口来传输数据。而在物联网的应用中,常常出现这种情况:海量的传感器,需要时刻保持在线&#xff…

微信小程序[黑马笔记]

简介 常用组件 视图组件 <!--pages/list/list.wxml--><scroll-view class"container1" scroll-y><view>A</view><view>B</view><view>A</view></scroll-view><!--pages/list2/list.wxml--><swiper …

❤mac使用Idea工具

❤mac使用Idea工具 1、安装 直接跳过&#xff0c;文章有 &#xff08;点击跳转&#xff09; 给自己的mac系统上安装java环境 2、使用 快捷键 Command , 系统首选项 设置Idea连接数据库 打开右侧的database&#xff08;或菜单里&#xff09;连接数据库&#xff0c;根据提…

ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types]

编译环境 Apple M1 Pro Sonoma 14.1.2 编译的时候出现如下报错&#xff1a; libavcodec/aarch64/h264dsp_init_aarch64.c:84:38: error: incompatible function pointer types assigning to h264_weight_func (aka void (*)(unsigned char *, long, int, int, int, int)) from…

Ubuntu中的 Everything 搜索软件 ==> fsearch

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 在 Windows 中&#xff0c;我经常使用 Everything 来进行文件搜索&#xff0c;搜索效率比 Windows 自带的高出千百倍。 那么在 Ubuntu 系统中&#xff0c;有没有类似的软件呢&#xff1f;那必须有&#xff0c;它就是 FSearch 。…

安防监控/智能分析EasyCVR视频汇聚平台海康/大华/宇视摄像头国标语音GB28181语音对讲配置流程

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

libVLC 制作一款精美的播放器

1.简介 本文将简单介绍使用libVLC制作一款精美的播放器。 开发环境:Visual Studio + Qt插件。 Qt版本:Qt5.9。 libVLC版本:3.0.20。 以下是运行界面效果图:截取其中几张。 右键菜单,功能还是比较齐全。 2.ui界面构成 接下来简单介绍一下ui界面构成。 主界面由播放树…

Mac下使用homebrew管理多版本mysql同时启动

Mac下使用homebrew管理多版本mysql同时启动 思路 给每个版本分配不同的数据目录和配置文件即可 本文尝试了使用 brew 安装管理多个MySQL版本&#xff0c;同时运行、直接切换 安装 如果已有数据文件请自行备份以及使用 安装 mysql 5.7 brew install mysql5.7在 /opt/home…

开发 Chrome 浏览器插件入门

前言 简介 Chrome 插件是扩展 Chrome 浏览器的功能的软件程序。它们可以执行各种任务&#xff0c;例如阻止广告、增强隐私、添加新功能等等。 要开始编写 Chrome 插件&#xff0c;你需要掌握以下&#xff1a; 1.JavaScript语言 2.html 3.css 4.会使用chrome扩展开发手册…

Spring 2.x整合Activiti 7

https://www.cnblogs.com/dw3306/p/16121810.html 整合在线编辑 https://blog.csdn.net/weixin_41039677/article/details/117947327 引入依赖 <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId…

Git系列:Git Branch 用法总结

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…