小白操作-抵制黄牛–需要更好用更高级关注获取
如何用Python自动抢大麦网演出票?
在数字化时代,购票已经成为我们生活的一部分,无论是音乐会、话剧、体育赛事还是各种展览,抢票几乎成了一项“必备技能”。但面对热门事件的有限票源,如何在第一时间内抢到心仪的票呢?今天,我们将探索如何使用Python脚本和Selenium自动化工具来增加抢票的成功率。
Selenium是一个用于Web应用程序测试的工具,但它同样可以用于自动化任何web浏览器操作。通过模拟真实用户的行为,Selenium可以登录网站、搜索信息、填写表单等。
本文的脚本主要通过Python的Selenium库来实现自动抢票。它首先登录大麦网,然后定时刷新目标演出的购票页面,一旦发现有票即尝试购买。
环境准备
确保你的Python环境已经安装好,并且安装了Selenium库。此外,还需要下载对应的浏览器驱动(例如ChromeDriver),并确保其版本与你的浏览器版本相匹配。
配置文件准备
创建一个config.json文件,包含所有必要的配置信息,例如演出的日期、场次、票价等级、实名信息、用户昵称、票数、大麦网官网地址、目标购票地址以及浏览器驱动路径。这些信息将被脚本读取和使用。
编写选择票务信息的逻辑
在choose_ticket方法中,根据大麦网页面的实际结构来选择日期、场次和票价等信息。这可能涉及到对Selenium的find_element_by_*和find_elements_by_*方法的使用,以及对页面元素进行点击操作。需要注意的是,页面结构可能会随时间变化,因此选择元素时应尽可能使用稳定的属性(如ID、名称或特定的CSS类)。
实现订单提交逻辑
在submit_order方法中,实现点击“立即购买”按钮并提交订单的逻辑。这可能需要处理额外的页面元素,例如选座信息或确认订单信息的弹窗。
执行脚本
执行脚本前,请确保所有配置都是正确的,特别是config.json文件中的信息。
在终端或命令提示符下运行脚本。脚本会首先打开大麦网登录页面,此时你需要手动完成登录操作。
登录完成后,脚本会自动导航到目标演出的页面,并根据choose_ticket方法中的逻辑选择票务信息。
最后,submit_order方法将尝试提交订单。由于可能存在需要手动操作的步骤(如选座),请保持对脚本运行过程的监控。
代码分析
初始化和配置读取
__init__方法:这个构造函数负责读取配置文件,并初始化类的属性。这包括演出的日期、场次、票价等级、实名信息、用户昵称、票数、大麦网官网地址、目标购票地址以及浏览器驱动路径。
_init_driver方法:这个私有方法负责初始化Selenium的WebDriver,设置浏览器选项以提升加载速度(如禁用图片和CSS加载),并返回一个WebDriver实例供后续使用。
登录操作
login方法:该方法打开大麦网的登录页面,并等待用户手动完成登录操作。这里采取了手动登录的方式以避开自动化处理可能遇到的验证码等问题。
进入演出页面
enter_concert_page方法:登录成功后,这个方法将浏览器导向目标演出的页面,并等待页面加载完成。
选择票务信息
choose_ticket方法:这个方法是用来选择演出的具体日期、场次和票价等信息的地方。由于实际的页面结构可能复杂且经常变化,这里只提供了一个选择日期的示例代码。实际使用时,需要根据大麦网页面的具体结构进行适当修改。
提交订单
submit_order方法:一旦选好票务信息,这个方法用于点击“立即购买”或类似的按钮以提交订单。这个步骤可能会涉及更多的用户交互(如选座),因此在实际应用中可能需要手动操作。
主流程
主流程:在if name == ‘main’:部分,脚本实例化Concert类,按顺序调用了登录、进入演出页面、选择票务信息、提交订单的方法。这个流程简洁地展示了使用Selenium自动化抢票的基本步骤。
注意事项
该脚本依赖于大麦网页面元素的特定结构,如类名等。如果大麦网更新了页面结构,脚本可能需要相应的更新。
结语
通过Python和Selenium,我们可以相对简单地实现自动抢票功能,为抢购心仪票务增加一份力量。然而,技术的使用需要谨慎,合理利用自动化技术,在不违反平台规则的前提下提高生活效率。希望这篇文章能为你在数字生活中增添一份便利。
请记住,这篇介绍旨在技术分享,使用此类脚本时,请遵守相关平台的规定,理解其中的风险。
部分代码奉上
⬇️⬇️⬇️
# coding: utf-8
import json
from time import sleep, time
from pickle import dump, load
from os.path import exists
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
class Concert(object):
def __init__(self, config_path='./config.json'):
with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
self.date = config['date']
self.session = config['sess']
self.price = config['price']
self.real_name = config['real_name']
self.nick_name = config['nick_name']
self.ticket_num = config['ticket_num']
self.damai_url = config['damai_url']
self.target_url = config['target_url']
self.driver_path = config['driver_path']
self.driver = None
self.status = 0
self.time_start = 0
self.time_end = 0
self.num = 0
self.setup_driver() # 初始化浏览器驱动
def setup_driver(self):
"""设置WebDriver,并预加载cookies,如果存在的话。"""
options = webdriver.ChromeOptions()
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)
if exists('cookies.pkl'):
self.driver.get(self.damai_url) # 需要先访问网站才能设置cookies
cookies = load(open("cookies.pkl", "rb"))
for cookie in cookies:
if 'expiry' in cookie:
del cookie['expiry']
self.driver.add_cookie(cookie)
print(u'Cookie载入完成')
else:
print(u"Cookie未找到,请先运行get_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() # 同意以上协议并提交订单