文章目录
前言新的解决方案订阅须知早期代码
前言
近期发现大麦网页端抢购页面悄然发生变化,之前可以在页面选择票价、档次,并且点击按钮进行购票,现在不行了,并且有些票只能在APP端购买,因此针对性编写了代码来适配。
新的解决方案
新的代码中首先进行了如下改造。
构造下单地址。之前是需要在购票地址页面点击按钮进行跳转,现在是利用接口获取到票务信息,直接构造下单地址,速度反而变得更快些。优化下单速度,比之前大幅提升下单速度。提供了自动选座功能支持同一场次多张观影人支持捡漏
订阅须知
订阅后,仅可以获取软件使用,不提供源代码,源代码另外出售。
早期代码
def enter_concert(self):
print(u'###打开浏览器,进入大麦网###')
if not exists('cookies.pkl'): # 如果不存在cookie.pkl,就获取一下
self.driver = webdriver.Chrome(executable_path=self.driver_path)
self.get_cookie()
print(u'###成功获取Cookie,重启浏览器###')
self.driver.quit()
options = webdriver.ChromeOptions()
# 禁止图片、js、css加载
prefs = {"profile.managed_default_content_settings.images": 2,
"profile.managed_default_content_settings.javascript": 1,
'permissions.default.stylesheet': 2}
options.add_experimental_option("prefs", prefs)
# 更换等待策略为不等待浏览器加载完全就进行下一步操作
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
self.driver = webdriver.Chrome(executable_path=self.driver_path, options=options, desired_capabilities=capa)
# 登录到具体抢购页面
self.login()
self.driver.refresh()
try:
# 等待nickname出现
locator = (By.XPATH, "/html/body/div[1]/div/div[3]/div[1]/a[2]/div")
WebDriverWait(self.driver, 5, 0.3).until(EC.text_to_be_present_in_element(locator, self.nick_name))
self.status = 1
print(u"###登录成功###")
self.time_start = time()
except:
self.status = 0
self.driver.quit()
raise Exception(u"***错误:登录失败,请删除cookie后重试***")
# 获取账号的cookie信息
def get_cookie(self):
self.driver.get(self.damai_url)
print(u"###请点击登录###")
self.driver.find_element_by_class_name('login-user').click()
while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1: # 等待网页加载完成
sleep(1)
print(u"###请扫码登录###")
while self.driver.title == '大麦登录': # 等待扫码完成
sleep(1)
dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))
print(u"###Cookie保存成功###")
def login(self):
print(u'###开始登录###')
self.driver.get(self.target_url)
WebDriverWait(self.driver, 10, 0.1).until(EC.title_contains('大麦网'))
self.set_cookie()
def check_order(self):
if self.status in [3, 4, 5]:
if self.real_name is not None:
print(u"###等待--确认订单--页面出现,可自行刷新,若长期不跳转可选择-- CRTL+C --重新抢票###")
try:
tb = WebDriverWait(self.driver, 1, 0.1).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[3]/div[2]/div')))
except:
raise Exception(u"***Error:实名信息选择框没有显示***")
print(u'###开始确认订单###')
print(u'###选择购票人信息,可手动帮助点击###')
init_sleeptime = 0.0
Labels = tb.find_elements_by_tag_name('label')
# 防止点击过快导致没有选择多个人
while True:
init_sleeptime += 0.1
true_num = 0
for num_people in self.real_name:
tag_input = Labels[num_people-1].find_element_by_tag_name('input')
if tag_input.get_attribute('aria-checked') == 'false':
sleep(init_sleeptime)
tag_input.click()
else:
true_num += 1
if true_num == len(self.real_name):
break
print("本次抢票时间:", time()-self.time_start)
self.driver.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[9]/button').click() # 同意以上协议并提交订单
else:
self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div[8]/button').click()
# 判断title是不是支付宝
print(u"###等待跳转到--付款界面--,可自行刷新,若长期不跳转可选择-- CRTL+C --重新抢票###")
try:
WebDriverWait(self.driver, 3600, 0.1).until(EC.title_contains('支付宝'))
except:
raise Exception(u'***Error: 长期跳转不到付款界面***')
|