900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 演唱会门票抢不到?不要慌 教你用python实现自动化抢票

演唱会门票抢不到?不要慌 教你用python实现自动化抢票

时间:2021-11-11 15:34:48

相关推荐

演唱会门票抢不到?不要慌 教你用python实现自动化抢票

前言

之前一直在更新从零开始学python系列的系列文,最近有点忙停更了两天,今天来插一篇其他的文章。

之前有小伙伴留言说女朋友快生日了,喜欢某某某但是手动买票根本就是买不到,又不想当大冤种从黄牛手里加钱,于是乎在疯狂星期四的晚上遭到’‘贿赂’'的我连夜搞定了

一丶安装环境和配置文件

要用python实现,下载和安装python自然是不用说了,还有pycharm,不会下载安装python和pycharm的可以参考之前的文章或者视频(省去一万字)

selenium库的安装

python自动化的实现离不开selenium库,想要实现自动化抢票/抢茅台/九价资格等等都需要安装selenium,要使用Python和Selenium进行自动化购票,需要完成以下步骤:

1.安装Python和pip

首先,需要安装Python解释器和pip包管理器。你可以在Python的官方网站上下载并安装Python:/downloads/。一般来说,Python3.x是最新的版本,推荐使用Python3。

2. 安装Selenium库

一旦你安装了Python和pip,你可以使用以下命令来安装Selenium库:

pie install selenium

3. 下载浏览器驱动

Selenium需要相关的浏览器驱动程序来与浏览器进行交互。你需要下载并安装适用于你所使用的浏览器和操作系统的驱动。下面是各个浏览器对应的驱动下载链接:

Chrome:/downloads

下载后,将驱动程序解压并将可执行文件所在的路径添加到系统的环境变量中。因为我用的是谷歌的所以这么推荐。

4. 编写Python脚本:

使用Python的编辑器创建一个新的.py文件,并使用以下代码片段作为开始,以下是我本次抢票的源码,以大麦网参考。

二丶源码实现

如图所示。程序运行玩提示:抢票完成,但是目前只适用于网页版,所以部分得不行,适用APP版等我回头研究好了,在重新说明。还有一定要注意你的网速哦

源码如下:

import os # 创建文件夹, 文件是否存在import time # time 计时import pickle # 保存和读取cookie实现免登陆的一个工具from time import sleepfrom selenium import webdriver # 操作浏览器的工具from mon.by import By"""一. 实现免登陆二. 抢票并且下单"""# 大麦网主页damai_url = '/'# 登录login_url = '/login?ru=https%3A%2F%%2F'# 抢票目标页target_url = '/item.htm?spm=a2oeg.home.card_0.ditem_2.591b23e1AyXdAl&id=729700971838'# class Concert:class Concert:# 初始化加载def __init__(self):self.status = 0 # 状态, 表示当前操作执行到了哪个步骤self.login_method = 1 # {0:模拟登录, 1:cookie登录}自行选择登录的方式self.driver = webdriver.Chrome(executable_path='chromedriver.exe') # 当前浏览器驱动对象# cookies: 登录网站时出现的 记录用户信息用的def set_cookies(self):"""cookies: 登录网站时出现的 记录用户信息用的"""self.driver.get(damai_url)print('###请点击登录###')# 我没有点击登录,就会一直延时在首页, 不会进行跳转while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:sleep(1)print('###请扫码登录###')# 没有登录成功while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':sleep(1)print('###扫码成功###')# get_cookies: driver里面的方法pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))print('###cookie保存成功###')self.driver.get(target_url)# 假如说我现在本地有 cookies.pkl 那么 直接获取def get_cookie(self):"""假如说我现在本地有 cookies.pkl 那么 直接获取"""cookies = pickle.load(open('cookies.pkl', 'rb'))for cookie in cookies:cookie_dict = {'domain': '.', # 必须要有的, 否则就是假登录'name': cookie.get('name'),'value': cookie.get('value')}self.driver.add_cookie(cookie_dict)print('###载入cookie###')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'):self.set_cookies() # 没有文件的情况下, 登录一下else:self.driver.get(target_url) # 跳转到抢票页self.get_cookie() # 并且登录def enter_concert(self):"""打开浏览器"""print('###打开浏览器,进入大麦网###')# 调用登录self.login() # 先登录再说self.driver.refresh() # 刷新页面self.status = 2 # 登录成功标识print('###登录成功###')# 处理弹窗if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):self.driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()# 二. 抢票并且下单def choose_ticket(self):"""选票操作"""if self.status == 2:print('=' * 30)print('###开始进行日期及票价选择###')while self.driver.title.find("确认订单") == -1:try:buybutton = self.driver.find_element(By.CLASS_NAME, 'buybtn').textif buybutton == '提交缺货登记':self.status = 2 # 没有进行更改操作self.driver.get(target_url) # 刷新页面 继续执行操作elif buybutton == '立即预定':# 点击立即预定self.driver.find_element('buybtn').click()self.status = 3elif buybutton == '立即购买':self.driver.find_element(By.CLASS_NAME, 'buybtn').click()self.status = 4elif buybutton == '选座购买':self.driver.find_element(By.CLASS_NAME, 'buybtn').click()self.status = 5except:print('###没有跳转到订单结算界面###')title = self.driver.titleif title == '选座购买':# 选座购买的逻辑self.choice_seats()elif title == '确认订单':# 实现下单的逻辑while True:# 如果标题为确认订单print('正在加载.......')# 如果当前购票人信息存在 就点击if self.isElementExist('//*[@id="container"]/div/div[9]/button'):# 下单操作self.check_order()breakdef choice_seats(self):"""选择座位"""while self.driver.title == '选座购买':while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):print('请快速选择你想要的座位!!!')while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):self.driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[2]/div[2]/button').click()def check_order(self):"""下单操作"""if self.status in [3, 4, 5]:print('###开始确认订单###')time.sleep(1)try:# 默认选第一个购票人信息self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()except Exception as e:print('###购票人信息选中失败, 自行查看元素位置###')print(e)# 最后一步提交订单time.sleep(0.5) # 太快了不好, 影响加载 导致按钮点击无效self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[9]/button').click()time.sleep(20)def isElementExist(self, element):"""判断元素是否存在"""flag = Truebrowser = self.drivertry:browser.find_element(By.XPATH, element)return flagexcept:flag = Falsereturn flagdef finish(self):"""抢票完成, 退出"""self.driver.quit()if __name__ == '__main__':con = Concert()try:con.enter_concert() # 打开浏览器con.choose_ticket() # 选择座位except Exception as e:print(e)con.finish()

需要注意的是,不同的购票网站可能会有不同的网页结构和交互方式。你可能需要使用Selenium提供的API来定位元素和模拟用户操作

此外,Selenium还支持Headless模式,可以在后台运行浏览器以节省资源和提高效率。可以通过设置浏览器选项来启用Headless模式。

如果你也想学这个技术,欢迎留言,完整视频教程和源码一起分享~~~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。