使用Python自动抢购大麦网演唱会门票
在这篇博客中,我将分享如何使用Python编写一个自动抢购大麦网演唱会门票的脚本。我们将使用Selenium库来实现自动化操作,以便在演唱会门票开售时快速抢购到心仪的票。
准备工作
在开始之前,我们需要安装Selenium库,并且确保已经安装了Microsoft Edge浏览器以及其驱动程序。如果你还没有安装,可以按照以下步骤进行:
- 安装Selenium库:在命令行中运行
pip install selenium。 - 下载Microsoft Edge浏览器驱动程序:根据你的操作系统和浏览器版本,下载对应的驱动程序,并将其添加到系统路径中。
代码实现
每一部分代码讲解
首先,我们需要导入所需的库。在这个例子中,我们使用了
selenium
库来实现自动化浏览器操作,
time
库来实现等待和延时功能,
pickle
库用于读取和保存cookie信息,
os
库用于文件操作,以及
By
类来定位元素。
from selenium import webdriver
import time
import pickle
import os
from selenium.webdriver.common.by import By
接下来,我们创建了一个名为
Concert
的类,用于实现自动抢票的功能。
classConcert:def__init__(self):
self.state =0# 状态,表示当前操作执行到了哪个步骤
self.log_method =1# 0{模拟登录,需要手动登录} 1 {cookie}# 创建浏览器操作对象
self.browser = webdriver.Edge()
在
Concert
类的初始化方法中,我们定义了一些初始变量,包括
state
用于表示当前操作执行到了哪个步骤,
log_method
用于选择登录方式,以及
browser
用于创建浏览器操作对象。
接下来,我们定义了一个名为
set_cookies
的方法,用于手动登录并保存cookie信息。
defset_cookies(self):
self.browser.get(login_url)print("### 请扫码登陆 ###")
time.sleep(25)print('登陆成功')# cookie.pkl
pickle.dump(self.browser.get_cookies(),open('cookie.pkl','wb'))print('cookie保存成功')# 抢票
self.browser.get(ticket_url)
在这个方法中,我们首先打开登录页面,然后等待用户扫码登录,登录成功后将cookie信息保存到
cookie.pkl
文件中,最后跳转到抢票页面。
然后,我们定义了一个名为
get_cookie
的方法,用于加载已保存的cookie信息。
defget_cookie(self):
cookies = pickle.load(open('cookie.pkl','rb'))for cookie in cookies:
cookie_dict ={'domain':'.damai.cn','name': cookie.get('name'),'value': cookie.get('value')}
self.browser.add_cookie(cookie_dict)print('载入cookie成功')
在这个方法中,我们从
cookie.pkl
文件中加载cookie信息,并将其添加到浏览器中,以实现自动登录。
接下来,我们定义了一个名为
log_in
的方法,用于实现登录功能。
# TODO:登录deflog_in(self):if self.log_method ==0:
self.browser.get(login_url)elif self.log_method ==1:# 如果当前目录下没有cookie.pkl文件,要登陆ifnot os.path.exists('cookie.pkl'):# 登录一下 并且记录cookie
self.set_cookies()else:
self.browser.get(ticket_url)# 登录一下 通过selenium传入一些用户信息
self.get_cookie()
在这个方法中,我们根据
log_method
的值选择不同的登录方式,如果是0,则打开登录页面,如果是1,则检查是否有保存的cookie信息,如果没有则调用
set_cookies
方法手动登录,如果有则调用
get_cookie
方法加载cookie信息。
接下来,我们定义了一个名为
enter_contert
的方法,用于进入演唱会门票购买页面。
"""打开浏览器"""defenter_contert(self):print("进入大麦网")# 调用登录
self.log_in()
self.browser.refresh()
self.state =2print('登陆成功')
在这个方法中,我们调用了
log_in
方法进行登录,并刷新页面,最后将状态设置为2,表示登录成功。
接下来,我们定义了一个名为
choose_ticket
的方法,用于选择票务和下单的操作。
# TODO:选票和下单defchoose_ticket(self):if self.state ==2:print('='*30)print()while self.browser.title.find('确认订单')==-1:# 获取到下单按钮
buybutton = self.browser.find_element(By.CLASS_NAME,'buybtn').text
if buybutton =='提交缺货登记':
self.browser.refresh()elif buybutton =='立即购买':
self.browser.find_element(By.CLASS_NAME,'buybtn').click()elif buybutton =='选座购买':
self.browser.find_element(By.CLASS_NAME,'buybtn').click()
self.state =4else:
self.state =100
title = self.browser.title
if title =='选座购买':# 执行选作操作passelif title =='确认购买':# 实现下单的操作whileTrue:print("正在加载")
self.check_order()break
在这个方法中,我们首先检查状态是否为2,然后根据页面标题和按钮状态执行不同的操作,包括刷新页面、点击购买按钮、执行选座操作以及确认购买操作。
最后,我们定义了一个名为
check_order
的方法,用于确认订单。
defcheck_order(self):print('开始确认订单')try:
self.browser.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.browser.find_element_by_xpath('//*[@id="container"]/div/div[9]/button').click()
在这个方法中,我们首先输出提示信息,然后尝试选择购票人信息并点击确认按钮。
最后,在
main
函数中,我们创建了一个
Concert
对象,并调用了相应的方法。
if __name__ =='__main__':
con = Concert()
con.log_in()
con.enter_contert()
con.check_order()
全部代码如下
import os
import pickle # 记录和读取cookieimport time
from selenium import webdriver
from selenium.webdriver.common.by import By
damai_url ='https://www.damai.cn/'
ticket_url ='https://detail.damai.cn/item.htm?spm=a2oeg.home.card_0.ditem_5.591b23e1bR0C5i&id=760029024857'
login_url ='https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F'classConcert:# 初始化加载def__init__(self):
self.state =0# 状态,表示当前操作执行到了哪个步骤
self.log_method =1# 0{模拟登录,需要手动登录} 1 {cookie}# 创建浏览器操作对象
self.browser = webdriver.Edge()defset_cookies(self):
self.browser.get(login_url)print("### 请扫码登陆 ###")
time.sleep(25)print('登陆成功')# cookie.pkl
pickle.dump(self.browser.get_cookies(),open('cookie.pkl','wb'))print('cookie保存成功')# 抢票
self.browser.get(ticket_url)"""假设已经有了cookie.pkl"""defget_cookie(self):
cookies = pickle.load(open('cookie.pkl','rb'))for cookie in cookies:
cookie_dict ={'domain':'.damai.cn','name': cookie.get('name'),'value': cookie.get('value')}
self.browser.add_cookie(cookie_dict)print('载入cookie成功')# TODO:登录deflog_in(self):if self.log_method ==0:
self.browser.get(login_url)elif self.log_method ==1:# 如果当前目录下没有cookie.pkl文件,要登陆ifnot os.path.exists('cookie.pkl'):# 登录一下 并且记录cookie
self.set_cookies()else:
self.browser.get(ticket_url)# 登录一下 通过selenium传入一些用户信息
self.get_cookie()"""打开浏览器"""defenter_contert(self):print("进入大麦网")# 调用登录
self.log_in()
self.browser.refresh()
self.state =2print('登陆成功')# TODO:选票和下单defchoose_ticket(self):if self.state ==2:print('='*30)print()while self.browser.title.find('确认订单')==-1:# 获取到下单按钮
buybutton = self.browser.find_element(By.CLASS_NAME,'buybtn').text
if buybutton =='提交缺货登记':
self.browser.refresh()elif buybutton =='立即购买':
self.browser.find_element(By.CLASS_NAME,'buybtn').click()elif buybutton =='选座购买':
self.browser.find_element(By.CLASS_NAME,'buybtn').click()
self.state =4else:
self.state =100
title = self.browser.title
if title =='选座购买':# 执行选作操作passelif title =='确认购买':# 实现下单的操作whileTrue:print("正在加载")
self.check_order()breakdefcheck_order(self):print('开始确认订单')try:
self.browser.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.browser.find_element_by_xpath('//*[@id="container"]/div/div[9]/button').click()if __name__ =='__main__':
con = Concert()
con.log_in()
con.enter_contert()
con.check_order()
运行结果
通过运行上述代码,我们就可以实现自动登录大麦网,进入演唱会门票购买页面,并尝试自动选择票务和下单的操作。
版权归原作者 0zxm 所有, 如有侵权,请联系我们删除。