一些无关紧要的哔哔:

大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域
今天,我们要用代码来实现他的购票过程

开搞!

先来看看完成后的效果是怎么样的

开发环境

  • 版 本:anaconda(python3.8.8)
  • 编辑器:pycharm

代码实现步骤

  • 实现免登陆
  • 选座并且下单

实现免登陆

  1. ###想要学习Python?Python学习交流群:660193417 满足你的需求,资料都已经上传群文件,可以自行下载!###
  2. damai_url = 'https://www.damai.cn/'
  3. # 登录
  4. login_url = 'https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F'
  5. # 抢票目标页
  6. target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.search_category.0.0.6ee64d156yMCV9&id=672706937093&clicktitle=%E7%95%99%E5%A3%B0%E7%8E%A9%E5%85%B72022%E3%80%8C%E6%97%B6%E9%97%B4%E7%9A%84%E8%B7%A8%E5%BA%A6%E3%80%8D%E5%B7%A1%E6%BC%94Vol%C2%B71%20%E9%95%BF%E6%B2%99%E7%AB%99'

初始化加载

  1. from selenium import webdriver # 操作浏览器的工具
  2. def __init__(self):
  3. self.status = 0 # 状态, 表示当前操作执行到了哪个步骤
  4. self.login_method = 1 # {0:模拟登录, 1:cookie登录}自行选择登录的方式
  5. self.driver = webdriver.Chrome(executable_path='chromedriver.exe') # 当前浏览器驱动对象

登录

  1. def login(self):
  2. if self.login_method == 0:
  3. self.driver.get(login_url)
  4. print('###开始登录###')
  5. elif self.login_method == 1:
  6. # 创建文件夹, 文件是否存在
  7. if not os.path.exists('cookies.pkl'):
  8. self.set_cookies() # 没有文件的情况下, 登录一下
  9. else:
  10. self.driver.get(target_url) # 跳转到抢票页
  11. self.get_cookie() # 并且登录

cookies: 登录网站时出现的

  1. ###想要学习Python?Python学习交流群:660193417 满足你的需求,资料都已经上传群文件,可以自行下载!###
  2. import time
  3. def set_cookies(self):
  4. self.driver.get(damai_url)
  5. print('###请点击登录###')
  6. # 我没有点击登录,就会一直延时在首页, 不会进行跳转
  7. while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:
  8. sleep(1)
  9. print('###请扫码登录###')
  10. # 没有登录成功
  11. while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
  12. sleep(1)
  13. print('###扫码成功###')
  14. # get_cookies: driver里面的方法
  15. pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))
  16. print('###cookie保存成功###')
  17. self.driver.get(target_url)

假如说我现在本地有 cookies.pkl 那么 直接获取

  1. ###想要学习Python?Python学习交流群:660193417 满足你的需求,资料都已经上传群文件,可以自行下载!###
  2. def get_cookie(self):
  3. cookies = pickle.load(open('cookies.pkl', 'rb'))
  4. for cookie in cookies:
  5. cookie_dict = {
  6. 'domain': '.damai.cn', # 必须要有的, 否则就是假登录
  7. 'name': cookie.get('name'),
  8. 'value': cookie.get('value')
  9. }
  10. self.driver.add_cookie(cookie_dict)
  11. print('###载入cookie###')

运行代码可以得到所需要的cookis,这样就可以实现免登录

打开浏览器

  1. ###想要学习Python?Python学习交流群:660193417 满足你的需求,资料都已经上传群文件,可以自行下载!###
  2. def enter_concert(self):
  3. print('###打开浏览器,进入大麦网###')
  4. # 调用登录
  5. self.login() # 先登录再说
  6. self.driver.refresh() # 刷新页面
  7. self.status = 2 # 登录成功标识
  8. print('###登录成功###')
  9. # 处理弹窗
  10. if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):
  11. self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()

实现购票

选票操作

  1. ###想要学习Python?Python学习交流群:660193417 满足你的需求,资料都已经上传群文件,可以自行下载!###
  2. def choose_ticket(self):
  3. if self.status == 2:
  4. print('=' * 30)
  5. print('###开始进行日期及票价选择###')
  6. while self.driver.title.find("确认订单") == -1:
  7. try:
  8. buybutton = self.driver.find_element_by_class_name('buybtn').text
  9. if buybutton == '提交缺货登记':
  10. self.status = 2 # 没有进行更改操作
  11. self.driver.get(target_url) # 刷新页面 继续执行操作
  12. elif buybutton == '立即预定':
  13. # 点击立即预定
  14. self.driver.find_element_by_class_name('buybtn').click()
  15. self.status = 3
  16. elif buybutton == '立即购买':
  17. self.driver.find_element_by_class_name('buybtn').click()
  18. self.status = 4
  19. elif buybutton == '选座购买':
  20. self.driver.find_element_by_class_name('buybtn').click()
  21. self.status = 5
  22. except:
  23. print('###没有跳转到订单结算界面###')
  24. title = self.driver.title
  25. if title == '选座购买':
  26. # 选座购买的逻辑
  27. self.choice_seats()
  28. elif title == '确认订单':
  29. # 实现下单的逻辑
  30. while True:
  31. # 如果标题为确认订单
  32. print('正在加载.......')
  33. # 如果当前购票人信息存在 就点击
  34. if self.isElementExist('//*[@id="container"]/div/div[9]/button'):
  35. # 下单操作
  36. self.check_order()
  37. break

选择座位

  1. def choice_seats(self):
  2. while self.driver.title == '选座购买':
  3. while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):
  4. print('请快速选择你想要的座位!!!')
  5. while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):
  6. self.driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/button').click()

下单操作

  1. def check_order(self):
  2. if self.status in [3, 4, 5]:
  3. print('###开始确认订单###')
  4. try:
  5. # 默认选第一个购票人信息
  6. self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
  7. except Exception as e:
  8. print('###购票人信息选中失败, 自行查看元素位置###')
  9. print(e)
  10. # 最后一步提交订单
  11. time.sleep(0.5) # 太快了不好, 影响加载 导致按钮点击无效
  12. self.driver.find_element_by_xpath('//*[@id="container"]/div/div[9]/button').click()

判断元素是否存在

  1. def isElementExist(self, element):
  2. flag = True
  3. browser = self.driver
  4. try:
  5. browser.find_element_by_xpath(element)
  6. return flag
  7. except:
  8. flag = False
  9. return flag

购票完成, 退出

  1. def finish(self):
  2. self.driver.quit()

Python selenium 实现大麦网自动购票过程的更多相关文章

  1. python+selenium生成测试报告后自动发送邮件

    标签(空格分隔): 自动化测试 运行自动化脚本后,会产生测试报告,而将测试报告自动发送给相关人员,能够让对方及时的了解测试情况,查看测试结果. 整个脚本包括三个部分: 生成测试报告 获取最新的测试报告 ...

  2. python+selenium+webdriver+BeautifulSoup实现自动登录

    from selenium import webdriverimport timefrom bs4 import BeautifulSoupfrom urllib import requestimpo ...

  3. python+selenium 模拟登陆,自动下单

    目前写的实在太粗糙,留着,以后来写上

  4. Python selenium Chrome正在受到自动软件的控制 disable-infobars无效 的解决方法

    问题解决 前两天更新了google浏览器版本,今天运行以前的脚本,发现options一个参数的配置不生效了. 运行了几次都发现该参数没有生效,也检查了自己的代码参数,没有写错,于是就有了这一波“网中寻 ...

  5. Python+Selenium学习笔记19 - 自动发送邮件

    发送简单的邮件 用一个QQ邮箱发送到另一个QQ邮件. 首先设置QQ邮箱,邮箱设置 -> 账号 开启SMTP服务,点击开启按钮,按提示进行操作,需要1毛钱的短信费.开启后如下所示 1 # codi ...

  6. python+splinter实现12306网站刷票并自动购票流程

    python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...

  7. Python + Selenium 自动发布文章(一):开源中国

    https://blog.csdn.net/qq_28804275/article/details/80891949 https://blog.csdn.net/qq_28804275/article ...

  8. 开源you-get项目爬虫,以及基于python+selenium的自动测试利器

    写在前面 爬虫和自动测试,对于python来说是最合适不过也是最擅长的. 开源的项目也很多,例如you-get项目https://github.com/soimort/you-get.盗链和爬虫神器. ...

  9. python+selenium自动测试之WebDriver的常用API(基础篇二)

    本篇介绍一下python+selenium复杂操作的处理,基于python3.6,selenium3.141,详细资料介绍查看官方API文档,点击这里 一.常见特殊情况处理如iframe/弹窗处理 有 ...

随机推荐

  1. React 日常记录

    以下是学习重点 原文地址 浏览器环境 JS解析和执行.绘制.事件处理.静态资源加载和处理 GUI渲染线程和Javascript线程 调度策略 先到先得(FCFS) 对短进程不利 对I/O密集不利 单处 ...

  2. jsp第六次作业

    1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8&quo ...

  3. .Net Core Razor动态菜单实现

    准备 1.框架 .netcore  版本 yishaadmin开源框架 2.模板 本文模板使用adminlte3.0,文档地址https://adminlte.io/docs/3.0/ 3.菜单表 关 ...

  4. [题解] 春荔(cut) | 贪心

    题目大意 有一个长度为 \(n\) 的非负整数序列 \(a_i\),每次可以选择一段区间减去 \(1\),要求选择的区间长度 \(\in[l,r]\),问最少多少次把每个位置减成 \(0\). 不保证 ...

  5. redis数据结构附录

    引言 本次对上一次的数据结构知识进行补充,主要有redis数据结构的相关应用场景和内存相关知识 引用计数-内存 redis中的对象回收机制是采用引用计数的方式,首先我们可以通过redis对象结构体代码 ...

  6. 软件项目管理 ——1.2.PMBOK与软件项目管理知识体系

    软件项目管理 --1.2.PMBOK与软件项目管理知识体系 归档于软件项目管理初级学习路线 第一章 软件项目管理基本概念 <初级学习路线合集 > @ 目录 软件项目管理 --1.2.PMB ...

  7. Java多线程编程实战02:多线程编程模型

    多线程编程模型 线程安全名词 串行.并发和并行 串行:一个人,将任务一个一个完成 并发:一个人,有策略地同时做多件事情 并行:多个人,每人做一个事情 竞态 名词 竞态:计算结果的正确性与时间有关的现象 ...

  8. 151-模型-Power BI&Power Pivot模型DAX函数使用量分析

    151-模型-Power BI&Power Pivot模型DAX函数使用量分析 1.背景 我们在 Power BI 或者 Power Pivot 项目中会写很多的 DAX 表达式.在最后项目交 ...

  9. 【docker】windows 10专业版安装docker

    一.开启Hyper-V功能 二.安装 Docker Desktop for Windows(下载地址)[https://www.docker.com/get-started/] 三.安装 Window ...

  10. MAC M1安装多个JDK版本及动态切换

    JDK版本下载 下载地址:https://www.azul.com/downloads/?package=jdk 筛选一下macOS的ARM 64-bit架构的JDK版本,下载对应版本即可.最好直接下 ...