python利用selenium实现大麦网抢票

一、selenium原理介绍

    Selenium是一个用于Web[应用程序](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%25BA%2594%25E7%2594%25A8%25E7%25A8%258B%25E5%25BA%258F%2F5985445%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/5985445?fromModule=lemma_inlink")测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括[IE](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FIE%2F69103%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/IE/69103?fromModule=lemma_inlink")(7, 8, 9, 10, 11),[Mozilla Firefox](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FMozilla%2520Firefox%2F3504923%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Mozilla%20Firefox/3504923?fromModule=lemma_inlink"),[Safari](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FSafari%2F597%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Safari/597?fromModule=lemma_inlink"),[Google](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FGoogle%2F86964%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Google/86964?fromModule=lemma_inlink") [Chrome](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FChrome%2F5633839%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Chrome/5633839?fromModule=lemma_inlink"),[Opera](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FOpera%2F25140%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Opera/25140?fromModule=lemma_inlink"),[Edge](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FEdge%2F16194485%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Edge/16194485?fromModule=lemma_inlink")等。这个工具的主要功能包括:测试与浏览器的[兼容性](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%2585%25BC%25E5%25AE%25B9%25E6%2580%25A7%2F1446869%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/%E5%85%BC%E5%AE%B9%E6%80%A7/1446869?fromModule=lemma_inlink")——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试[系统功能](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E7%25B3%25BB%25E7%25BB%259F%25E5%258A%259F%25E8%2583%25BD%2F10394740%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/%E7%B3%BB%E7%BB%9F%E5%8A%9F%E8%83%BD/10394740?fromModule=lemma_inlink")——创建[回归测试](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%259B%259E%25E5%25BD%2592%25E6%25B5%258B%25E8%25AF%2595%2F1925732%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95/1925732?fromModule=lemma_inlink")检验软件功能和[用户需求](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E7%2594%25A8%25E6%2588%25B7%25E9%259C%2580%25E6%25B1%2582%2F56497046%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/%E7%94%A8%E6%88%B7%E9%9C%80%E6%B1%82/56497046?fromModule=lemma_inlink")。支持自动录制动作和自动生成.Net、[Java](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FJava%2F85979%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Java/85979?fromModule=lemma_inlink")、[Perl](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2FPerl%2F851577%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/Perl/851577?fromModule=lemma_inlink")等不同语言的[测试脚本](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E6%25B5%258B%25E8%25AF%2595%25E8%2584%259A%25E6%259C%25AC%2F10921546%3FfromModule%3Dlemma_inlink "https://baike.baidu.com/item/%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC/10921546?fromModule=lemma_inlink")。(来源于百度百科)在这里,我们使用python调用selenium进行编程实现。

二、具体实现

    本次实现使用python3.10版本

1. 导入项目需要的外部包

     这里导入selenium包与改包中的By包。(因为使用了最新的selenium语法,需要使用By包中的类)
javascript
复制代码
import os
import time
import pickle
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

2. 设置需抢票页面

ini
复制代码
# 大麦网主页
damai_url = "https://www.damai.cn/"
# 登录页
login_url = "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F"
# 抢票目标页
target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.home.card_0.ditem_2.591b23e1HR8K6w&id=762298097902'
    这里的目标页为我随便选择的一个,大家可根据自己的需要修改抢票目标页。

3. 定义具体类

    需要注意文章中的所有方法都是在该类下定义的方法。
ruby
复制代码
class Concert:def __init__(self):self.status = 0         # 状态,表示如今进行到何种程度self.login_method = 1   # {0:模拟登录,1:Cookie登录}自行选择登录方式self.driver = webdriver.Chrome()       # 默认Chrome浏览器

4. 通过cookie进行登陆

    这个方法调用是在Concert类中login_method = 1是才会使用到,便于快速登陆,省去登陆过程,其中初次运行代码时,用户登陆后会在本地生成cookies.pkl文件来存储cookie信息,用于快速登陆。
python
复制代码def set_cookie(self):self.driver.get(damai_url)print("###请点击登录###")while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:sleep(1)print('###请扫码登录###')while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':sleep(1)print("###扫码成功###")pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))print("###Cookie保存成功###")self.driver.get(target_url)def get_cookie(self):try:cookies = pickle.load(open("cookies.pkl", "rb"))  # 载入cookiefor cookie in cookies:cookie_dict = {'domain':'.damai.cn',  # 必须有,不然就是假登录'name': cookie.get('name'),'value': cookie.get('value')}self.driver.add_cookie(cookie_dict)print('###载入Cookie###')except Exception as e:print(e)

4. 登陆

    在登录后页面会跳转至所选演唱会详情界面
python
复制代码def login(self):if self.login_method == 0:self.driver.get(login_url)# 载入登录界面print('###开始登录###')elif self.login_method == 1:if not os.path.exists('cookies.pkl'):# 如果不存在cookie.pkl,就获取一下self.set_cookie()else:self.driver.get(target_url)self.get_cookie()

5. 打开浏览器

python
复制代码def enter_concert(self):"""打开浏览器"""print('###打开浏览器,进入大麦网###')self.driver.maximize_window()           # 最大化窗口# 调用登陆self.login()                            # 先登录再说# self.driver.refresh()                   # 刷新页面self.status = 2                         # 登录成功标识print("###登录成功###")

6. 选择票型

    选择具体票型部分未写,该部分可由读者们自行添加,不添加的话,自行选择进入页面后大麦的默认选择。
python
复制代码def choose_ticket(self):if self.status == 2:                  #登录成功入口print("="*30)print("###检查是否开始售票###")while not self.isElementExistByClass('buy-link'):self.driver.refresh()print("###售票尚未开始,刷新等待开始###")#TODO 选择票型#========begin=========#========end===========self.driver.find_element(By.CLASS_NAME, 'buy-link').click()    #点击购票二维码下的购买连接time.sleep(1.5)self.check_order()
   通过观察目前(2024.1.27)PC端浏览器中大麦的购票流程,进入演唱会详情界面后若已经开售则会出现购票二维码,推荐使用手机支付,在其下有个浏览器支付的连接,点击后才会进入订单确定界面。这里的time.sleep不能删去,在Http请求响应完成之前,直接执行下面的操作的话会出现错误,所以这里选择sleep,让HTTP响应能够完成,页面完成加载。

7. 确认订单

lua
复制代码def check_order(self):if self.status == 2:print('###开始确认订单###')if self.driver.title == '订单确认页':print('###检查是否需要填写观影人')if self.isElementExistByXPATH('//*[@id="dmViewerBlock_DmViewerBlock"]'):self.driver.find_element(By.XPATH, '//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div').click()time.sleep(0.5)print('###跳转支付选择界面###')self.driver.find_element(By.XPATH, '//*[@id="dmOrderSubmitBlock_DmOrderSubmitBlock"]/div[2]/div/div[2]/div[2]/div[2]').click()time.sleep(2)self.pay_order()
     跳转至支付界面后,系统仍然会推荐使用手机支付宝支付,在这里我们选择中间的在浏览器支付,这样会跳转至支付宝登陆界面。

8. 支付宝登陆支付

scss
复制代码def pay_order(self):if self.driver.title == "支付宝付款":print('###支付订单###')if self.isElementExistByXPATH('//*[@id="app"]/div[3]/div[1]/button[2]'):self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div[1]/button[2]').click()print('###跳转至浏览器支付###')time.sleep(1.5)self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/div[1]/div[2]/input').clear()self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/div[1]/div[2]/input').send_keys('支付宝账号')      #输入支付宝账号self.driver.find_element(By.XPATH, '//*[@id="app"]/div[3]/div/button').click()time.sleep(1.5)self.driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/button').click()while True:time.sleep(1)print('###请输入支付密码###')
    大家需要使用时将支付宝账号改为自己的账号。这个方法主要是跳转至支付宝登录界面后自动填写支付宝账号,首先填写账号后会跳转至手机短信发送, 此时我们选择下面的支付密码,然后跳转至支付密码的输入。由于支付密码过于隐私,此处未实现自动输入支付密码(不然测试时直接付款了哭都来不及)。

9. 脚本结束退出

ruby
复制代码def finish(self):self.driver.quit()

10. main方法

ini
复制代码
if __name__ == '__main__':try:con = Concert()  # 具体如果填写请查看类中的初始化函数con.enter_concert()  # 打开浏览器con.choose_ticket()  # 开始抢票except Exception as e:print(e)con.finish()

三、机器检测问题

    看到这里的小伙伴们呢应该在运行上述代码时发现了,在登陆后进入确定订单时,大麦会进行机器检测的情况,而且自己手动验证无法通过。这个情况涉及到了机器人检测。这个程序的本质是使用测试工具进行抢票操作,使用的driver会被识别为机器人,无法欺骗到检测程序,这里我们使用stealth.min.js进行解决。具体请看文章[利用stealth.min.js隐藏selenium特征 - Python-CSDN博客](https://link.juejin.cn/?target=https%3A%2F%2Fblog.csdn.net%2Fw11231%2Farticle%2Fdetails%2F124138215 "https://blog.csdn.net/w11231/article/details/124138215")。

四、总结

    该程序利用了selenium自动测试工具实现了抢票的一个简单脚本,相当于是对抢票功能的一个测试用例,但用在了具体抢票这件事上。同时提醒读者,该脚本在目前的大麦网上能够实现该功能,由于使用了XPATH的定位方式,若大麦网进行页面UI更改时,需要在新界面的基础上修改程序中的XPATH。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【前端素材】推荐优质后台管理系统Uena平台模板(附源码)

一、需求分析 后台管理系统(或称作管理后台、管理系统、后台管理平台)是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成,为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

Folx Pro Mac中文p破解版如何使用?为您带来Folx Pro 详细使用教程!

​ Folx pro 5 中文版是mac上一款功能强大的老牌加速下载软件,新版本的Folx pro整体界面非常的简洁和漂亮,具有非常好用的分类管理功能,支持高速下载、定时下载、速度控制、iTunes集成等功能。Folx pro兼容主流的浏览器,不但可以下…

面试redis篇-08数据淘汰策略

原理 当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。 Redis支持8种不同策略来选择要删除的key: noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是…

机器学习——线性代数中矩阵和向量的基本介绍

矩阵和向量的基本概念 矩阵的基本概念(这里不多说,应该都知道) 而向量就是一个特殊的矩阵,即向量只有一列,是个n*1的矩阵 注:一般矩阵用大写字母表示,向量用小写字母表示 矩阵的加减运算 两个…

计网Lesson14 - 传输层协议头分析

文章目录 1. 传输层概述1.1 传输层的作用1.2 传输层中两个重要协议1.2.1 TCP1.2.2 UDP1.2.3. 因特网中典型应用使用的运输层协议 1.3 运输层端口号1.4 UDP和TCP的对比 2. UDP报文段格式UDP首部构成 3. TCP报文段格式TCP首部构成序号和确认号的计算 1. 传输层概述 1.1 传输层的…

Typora结合PicGo + 使用Github搭建个人免费图床

文章目录 一、国内图床比较二、使用Github搭建图床三、PicGo整合Github图床1、下载并安装PicGo2、设置图床3、整合jsDelivr具体配置介绍 4、测试5、附录 四、Typora整合PicGo实现自动上传 每次写博客时,我都会习惯在Typora写好,然后再复制粘贴到对应的网…

数据结构--双向链表专题

目录 1. 双向链表的结构2. 实现双向链表预先的准备初始化尾插、头插尾删、头删查找在pos位置之后插⼊数据删除pos位置的数据 3. 顺序表和双向链表的分析 1. 双向链表的结构 注意:这里的“带头”跟前面我们说的“头结点”是两个概念,为了更好的理解直接称…

【教程】 iOS混淆加固原理篇

目录 摘要 引言 正文 1. 加固的缘由 2. 编译过程 3. 加固类型 1) 字符串混淆 2) 类名、方法名混淆 3) 程序结构混淆加密 4) 反调试、反注入等一些主动保护策略 4. 逆向工具 5. OLLVM 6. IPA guard 7. 代码虚拟化 总结 摘要 本文介绍了iOS应用程序混淆加固的缘由…

文献阅读:Transformers are Multi-State RNNs

文献阅读:Transformers are Multi-State RNNs 1. 内容简介2. 方法介绍 1. 基础回顾 1. RNN2. Transformer 2. Transformer解构 1. MSRNN2. Transformer 3. TOVA 1. 现有转换策略2. TOVA 3. 实验考察 & 结论 1. 实验设计2. 实验结果 1. LM2. 长文本理解3. 文本生…

Window部署Exceptionless

Exceptionless Elasticsearch 版本: Exceptionless:8.1.0 Elasticsearch:7.17.5 JDK:11.0.10 目录 一、Elasticsearch运行 二、 Exceptionless 一、Elasticsearch运行 bin目录下elasticsearch.bat 直接运行 访问 http://lo…

【10】知识图谱实战案例(动手做)

目录 案例1:使用neo4j构建小型金融行业知识图谱 案例2:基于金融知识图谱的问答机器人 案例3:基于金融知识图谱的企业风险挖掘 案例4:使用MRC技术完成事件抽取 案例5:基于法律领域的知识图谱 案例【6】&#xff1a…

电路设计(30)——二进制转十进制电路的Multisim仿真

1.设计要求 输入8位二进制数据,输出三位十进制,将转换后的数据显示在数码管上。 2.电路设计 此时输入为0111_1111,结果为127,正确。 3.芯片介绍 74191芯片是一款4位二进制同步上升/下降计数器,它属于TTL(…

线程普通任务执行流程

(1)先判断是否存在空闲线程,存在直接分配,不存在执行(2); (2)判断工作线程数量小于核心数量,未超出创建核心线程执行线程任务,超出执行&#xff…

k8s笔记26--快速实现prometheus监控harbor

k8s笔记26--快速实现prometheus监控harbor 简介采集指标&配置grafana面板采集指标配置grafana面板 说明 简介 harbor是当前最流行的开源容器镜像仓库项目,被大量IT团队广泛应用于生产、测试环境的项目中。本文基于Harbor、Prometheus、Grafana介绍快速实现监控…

查看ubuntu系统的版本信息(3个方法)

查看发现版本信息 lsb_release -a发行版本:Ubuntu 16.04.6 LTS 查看内核和系统位数信息 uname -a内核信息:Linux prod.aixundian.gpu-0 4.4.0-151-generic系统位数:x86_64 查看内核和编译信息 cat /proc/version内核信息:Lin…

林浩然与杨凌芸的Scala编程历险记:变量与数据类型的魔法对决

林浩然与杨凌芸的Scala编程历险记:变量与数据类型的魔法对决 在Scala世界的梦幻殿堂中,两位英勇的程序员——林浩然和杨凌芸正准备开启一场代码之旅。这次,他们将深入探索Scala王国中的变量奥秘与数据类型丛林。 一、变量声明篇 &#xff0…

【Prometheus】概念和工作原理介绍

目录 一、概述 1.1 prometheus简介 1.2 prometheus特点 1.3 prometheus架构图 1.4 prometheus组件介绍 1、Prometheus Server 2、Client Library 3、pushgateway 4、Exporters 5、Service Discovery 6、Alertmanager 7、grafana 1.5 Prometheus 数据流向 1.6 Pro…

2024国际生物发酵展览会独家解读-力诺天晟科技

参展企业介绍 北京力诺天晟科技有限公司,专业致力于智能仪器仪表制造,工业自动控制系统用传感器、变送器的研发、设计、销售和服务。 公司坐落于首都北京行政副中心-通州区,下设生产子公司位于河北香河经济开发区,厂房面积 300…

恢复软件哪个好用?记好这3个文件恢复宝藏!

“现在市面上的恢复软件太多啦!哪款恢复软件比较好用呢?大家可以给我推荐几个靠谱的恢复软件或者方法吗?感谢!” 在日常使用电脑的过程中,文件丢失或删除是一个常见的问题,而恢复软件成为解决这一问题的得力…

B端系统美观和易用上的缺失,该如何补位?

Hi,我是贝格前端工场的老司机,客户对B端系统的界面和体验要求越来越高,但是很多系统在上线之后有很多缺失,本文就列举缺失现象,给出一些补位策略,欢迎友友们支持关注我。 一、缺失的具体表现 在B端系统中…