最近演唱會還挺多的,都是大家喜歡的那些知名歌手,所以特地出一手教程給大家助力(主要是 表弟想追女神,所以教他自己搶票) 知識點 selenium 淘寶滑塊處理 搶購邏輯實現 必備環境 python 3.8 pycharm 專業版 谷歌瀏覽器+谷歌驅動+selenium3.141.0 stealth. ...
最近演唱會還挺多的,都是大家喜歡的那些知名歌手,所以特地出一手教程給大家助力(主要是 表弟想追女神,所以教他自己搶票)
知識點
- selenium 淘寶滑塊處理
- 搶購邏輯實現
必備環境
- python 3.8
- pycharm 專業版
- 谷歌瀏覽器+谷歌驅動+selenium3.141.0
- stealth.min.js
代碼展示
模塊
import time from info import PHONE, PASSWORD from selenium import webdriver # 我還錄製了視頻進行詳細講解,跟源代碼一起打包好了 # 都放在這個Q裙:708525271 # 直接加它領取
拿到移動軌跡,模仿人的滑動行為,先勻加速後勻減速。
def get_tracks(distance): # 初速度 v = 5 # 單位時間為0.2s來統計軌跡,軌跡即0.2內的位移 t = 0.2 # 位移/軌跡列表,列表內的一個元素代表0.2s的位移 tracks = [] # 當前的位移 current = 0 # 到達mid值開始減速 mid = distance * 4 / 5 while current < distance: if current < mid: # 加速度越小,單位時間的位移越小,模擬的軌跡就越多越詳細 a = 8 else: a = -3 # 初速度 v0 = v # 0.2秒時間內的位移 s = v0 * t + 0.5 * a * (t ** 2) # 當前的位置 current += s # 添加到軌跡列表 tracks.append(round(s)) # 速度已經達到v,該速度作為下次的初速度 v = v0 + a * t return tracks
登陸
# 1.1 打開瀏覽器 driver = webdriver.Chrome(options=options) f = open('stealth.min.js', mode='r', encoding='utf-8').read() # 移除selenium當中爬蟲的特征 driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': f}) # 1.2 打開登陸網頁 driver.get(login_url) # 1.3 輸入賬號, 輸入密碼, 點擊登陸 (滑塊) try: # 進入內嵌頁面 driver.switch_to.frame(0) # 賬號輸入框: #fm-login-id driver.find_element_by_css_selector('#fm-login-id').send_keys(PHONE) # 密碼輸入框: #fm-login-password driver.find_element_by_css_selector('#fm-login-password').send_keys(PASSWORD) time.sleep(1) # 為什麼會出現滑塊, 用selenium打開的瀏覽器, 和正常用戶打開的瀏覽器不同 # 過滑塊 driver.switch_to.frame(0) slider = driver.find_element_by_css_selector('#nc_1_n1z') # 讓滑鼠執行 點擊並且保持按住元素slider webdriver.ActionChains(driver).click_and_hold(on_element=slider).perform() # 橫向移動滑鼠 webdriver.ActionChains(driver).move_by_offset(xoffset=260, yoffset=0).perform() # 鬆開滑鼠 webdriver.ActionChains(driver).pause(0.5).release().perform() driver.switch_to.parent_frame() except: print("沒有遇到滑塊") # 登陸按鈕: #login-form > div.fm-btn > button driver.find_element_by_css_selector('#login-form > div.fm-btn > button').click() time.sleep(2)
下單
# 2.1 打開搶購頁面 driver.get(target_url) # 2.2 點擊立即購買 driver.find_element_by_css_selector('.buybtn').click() # 2.3 點擊觀影人 driver.find_element_by_css_selector('.ticket-buyer-select .next-checkbox-label').click() # 2.4 點擊同意並提交 driver.find_element_by_css_selector('.submit-wrapper .next-btn.next-btn-normal.next-btn-medium').click() time.sleep(2) driver.switch_to.frame(0) slider2 = driver.find_element_by_css_selector('#nc_1_n1z') tracks = get_tracks(300) # 剩下的50%在模擬移動 webdriver.ActionChains(driver).click_and_hold(on_element=slider2).perform() for x in tracks: webdriver.ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform() else: webdriver.ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform() webdriver.ActionChains(driver).pause(0.5).release().perform()
今天的內容就到這裡結束了,覺得有幫助的話,順手點個關註唄~