为了顺利买到演唱会的票用Python制作了自动抢票的脚本

网友投稿 724 2023-11-14

目录知识点:开发环境:先导入本次所需的模块第一步,实现免登录确定目标,设置全局变量初始化加载登录调用设置cookie获取cookie登录打开浏览器第二步,抢票并下单判断元素是否存在选票操作选择座位下单操作抢票完成,退出测试代码是否成功最后看下效果如何

知识点:

面向对象编程 selenium 操作浏览器 pickle 保存和读取Cookie实现免登陆 time 做延时操作 os 创建文件,判断文件是否存在

开发环境:

版 本:anaconda5.2.0(python3.6.5) 编辑器:pycharm

【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学

为了顺利买到演唱会的票用Python制作了自动抢票的脚本

点这里即可免费在线观看

先导入本次所需的模块

?
1
2
3
4
5
import os
import time
import pickle
from time import sleep
from selenium import webdriver

第一步,实现免登录

确定目标,设置全局变量

初始化加载

?
1
2
3
4
5
class Concert:
def __init__(self):
self.status = 0         # 状态,表示如今进行到何种程度
self.login_method = 1   # {0:模拟登录,1:Cookie登录}自行选择登录方式
self.driver = webdriver.Chrome(executable_path=chromedriver.exe)        # 默认Chrome浏览器

登录调用设置cookie

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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)

获取cookie

?
1
2
3
4
5
6
7
8
9
10
11
12
13
def get_cookie(self):
try:
cookies = pickle.load(open("cookies.pkl", "rb"))  # 载入cookie
for cookie in cookies:
cookie_dict = {
domain:.damai-,  # 必须有,不然就是假登录
name: cookie.get(name),
value: cookie.get(value)
}
self.driver.add_cookie(cookie_dict)
print(###载入Cookie###)
except Exception as e:
print(e)

登录

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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()

打开浏览器

?
1
2
3
4
5
6
7
8
9
10
11
12
def enter_concert(self):
"""打开浏览器"""
print(###打开浏览器,进入大麦网###)
# self.driver.maximize_window()           # 最大化窗口
# 调用登陆
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()

第二步,抢票并下单

判断元素是否存在

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

选票操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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).text
if buybutton == "提交缺货登记":
# 改变现有状态
self.status=2
self.driver.get(target_url)
print(###抢票未开始,刷新等待开始###)
continue
elif buybutton == "立即预定":
self.driver.find_element_by_class_name(buybtn).click()
# 改变现有状态
self.status = 3
elif buybutton == "立即购买":
self.driver.find_element_by_class_name(buybtn).click()
# 改变现有状态
self.status = 4
# 选座购买暂时无法完成自动化
elif buybutton == "选座购买":
self.driver.find_element_by_class_name(buybtn).click()
self.status = 5
except:
print(###未跳转到订单结算界面###)
title = self.driver.title
if title == 选座购买:
# 实现选座位购买的逻辑
self.choice_seats()
elif title == 确认订单:
while True:
# 如果标题为确认订单
print(waiting ......)
if self.isElementExist(//*[@id="container"]/div/div[9]/button):
self.check_order()
break

选择座位

?
1
2
3
4
5
6
7
8
9
def choice_seats(self):
while self.driver.title == 选座购买:
while self.isElementExist(//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img):
# 座位手动选择 选中座位之后//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img 就会消失
print(请快速的选择您的座位!!!)
# 消失之后就会出现 //*[@id="app"]/div[2]/div[2]/div[2]/div
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()

下单操作

?
1
2
3
4
5
6
7
8
9
10
11
12
def check_order(self):
if self.status in [3,4,5]:
print(###开始确认订单###)
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(//div[@class = "w1200"]//div[2]//div//div[9]//button[1]).click()

抢票完成,退出

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

测试代码是否成功

?
1
2
3
4
5
6
7
8
9
if __name__ == __main__:
try:
con = Concert()             # 具体如果填写请查看类中的初始化函数
con.enter_concert()         # 打开浏览器
con.choose_ticket()         # 开始抢票
except Exception as e:
print(e)
con.finish()

最后看下效果如何

到此这篇关于为了

您可能感兴趣的文章:Python多线程实现模拟火车站售票教你用python实现12306余票查询Python自动化xpath实现自动抢票抢货春节到了 教你使用python来抢票回家用Python抢火车票的简单小程序实现解析

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:手机app开发的注意事项有哪些?
下一篇:休闲运动app背后潜藏的危机,运动app开发该何去何从?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~