基于selenium實現大麥網自動搶票腳本教程

閑來無事,打開大麥網發現現在大多數演唱票都需要手機端才能搶票,僅有很少一部分支持pc端用網頁去搶票,但正所謂:道高一尺,魔高一丈,解決這個反爬問題,我們可以采用Airtest連接仿真機來模擬手機端操作,這次教程我們就先著手去解決利用selenium解決少部分可以用pc端搶票的問題。如果針對手機端搶票的呼聲較高,后面我會出一篇關于Airtest搶票的blog。

前提聲明:

1、本教程僅用于學習和研究使用,不得用于商業行為。

2、請確保在合法合規的前提前下使用本代碼

3、本教程所涉及的操作均為正常模擬用戶操作,不涉及任何數據入侵或數據竊取。

一、引言?

在熱門演出和賽事門票一票難求的今天,利用自動化工具來提高搶票成功率成為很多人的需求,本文將詳細介紹如何使用chromedriver及selenium利用python來編寫一個簡單的大麥網自動搶票腳本。

二、準備工作

在開始之前,確保開發環境中安裝了我們所需要的庫:

chromedriver版本:?131.0.6778.87

chrome版本:131.0.6778.140

selenium:4.27.1(用于網頁自動化操作)

如果這些并未安裝,可以看我之前寫的blog,也可以在B站等平臺搜索資源進行學習。這里我們就不詳細說了。

三、代碼分析

1、所需頁面URL

首先我們需要定義大麥網首頁、登陸頁面以及我們想要搶的那張票的頁面URL。

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_3.591b23e11Li5yj&id=862317821501“

?我們主要采取面向對象的思想來編寫代碼,我們首先定義一個類對象,然后進行初始化加載。

class Concert:def __init__(self):self.status = 0 # 狀態,表示當前操作執行到哪一步self.login_method = 1 # 0:模擬登錄 1:使用cookie登錄self.driver = webdriver.Chrome()

然后執行登陸操作,我們需要判斷是否需要進行模擬登陸操作,如果需要模擬登錄就先打開登陸頁面:

    """登錄"""def login(self):# 如果為0,模擬登錄if self.login_method == 0:self.driver.get(login_url)elif self.login_method == 1:# 如果當前目錄下沒有這個cookie.pkl文件if not os.path.exists('cookie.pkl'):# 登陸一下記錄登錄信息self.set_cookies()else:self.driver.get(target_url)# 登陸一下 通過selenium傳入一些信息self.get_cookie()

我們來看定義的兩個函數:set_cookies()和get_cookie():

    """cookies:登陸網站的時候出現的,記錄用戶信息"""def set_cookies(self):self.driver.get(login_url)print("###請掃碼登陸###")time.sleep(10)print("###登陸成功###")pickle.dump(self.driver.get_cookies(), open('cookie.pkl','wb')) #獲取登陸的信息,并保存下來print("###cookie保存成功###")# 登陸成功后就跳轉到搶票頁面self.driver.get(target_url)# time.sleep(2)# 如果文件中已經有了cookie.pkl文件def get_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.driver.add_cookie(cookie_dict)print("###載入cookie成功###")

?打開瀏覽器,狀態此時改為1

    def enter_concert(self):print("###打開瀏覽器,進入大麥網###")# 調用登錄self.login()self.driver.refresh()self.status = 1print("###登陸成功###")

購票具體邏輯地實現:如果我們還停留在我們要買的這張票的頁面,門票的信息可能是缺貨,這個時候需要我們不斷的刷新,因此我們可以寫一個while循環來實現它,直到點擊進入頁面:訂單確認頁為止。給不同的情況,賦予不同的狀態,并采用不同的邏輯去判斷,比如需要我們手動選座購買的邏輯代碼等等。然后就是進入訂單確認頁的具體邏輯執行,我們可以采取xpath的方式去定位元素。把具體的代碼封裝到方法中。

    # 搶票并下單:首先判斷是否能夠購買,如果不能就一直刷新網頁,知道能夠購買為止def choose_ticket(self):if self.status == 1:print("="*30)print("###請選擇日期以及票價###")while self.driver.title.find("訂單確認頁") == -1: # driver.title.find尋找索引頁,如果找不到返回-1,找到返回索引頁# 下單按鈕button = self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[3]/div[9]/div/div[3]/div[3]').textif button == "提交缺貨登記": # 這里也就是說不一定會是"不,立即購票"這幾個字,也有可能會是提交缺貨登記等self.driver.refresh()elif button == "不,立即購票":self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[3]/div[9]/div/div[3]/div[3]').click()time.sleep(10)elif button == "不,選座購票":self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[3]/div[9]/div/div[3]/div[3]').click()self.status = 2else:self.status = 3tittle = self.driver.titleif tittle == "選擇座位":print("###請選擇座位###")time.sleep(10)self.driver.find_element('//*[@id="root"]/div/div[4]/div[2]/button').click()elif tittle == "訂單確認頁":while True:print("###正在加載中###")self.order_check()break

其實這里如果不是企業級的項目,而是自用的話,可以直接通過selenium語句去寫觀影人等信息。

 # self.driver.find_element(By.XPATH,'//*[@id="dmViewerBlock_DmViewerBlock"]/div/div/div[3]').click()# name = self.driver.find_element(By.XPATH,'//*[@id="addholder-model"]/div/div[1]/div/div[1]/input').clear().send_keys("your_name")# testify = self.driver.find_element(By.XPATH,'//*[@id="addholder-model"]/div/div[1]/div/div[5]/input').clear().send_keys("your_password")
# self.driver.find_element(By.XPATH,'//*[@id="addholder-model"]/div/div[1]/div/div[8]/div').click()
# time.sleep(2)
# self.driver.find_element(By.XPATH,'//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div/div[2]/i').click()

我們來看order_check()這個方法的具體實現,其實就是勾選觀影人(通過selenium去定位接口)然后提交訂單即可。

    def order_check(self):print("###開始確認訂單###")try:self.driver.find_element(By.XPATH, '//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div/div[2]/i').click()except Exception as e:print("###購票人信息選擇失敗,請重新選擇元素###")print(e)time.sleep(0.5)shoujihao = self.driver.find_element(By.XPATH,'//*[@id="dmContactBlock_DmContactBlock"]/div[2]/div/div[2]/input').clear()time.sleep(2)self.driver.find_element(By.XPATH,'//*[@id="dmContactBlock_DmContactBlock"]/div[2]/div/div[2]/input').send_keys("your_iphone_number")time.sleep(2)self.driver.find_element(By.XPATH, '//*[@id="dmOrderSubmitBlock_DmOrderSubmitBlock"]/div[2]/div/div[2]/div[2]/div[2]').click()time.sleep(10)

以上就是實現大麥網自動搶票的全部代碼實現,其實邏輯來講并不復雜,主要就是selenium的一些應用,最重要的是我們需要學習當中的面向對象的思想以及邏輯的復現,這是我們需要我們掌握并且要攻克的難點。

四、代碼優化與注意事項

1、元素定位:要準確的使用xpath或者其他定位方式(如CSS選擇器)來定位頁面元素,因為大麥網也買你可能會更新,元素的xpath語法可能會改變,所以需要定期檢查和調整代碼。

2、等待時間:合理設置等待的時間,避免因為也頁面加載緩慢導致操作失敗,但也不能設置過長的時間影響搶票效率。可以使用selenium中的顯示等待和隱式等待來優化。

3、多線程:可以考慮使用多線程技術,同時監控多個場次或者多個門票的搶購情況,提高搶票成功的概率,但要注意大麥網的相關規則,避免被判定為異常操作。

五、全部代碼

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
import pickle
# 自動登錄
# 大麥網首頁
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_3.591b23e11Li5yj&id=862317821501"class Concert:def __init__(self):self.status = 0 # 狀態,表示當前操作執行到哪一步self.login_method = 1 # 0:模擬登錄 1:使用cookie登錄self.driver = webdriver.Chrome()"""cookies:登陸網站的時候出現的,記錄用戶信息"""def set_cookies(self):self.driver.get(login_url)print("###請掃碼登陸###")time.sleep(10)print("###登陸成功###")pickle.dump(self.driver.get_cookies(), open('cookie.pkl','wb')) #獲取登陸的信息,并保存下來print("###cookie保存成功###")# 登陸成功后就跳轉到搶票頁面self.driver.get(target_url)# self.zhanghao = self.driver.find_element(By.XPATH, '//*[@id="fm-login-id"]').send_keys("17719114890")# self.mima = self.driver.find_element(By.XPATH, '//*[@id="fm-login-password"]').send_keys("dwq0219423")# self.button = self.driver.find_element(By.XPATH, '//*[@id="fm-login-submit"]').click()# time.sleep(2)# 如果文件中已經有了cookie.pkl文件def get_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.driver.add_cookie(cookie_dict)time.sleep(10) # 在這里記得手動刷新一下,用戶信息才會顯示出來print("###載入cookie成功###")"""登錄"""def login(self):# 如果為0,模擬登錄if self.login_method == 0:self.driver.get(login_url)elif self.login_method == 1:# 如果當前目錄下沒有這個cookie.pkl文件if not os.path.exists('cookie.pkl'):# 登陸一下記錄登錄信息self.set_cookies()else:self.driver.get(target_url)# 登陸一下 通過selenium傳入一些信息self.get_cookie()"""打開瀏覽器"""def enter_concert(self):print("###打開瀏覽器,進入大麥網###")# 調用登錄self.login()self.driver.refresh()self.status = 1print("###登陸成功###")# 搶票并下單:首先判斷是否能夠購買,如果不能就一直刷新網頁,知道能夠購買為止def choose_ticket(self):if self.status == 1:print("="*30)print("###請選擇日期以及票價###")while self.driver.title.find("訂單確認頁") == -1: # driver.title.find尋找索引頁,如果找不到返回-1,找到返回索引頁# 下單按鈕button = self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[3]/div[9]/div/div[3]/div[3]').textif button == "提交缺貨登記": # 這里也就是說不一定會是"不,立即購票"這幾個字,也有可能會是提交缺貨登記等self.driver.refresh()elif button == "不,立即購票":self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[3]/div[9]/div/div[3]/div[3]').click()time.sleep(10)elif button == "不,選座購票":self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div[1]/div[1]/div/div[2]/div[3]/div[9]/div/div[3]/div[3]').click()self.status = 2else:self.status = 3tittle = self.driver.titleif tittle == "選擇座位":print("###請選擇座位###")time.sleep(10)self.driver.find_element('//*[@id="root"]/div/div[4]/div[2]/button').click()elif tittle == "訂單確認頁":while True:print("###正在加載中###")self.order_check()break# 實現下單的邏輯# self.driver.find_element(By.XPATH,'//*[@id="dmViewerBlock_DmViewerBlock"]/div/div/div[3]').click()# name = self.driver.find_element(By.XPATH,'//*[@id="addholder-model"]/div/div[1]/div/div[1]/input').clear().send_keys("your_name")# testify = self.driver.find_element(By.XPATH,'//*[@id="addholder-model"]/div/div[1]/div/div[5]/input').clear().send_keys("your_password")# self.driver.find_element(By.XPATH,'//*[@id="addholder-model"]/div/div[1]/div/div[8]/div').click()# time.sleep(2)# self.driver.find_element(By.XPATH,'//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div/div[2]/i').click()def order_check(self):print("###開始確認訂單###")try:self.driver.find_element(By.XPATH, '//*[@id="dmViewerBlock_DmViewerBlock"]/div[2]/div/div/div[2]/i').click()except Exception as e:print("###購票人信息選擇失敗,請重新選擇元素###")print(e)time.sleep(0.5)shoujihao = self.driver.find_element(By.XPATH,'//*[@id="dmContactBlock_DmContactBlock"]/div[2]/div/div[2]/input').clear()time.sleep(2)self.driver.find_element(By.XPATH,'//*[@id="dmContactBlock_DmContactBlock"]/div[2]/div/div[2]/input').send_keys("your_iphone_number")time.sleep(2)self.driver.find_element(By.XPATH, '//*[@id="dmOrderSubmitBlock_DmOrderSubmitBlock"]/div[2]/div/div[2]/div[2]/div[2]').click()time.sleep(10)if __name__ == '__main__':concert = Concert()concert.enter_concert()concert.choose_ticket()

六、總結

通過使用chromedriver和selenium庫,我們可以編寫一個簡單的大麥網自動搶票腳本。但要注意,自動搶票可能存在違反平臺規則以及法律風險等情況,在使用時需要謹慎并確保自己的行為合法合規。同時,也希望票務平臺能夠不斷優化售票機制,讓更多真正有需求的用戶能夠公平的購買到門票。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87903.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2048小游戲實現

2048小游戲實現 將創建一個完整的2048小游戲,包含游戲核心邏輯和美觀的用戶界面。設計思路 4x4網格布局響應式設計,適配不同設備分數顯示和最高分記錄鍵盤控制(方向鍵)和觸摸滑動支持游戲狀態提示(勝利/失敗&#xff0…

Windows VMWare Centos Docker部署Springboot + mybatis + MySql應用

前置文章 Windows VMWare Centos環境下安裝Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot應用https://blog.csdn.net/u013224722/article/details/148958480 Windows VMWare Centos Docker部署…

【科普】Cygwin與wsl與ssh連接ubuntu有什么區別?DIY機器人工房

Cygwin、WSL(Windows Subsystem for Linux)和通過 SSH 連接 Ubuntu 是三種在 Windows 環境下與類 Unix/Linux 系統交互的工具,但它們的本質、運行環境、功能范圍有顯著區別。以下從核心定義、關鍵差異和適用場景三個維度詳細說明:…

Web前端數據可視化:ECharts高效數據展示完全指南

Web前端數據可視化:ECharts高效數據展示完全指南 當產品經理拿著一堆密密麻麻的Excel數據走向你時,你知道又到了"化腐朽為神奇"的時刻。數據可視化不僅僅是把數字變成圖表那么簡單,它是將復雜信息轉化為直觀洞察的藝術。 在過去兩…

# IS-IS 協議 | LSP 傳輸與鏈路狀態數據庫同步機制

略作整理,待校。 SRM 和 SSN 標志的作用 SRM 標志 功能:SRM 標志用于跟蹤路由器從一個接口向鄰居發送鏈路狀態協議數據單元(LSP)的狀態。作用:確保 LSP 的正確傳輸和狀態跟蹤。 SSN 標志 廣播網絡 功能&#xff1…

Windows DOS CMD 100

1. systeminfo:顯示系統詳細信息(安裝日期/補丁/內存等) 2. sfc /scannow:掃描并修復系統文件損壞 [管理員] 3. chkdsk /f:檢查磁盤錯誤并修復(需重啟) [管理員] 4. cleanmgr:啟動…

HTML初學者第三天

<1>文檔類型聲明標簽——<!DOCTYPE><!DOCTYPE>文檔聲明&#xff0c;作用是告訴瀏覽器使用哪種HTML版本來顯示網頁。<!DOCTYPE html>這句代碼的意思是&#xff1a;當前頁面采用的是HTML5版本來顯示網頁。注意&#xff1a;-<!DOCTYPE>聲明位于文檔…

學車筆記6

“不踩離合利用發動機制動”是指在駕駛過程中&#xff0c;駕駛員抬起油門踏板&#xff0c;但不踩下離合器踏板&#xff0c;利用發動機自身的阻力來減緩車輛速度的一種制動方式。具體介紹如下&#xff1a; #### 原理 - **動力傳遞反向**&#xff1a;正常情況下&#xff0c;發動…

人體坐姿檢測系統項目教程(YOLO11+PyTorch+可視化)

&#x1f4a1;本文主要內容&#xff1a;本項目基于YOLO11深度學習目標檢測算法&#xff0c;設計并實現了一個人體坐姿檢測系統。系統能夠自動識別圖像或視頻中的多種坐姿類型&#xff08;如&#xff1a;正常坐姿、不良坐姿等&#xff09;&#xff0c;為健康監測、智能教室、辦公…

服務網格可觀測性深度實踐與創新優化

主題&#xff1a;突破服務網格監控瓶頸——基于eBPF的無侵入式全鏈路可觀測性實踐 技術領域&#xff1a;云原生/微服務/服務網格&#xff08;Service Mesh&#xff09; 一、問題背景&#xff1a;傳統服務網格監控的痛點 在Istio、Linkerd等服務網格架構中&#xff0c;可觀測…

微信小程序41~50

1.列表渲染-進階用法 如果要對默認的變量名和下標進行修改&#xff0c;可以使用wx:for-item和wx:for-index wx:for-item可以指定數組當前元素的變量名 wx:for-index可以指定數組當前下標的變量名將wx:for用在標簽上&#xff0c;以渲染一個包含多個節點的結構快 并不是一個組件…

向量數據庫-Milvus快速入門

Milvus 概述 向量是神經網絡模型的輸出數據格式&#xff0c;可以有效地對信息進行編碼&#xff0c;在知識庫、語義搜索、檢索增強生成&#xff08;RAG&#xff09;等人工智能應用中發揮著舉足輕重的作用。 Milvus 是一個開源的向量數據庫&#xff0c;適合各種規模的人…

uniapp的光標跟隨和打字機效果

1、準備好容器文字的顯示textRef&#xff0c;以及光標的顯示 &#xff0c;使用transform-translate對光標進行移動到文字后面<template><view class"container" ref"contentRef"><u-parse :content"nodeText" ref"textRef&q…

「ECG信號處理——(21)基于Pan-Tompkins和隨機森林(RF)的睡眠呼吸暫停檢測算法」2025年7月4日

目錄 1、引言 2、數據庫介紹&#xff08;Apnea-ECG Database) 3、基于Pan-Tompkins和隨機森林&#xff08;RF&#xff09;的睡眠呼吸暫停檢測算法 3.1 算法概述 3.2 心電信號預處理及QRS波檢測算法 3.3 心電信號的隨機森林睡眠呼吸暫停識別 4、實驗結果 4.1 心電信號預處理及QR…

C++學習之STL學習:list的模擬實現

在上一篇學習了list的使用后&#xff0c;在本篇我們將通過模擬實現的方式深入了解list的底層運作原理。 作者的個人gitee&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.com 感興趣的讀者可以看一看 目錄 前置準備 結點的定義 鏈表類的定義 迭代器 普通迭代器 const迭代器 …

不引入變量 異或交換的缺點

文章目錄選擇排序正確代碼交換兩個數位置的方法引入中間變量不引入中間變量&#xff0c;使用異或的方法錯誤原因優化代碼選擇排序正確代碼 // 數組中交換i和j位置的數public static void swap(int[] arr, int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp;}// 選擇排…

VS Code中使用Git的方法:環境配置與Git操作

本文介紹在Windows電腦的VS Code中&#xff0c;配置Git環境并使用Git命令、功能的方法。 1 環境部署 首先&#xff0c;我們需要分別安裝Git環境與VS Code軟件。這里需要注意&#xff0c;即使是在VS Code中使用Git&#xff0c;也需要我們首先在電腦上單獨配置好Git的環境&#…

在 Windows 上安裝和運行 Apache Kafka

Apache Kafka是一款開源應用程序&#xff0c;用于實時處理海量數據流。Apache Kafka 是一個發布-訂閱消息系統。消息系統允許您在進程、應用程序和服務器之間發送消息。廣義上講&#xff0c;Apache Kafka 是一款可以定義主題并進行進一步處理的軟件。 下載和安裝 Apache Kafk…

【嵌入式電機控制#8】編碼器測速實戰

一、編碼器測速重要參數有刷電機編碼器參數&#xff08;其他的后面會慢慢提及&#xff0c;也可以在某寶看&#xff09;1. 編碼器分辨率&#xff08;PPR&#xff09;2. 編碼器工作電壓 3. 電機減速比 例如 30&#xff1a;1 指的就是電機減速軸轉1圈&#xff0c;編碼器轉30圈。注…

在C#中,可以不實例化一個類而直接調用其靜態字段

這是因為靜態成員&#xff08;static members&#xff09;屬于類本身&#xff0c;而不是類的實例。這是靜態成員的核心特性1. 靜態成員屬于類&#xff0c;而非實例當用static關鍵字修飾字段、方法或屬性時&#xff0c;這些成員會綁定到類級別&#xff0c;而不是實例級別。它們在…