github搶票,python自動化(三):selenium微博搶票(含搶票程序設計思路)

 2023-10-08 阅读 34 评论 0

摘要:緣起 這個故事起源于女票是一個bjd娃圈愛好者,我才知道在娃圈里經常通過微博私信的方式進行一些商品的交易,例如娃娃的面妝、衣服和娃娃本身,這就引發了搶票需求 流程: 在某一個整的時間點進行微信的私信發送,排名靠前者獲得,人工操

緣起

這個故事起源于女票是一個bjd娃圈愛好者,我才知道在娃圈里經常通過微博私信的方式進行一些商品的交易,例如娃娃的面妝、衣服和娃娃本身,這就引發了搶票需求

流程:

在某一個整的時間點進行微信的私信發送,排名靠前者獲得,人工操作反應慢,只能提前一秒卡點按發送,但是又有提前的風險(顯示的發送時間未到整點時間會被淘汰),而且只能發送一條信息,發多了也會被淘汰

github搶票。需求:

盡可能快的在某時間點反映并進行操作,并且不能早于該時間點進行操作,精準度要求高

分析了這個需求以后,立馬想到用python進行自動化,計算機不僅操作速度比人快,而且不需要提前卡點操作,條件設置好不會導致過早發送

一、基本思路

python搶票軟件?因為只是微博私信發送,所以這個程序很簡單,就是利用selenium打開微博網頁,然后登陸,找到私信的用戶,輸入內容,點擊發送,這都是selenium的常規操作,這里就不贅述了

程序的核心就是利用while循環判斷時間,如果到了時間就點擊發送?

接下來主要講:怎么卡點定時,和怎么提高運行效率

二、1.0版本:利用系統自帶時間

while True:tt=time.asctime()if tt[14:16]=='00': #這里是一個簡化處理,判斷的時候直接用分鐘數是否為“00”來代替整點,更嚴謹一點應該判斷整個時間戳driver.find_element_by_xpath("//button[text()='發送']").click()breakelse:continue

pycharm和python區別?最開始我想的很簡單,就是獲取系統自帶的時間,但是運行過后發現電腦系統的時間和微博服務器的時間總有幾秒的差距,因為微軟和微博用的服務器不一樣,所以總是有差距,對于卡點搶票的程序,這幾秒的差距是致命的

為此我試過用time.sleep()強行把其中的差距補上,但是因為網速、時間運行差距累計的問題,這種方法顯然是不可靠的,而且也失去了對時間精準度的核心需求,最后當然失敗了,為此不得不接受女友的嘲笑(說還不如用手快……),因此必須獲得微博服務器的時間

二、2.0版本:headers()獲取微博服務器時間

因為我們用的是selenium,是一種完全模擬人操作瀏覽器的方法,而在微博的網頁上又不會直接顯示自己的服務器時間(只有每條微博的發布時間,而且有的只顯示“剛剛”),甚至為此學習了手機自動化(因為手機上的時間和微博服務器的時間是一樣的),但手機的運行效率太低,最終放棄了。

python爬蟲selenium?之后想到了用requests,因為requests中的headers()能夠返回響應頭,其中就包含了響應時間,而這個響應時間就來源于微博服務器的時間,即下圖中的Date。

{'Server': 'WeiBo/LB', 'Date': 'Wed, 09 Mar 2022 08:09:05 GMT', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Accept-Encoding', 'Cache-Control': 'no-cache, must-revalidate', 'Expires': 'Sat, 26 Jul 1997 05:00:00 GMT', 'Pragma': 'no-cache, no-cache', 'DPOOL_HEADER': 'yf-pub-10-85-144-201', 'Content-Encoding': 'gzip'}

那么我們就可以在每次判斷是否要發送前都用requests發起一次請求并獲得響應時間,判斷響應時間是否是我們預期的時間,然后點擊發送。?

while True:response = requests.get('https://weibo.com/')header = response.headers #返回的是一個字典if header['Date'][23:25] == '00' : #這里也是簡化處理了driver.find_element_by_xpath("//button[text()='發送']").click()breakelse:continue

到這里基本可以了,但是在嘗試了一次后以毫厘之差輸給了別人,說明運行速度還是不夠,于是思考如何提高運行效率。

python 搶票。

三、3.0版本:requests.header()提高請求頻率

在詳細地了解requests.get()方法后,發現并沒有能提高請求頻率的參數,但是在requests庫中還有另一個請求方法requests.head(),它的功能是以很少網絡流量獲取概要信息,看到這個功能介紹的時候感覺就很可能可以提高請求頻率。于是我做了一個實驗,在一秒內能請求并響應幾次。

#get方法
tt_1 = time.time()
a=1
while True:tt_2 = time.time()if tt_2 - tt_1 <=1: #這是獲取了時間戳(1970紀元后經過的浮點秒數),將兩個時間戳相減不超過一秒作為測試的時間response = requests.get('https://weibo.com/')header = response.headersprint(header['Date'],a)a+=1 #次數else:break

這里嘗試了好幾次,基本上在15-18次左右

Mon, 07 Mar 2022 08:17:58 GMT 1
Mon, 07 Mar 2022 08:17:58 GMT 2
Mon, 07 Mar 2022 08:17:58 GMT 3
Mon, 07 Mar 2022 08:17:58 GMT 4
Mon, 07 Mar 2022 08:17:58 GMT 5
Mon, 07 Mar 2022 08:17:58 GMT 6
Mon, 07 Mar 2022 08:17:58 GMT 7
Mon, 07 Mar 2022 08:17:58 GMT 8
Mon, 07 Mar 2022 08:17:58 GMT 9
Mon, 07 Mar 2022 08:17:58 GMT 10
Mon, 07 Mar 2022 08:17:59 GMT 11
Mon, 07 Mar 2022 08:17:59 GMT 12
Mon, 07 Mar 2022 08:17:59 GMT 13
Mon, 07 Mar 2022 08:17:59 GMT 14
Mon, 07 Mar 2022 08:17:59 GMT 15

#head方法
tt_1 = time.time()
a=1
while True:tt_2 = time.time()response = requests.head('https://weibo.com/')header = response.headersif tt_2 - tt_1 <=1:print(header['Date'],a)a+=1else:break

python安裝selenium,測試后一秒內能進行30次左右

Mon, 07 Mar 2022 08:32:19 GMT 1
Mon, 07 Mar 2022 08:32:19 GMT 2
Mon, 07 Mar 2022 08:32:19 GMT 3
Mon, 07 Mar 2022 08:32:19 GMT 4
Mon, 07 Mar 2022 08:32:19 GMT 5
Mon, 07 Mar 2022 08:32:19 GMT 6
Mon, 07 Mar 2022 08:32:19 GMT 7
Mon, 07 Mar 2022 08:32:19 GMT 8
Mon, 07 Mar 2022 08:32:19 GMT 9
Mon, 07 Mar 2022 08:32:19 GMT 10
Mon, 07 Mar 2022 08:32:19 GMT 11
Mon, 07 Mar 2022 08:32:20 GMT 12
Mon, 07 Mar 2022 08:32:20 GMT 13
Mon, 07 Mar 2022 08:32:20 GMT 14
Mon, 07 Mar 2022 08:32:20 GMT 15
Mon, 07 Mar 2022 08:32:20 GMT 16
Mon, 07 Mar 2022 08:32:20 GMT 17
Mon, 07 Mar 2022 08:32:20 GMT 18
Mon, 07 Mar 2022 08:32:20 GMT 19
Mon, 07 Mar 2022 08:32:20 GMT 20
Mon, 07 Mar 2022 08:32:20 GMT 21
Mon, 07 Mar 2022 08:32:20 GMT 22
Mon, 07 Mar 2022 08:32:20 GMT 23
Mon, 07 Mar 2022 08:32:20 GMT 24
Mon, 07 Mar 2022 08:32:20 GMT 25
Mon, 07 Mar 2022 08:32:20 GMT 26
Mon, 07 Mar 2022 08:32:20 GMT 27
Mon, 07 Mar 2022 08:32:20 GMT 28
Mon, 07 Mar 2022 08:32:20 GMT 29
Mon, 07 Mar 2022 08:32:20 GMT 30
Mon, 07 Mar 2022 08:32:20 GMT 31
Mon, 07 Mar 2022 08:32:20 GMT 32

這是最新的優化方案了,還沒來得及實戰測試。還有一個優化思路是提高循環語句的效率,對比了for循環和while循環沒有太大的差別,網上看到map方法和列表理解會比for循環快,但貌似這兩個方法只局限于一些轉換映射的操作,還沒仔細了解。

四、搶票程序的共有思路

qpython。為女票搶票的程序從去年秋天就開始寫,斷斷續續的,每次都是失敗了才發現問題,因為搶票機會也不是總是有,所以實戰機會少,優化迭代的速度也就慢,當然也是自己比較業余,沒能想到前頭。雖然這個搶票程序只有幾行代碼,十分簡單,但是可以分享一下這么久以來學習搶票軟件的思路。

中間我也查閱了很多其它搶票程序的寫法(12306等),基本上都是用selenium,中間包括很多登錄、驗證的操作,各種點擊、輸入信息等,核心都是用循環進行刷新查詢等,但是像微博私信這種沒有一個具體的對象來點擊或查詢的,就需要有時間卡點的設計。

1、登錄驗證

很多搶票程序最復雜的地方,因為票方平臺為了防止爬蟲黃牛,會設計很多登錄門檻和驗證方式,所以很多程序實際上大部分的代碼都在解決這個問題,進入以后核心的循環語句反而是很簡單的,如果使用selenium就涉及selenium的鼠標操作、鍵盤操作,更難的可能還有圖片識別。微博反而是簡單的了,但其實如果不想費勁,可以降低自動化程度,在一些地方采用人工的方式,畢竟技術太難,搶票嘛,不寒磣……

2、時間卡點設計

我發現很多搶票程序并沒有對開票時間進行時間卡點的設計,其實難度也不高,重點是要獲取的是目標服務器的時間,因為不同的服務器時間會有略微的差別,不要直接用本地時間來操作。當然如果有一些可操作的元素,如點擊按鈕會在開始時間后出現,也可利用不斷地刷新查找來解決。

3、循環語句

python爬蟲搶票。循環語句是搶票程序的核心,雖然它內容相對簡單,但是它仍然是核心,將輸入信息、查詢、點擊、時間卡點等操作嵌入循環中,就是一個基礎的搶票程序。我看到一句話非常準確,大意是現在所謂搶票程序實際就是搶票的自動化。

自動化后依賴計算機的運行速度提高搶票的概率這就是搶票程序的核心思路,但要進一步提高搶的概率,就必須尋找更高效的方法。

對于簡單的搶票程序而言,完成自動化或者半自動化(主要是循環語句部分的自動化)就已經足夠了,當然適用性和便利性會大打折扣。

最后一個小tip

搶票程序會受到網速的影響,有一次在幫女票實戰搶票中因為網速問題,兩三秒才把私信發出去,真·不如手速,但所有搶票程序都會受到這個的影響,記得保持網絡流暢!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/140280.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息