Python自动化-大麦网自动抢票

前言:

最近,演唱会的举办越来越多,刚好我的一位同学喜欢听演唱会,就问我能不能帮他写一个自动抢演唱会门票的脚步,小编花了一个星期的时间研究和实践,成功写了一个简易版的自动抢票脚步。今天,我就分享一下我在写脚步中的过程体会给大家。希望我的文章能给你带来帮助,如果能帮助到你,希望你能给小编点个赞和关注,你的赞是小编继续写作的动力(=^ ^=)

保持会话方法:

想要多次重复的进行自动化抢票,最主要的就是要解决每次都要登录的问题,因此每次登录的时候都需要以账号登录,想要每次都用账号登录,那必须使用登录后的cookie进行操作。即:服务的的$_COOKIE函数中记录了你的cookie,那你就可以直接调用登录,如果没有就需要人工登录了,登录了之后,二次访问界面就能把自己的cookie保存到$_COOKIE函数。但是cookie登录存在问题,就是cookie涉及过期问题,所以可能隔一段时间就要手动重新登录进行cookie保存了

登录账号:

    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'):
                self.set_cookies()   # 没有文件的情况下,登录一下
            else:
                self.driver.get(target_url)  # 跳转到抢票页
                self.get_cookie()

获取cookie:

    def set_cookies(self):
        """cookies: 登录网站时出现的 记录用户信息用的"""
        self.driver.get(damai_url)
        self.driver.find_element(By.XPATH, '/html/body/div[2]/div/div[3]/div[1]/div[1]/span').click()
        iframe = self.driver.find_element(By.XPATH, '//div[@class="mui-zebra-module"]/div[1]/div[1]/div[1]/iframe')
        self.driver.switch_to.frame(iframe)
        self.driver.find_element(By.XPATH, '//*[@id="login-tabs"]/div[2]').click()
        self.driver.find_element(By.XPATH, '//*[@id="fm-sms-login-id"]').send_keys(self.number)
        self.driver.find_element(By.XPATH, '//*[@id="login-form"]/div[2]/div[3]/a').click()
        print("###请输入验证码###")
        while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
            time.sleep(1)
        print("###登录成功###")
        pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))
        print("###cookie保存成功###")
        self.driver.get(target_url)

获取到cookie后就可以用这个cookie进行登录了

    def get_cookie(self):
        """假如说本地有cookies.pkl 那么直接获取"""
        cookies = pickle.load(open('cookies.pkl', 'rb'))
        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###")

登录完成后就是抢票了,可以直接用selenium访问需要抢票的网址,然后进行抢票

    def choose_ticket(self):
        """下单操作"""
        if self.status == 2:
            print('=' * 30)
            self.choose_num()
            print("###准备购买{}张票###".format(self.num))
            print('=' * 30)
            print('###正在进行抢票###')
            # self.choose_seats()
            while self.driver.title != '订单确认页':
                try:
                    self.driver.find_element(By.XPATH, '/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[4]/div[10]/div/div[3]/div[3]').click()
                    # self.driver.refresh()
                except:
                    print('###没有跳转到订单结算界面###')

完整代码:

import time,os
import pickle
from selenium import webdriver
from selenium.webdriver.common.by import By

# 大麦网主页
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?id=710818567651'


class Concert:
    def __init__(self):
        self.number = '13371533785'   # 登录需要的手机号
        self.num = 1  # 需要抢的票数
        self.name = '小陈'
        self.status = 0  # 状态,表示当前操作执行到了哪个步骤
        self.login_method = 1  # {0:模拟登录, 1:cookie登录}自行选择登录的方式
        self.options = webdriver.ChromeOptions()
        # 隐藏"Chrome正在受到自动软件的控制"
        self.options.add_experimental_option('useAutomationExtension', False)  # 去掉开发者警告
        self.options.add_experimental_option('excludeSwitches', ['enable-automation'])

        self.options.add_argument('--disable-blink-features=AutomationControlled')
        self.driver = webdriver.Chrome(options=self.options)    # 当前浏览器对象

    def enter_concert(self):
        """打开浏览器"""
        print('###打开浏览器,进入大麦网###')
        # 调用登录
        self.login()
        # self.driver.refresh()  # 刷新页面
        self.status = 2  # 登录成功标识
        print("###登录成功###")

    def get_cookie(self):
        """假如说本地有cookies.pkl 那么直接获取"""
        cookies = pickle.load(open('cookies.pkl', 'rb'))
        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###")

    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'):
                self.set_cookies()   # 没有文件的情况下,登录一下
            else:
                self.driver.get(target_url)  # 跳转到抢票页
                self.get_cookie()

    def set_cookies(self):
        """cookies: 登录网站时出现的 记录用户信息用的"""
        self.driver.get(damai_url)
        self.driver.find_element(By.XPATH, '/html/body/div[2]/div/div[3]/div[1]/div[1]/span').click()
        iframe = self.driver.find_element(By.XPATH, '//div[@class="mui-zebra-module"]/div[1]/div[1]/div[1]/iframe')
        self.driver.switch_to.frame(iframe)
        self.driver.find_element(By.XPATH, '//*[@id="login-tabs"]/div[2]').click()
        self.driver.find_element(By.XPATH, '//*[@id="fm-sms-login-id"]').send_keys(self.number)
        self.driver.find_element(By.XPATH, '//*[@id="login-form"]/div[2]/div[3]/a').click()
        print("###请输入验证码###")
        while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
            time.sleep(1)
        print("###登录成功###")
        pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))
        print("###cookie保存成功###")
        self.driver.get(target_url)

    def choose_num(self):
        for i in range(1, self.num):
            self.driver.find_element(By.XPATH, '/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[3]/div[6]/div[2]/div/div/a[2]').click()

    def choose_ticket(self):
        """下单操作"""
        if self.status == 2:
            print('=' * 30)
            self.choose_num()
            print("###准备购买{}张票###".format(self.num))
            print('=' * 30)
            print('###正在进行抢票###')
            while self.driver.title != '订单确认页':
                try:
                    self.driver.find_element(By.XPATH, '/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[4]/div[10]/div/div[3]/div[3]').click()
                except:
                    print('###没有跳转到订单结算界面###')

    def finifsh(self):
        """结束,退出浏览器"""
        self.driver.quit()


if __name__ == '__main__':
    concert = Concert()
    try:
        concert.enter_concert()  # 打开浏览器
        concert.choose_ticket()  # 抢票
    except Exception as e:
        print(e)
        concert.finifsh()

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抢票工具的实现需要用到自动化测试工具Selenium和浏览器驱动ChromeDriver。以下是基于Python大麦自动抢票工具实现代码: ```python from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys import time # 抢票链接、账号密码以及票数 url = 'https://detail.damai.cn/item.htm?spm=a2oeg.search_category.0.0.2f4b4f80pLNEgW&id=XXXXX' # 抢票链接 username = 'XXXXX' # 大麦账号 password = 'XXXXX' # 大麦密码 ticket_num = 1 # 抢票数量 # Chrome浏览器设置 options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-extensions') options.add_argument('--disable-infobars') options.add_argument('--disable-popup-blocking') options.add_argument('--disable-default-apps') options.add_argument('--disable-plugins') options.add_argument('--incognito') options.add_argument('--start-maximized') options.add_argument('--disable-translate') options.add_argument('--disable-file-system') options.add_argument('--disable-blink-features=AutomationControlled') options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36') driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, 10) # 打开页并登录 driver.get(url) driver.maximize_window() time.sleep(1) login = wait.until(EC.presence_of_element_located((By.XPATH, '//a[@class="btn btn-blue"]'))) ActionChains(driver).move_to_element(login).click().perform() username_input = driver.find_element_by_xpath('//input[@id="login_email"]') password_input = driver.find_element_by_xpath('//input[@id="login_password"]') username_input.send_keys(username) password_input.send_keys(password) time.sleep(1) login_button = driver.find_element_by_xpath('//a[@class="btn-login"]') ActionChains(driver).move_to_element(login_button).click().perform() # 抢票 while True: try: buy_button = wait.until(EC.presence_of_element_located((By.XPATH, '//a[@class="buybtn"]'))) if buy_button.text == '即将开抢': print('抢票未开始,等待中...') time.sleep(1) elif buy_button.text == '立即预订': print('抢票已开始,开始尝试预订...') buy_button.click() break except: pass # 选择票数 if ticket_num > 1: select_ticket_button = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="cafe-c-input-number-handler cafe-c-input-number-handler-up"]'))) for i in range(ticket_num-1): select_ticket_button.click() # 提交订单 submit_button = wait.until(EC.presence_of_element_located((By.XPATH, '//a[@class="cafe-c-button cafe-c-button--lred J_Go"]'))) ActionChains(driver).move_to_element(submit_button).click().perform() time.sleep(3) confirm_button = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="mod-common-dialog J_Mod"]/div[@class="content"]/a'))) ActionChains(driver).move_to_element(confirm_button).click().perform() print('抢票成功!') ``` 其中, XXXXX 需要根据实际情况进行替换。使用时将代码复制到Python文件中,在命令行中运行即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值