Created
January 7, 2023 16:16
-
-
Save jzsy1/aba8a240de160f7e1c91d045245b383d to your computer and use it in GitHub Desktop.
大麦
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import time | |
import pickle | |
from time import sleep | |
from selenium import webdriver | |
# 第一步,实现免登录 | |
# 确定目标,设置全局变量 | |
# 大麦网主页 | |
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.591b23e1higdWh&id=696059562773" | |
# 初始化加载" | |
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 | |
def set_cookie(self): | |
self.driver.get(login_url) | |
print("###请点击登录###") | |
time.sleep(20) | |
pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb")) | |
print("###Cookie保存成功###") | |
self.driver.get(target_url) | |
# 获取cookie | |
def get_cookie(self): | |
try: | |
cookies = pickle.load(open("cookies.pkl", "rb")) # 载入cookie | |
for 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) | |
# 登录 | |
def login(self): | |
# 如果为0 模拟登录 | |
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() | |
# 打开浏览器 | |
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() | |
# 第二步,抢票并下单 | |
# 判断元素是否存在 | |
def isElementExist(self, element): | |
flag = True | |
browser = self.driver | |
try: | |
browser.find_element_by_xpath(element) | |
return flag | |
except: | |
flag = False | |
return flag | |
# 选票操作 | |
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 | |
# 选择座位 | |
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() | |
# 下单操作 | |
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() | |
# 抢票完成,退出 | |
def finish(self): | |
self.driver.quit() | |
# 测试代码是否成功 | |
if __name__ == '__main__': | |
try: | |
con = Concert() # 具体如果填写请查看类中的初始化函数 | |
con.enter_concert() # 打开浏览器 | |
con.choose_ticket() # 开始抢票 | |
except Exception as e: | |
print(e) | |
con.finish() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
有支持手机网页版的吗