Python 爬蟲教學 -試著作自己的搶購機器吧!(下)

原本預期只打算寫上下兩篇,但發現可以寫的東西很多,今天應該會是最後一篇,一起製作自己的搶購機器吧!

如果你還沒有看過上次提到的內容,那連結在這裡,先去追趕進度吧

程式實作

接續上次我們提到 python 利用顯性等待,來讓機器不會跑得比網頁快之後,應該可以完成到登入的步驟,那登入之後利用上次的例子,我們會回到產品的畫面,按照正常的步驟我們需要點擊立即購買的按鈕,於是我們一樣右鍵點擊立即購買,並且點擊檢查,就可以找到立即購買按鈕的原始碼,此處我們來看程式碼

WebDriverWait(browser, 1, 0.4).until(EC.presence_of_element_located((By.CLASS_NAME, 'SasCheckoutButton__mod___1BK9F.CheckoutBar__buyNowBtn___qgDtR.CheckoutBar__checkoutButton___jSkkJ'))) #顯性等待 不然爬蟲跑太快了 抓不到元素
search_buy=browser.find_element_by_class_name('SasCheckoutButton__mod___1BK9F.CheckoutBar__buyNowBtn___qgDtR.CheckoutBar__checkoutButton___jSkkJ').click()

做完顯示等待之後,我們就可以透過原本的find_element_by_class_name來抓取按鈕元素,之後便可以做點擊

點擊過後一樣來到這個畫面,之後只要再對確認購買這個按鈕做一次一樣的事情就好了,接下來就會來到比較不一樣的地方,你必須要開始輸入資訊,為了確保到時候在搶購的速度能夠更快,我們可以先去奇摩的網站將自己的信用卡資訊填入,以確保到時候可以直接開始,而到這邊我們會迎來兩個新的功能要理解,先來看下圖和程式碼

browser.switch_to.frame(0)      #此處很重要,卡在沒有切iframe才一直找不到屬性

element2 = WebDriverWait(browser,30, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="walletForm"]/div[2]/label/input')))  #信用卡金鑰輸入
element2.send_keys('xxx')

browser.switch_to.default_content()  #將信用卡屬性填完之後要切回主frame來填購買button

首先是switch_to_frame這個方法,如果我們在這裡直接想要輸入驗證碼而直接去寫第三行的話,會發現找不到這個元素,所以我們先來看下圖在檢查屬性之後,我們發現了在信用卡這個欄位,有著iframe這個屬性,簡單來講的話他等於是將資訊藏在這個frame裡面,我們先這樣理解就好,有時候有些網站會套很多個iframe來擋爬蟲,這個時候使用switch_to_frame便可以轉換到這個frame下去找資訊,之後找到輸入的欄位,接下來呢如果們要在欄位裡面輸入資訊的話,就要使用send_keys這個方法,使用方法非常直覺,如上面的程式碼,那填完之後呢,我們要記得切回來原本的大框架下,這樣才能繼續搜尋其他的資訊

WebDriverWait(browser,10, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="checkout"]/div[2]/div[2]/div[3]/div[2]/div/label/input'))).send_keys("school021195@gmail.com") #email
purchasebutton = WebDriverWait(browser,10, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="checkout"]/div[2]/div[3]/div[4]/button'))) #最後一步 小心測試時要註解掉  
purchasebutton.click()

最後這裡要教大家一個尋找元素最好的方法,之前利用find_element_by_classname其實是很容易失敗的,原因有非常多,大家可以注意到前面的id都是有很多特殊符號且又臭又長,很多時候有些空格或符號是有可能造成抓取元素失敗的,所以最保險的其實還是利用xpath這個方法,他可以直接去定位位置,那我們要怎麼得到xpath呢,我們先來看下圖

我們在右邊網頁原始碼的部分,點擊右鍵之後會有複製的選項,其中就有複製xpath的選項,用這樣的方式就可以輕鬆找到元素了,到這一步之後,只要再點擊購買按鈕,我們就完成了一個自動化的購買機器了!但接下來還有最後一步,要如何做搶購呢?因為這樣寫完之後,實際上在搶購前,是不會有立即購買的按鈕的,而如果你搶購時間到再來點擊程式,還需要做登入那些步驟絕對不夠快,所以我們在這裡需要對整個程式做一些微調,也就是當我們到了還沒有搶購按鈕的頁面時,我們將接下來要點擊購買的這個步驟,用while包起來,我們來看程式碼!

while 1:     #利用顯性等待 每0.5秒檢測一次 檢測到五秒跳出wait 之後到except之後刷新網站 在繼續檢測五秒 時間可以自己做調整          
    try:
        WebDriverWait(browser, 1, 0.4).until(EC.presence_of_element_located((By.CLASS_NAME, 'SasCheckoutButton__mod___1BK9F.CheckoutBar__buyNowBtn___qgDtR.CheckoutBar__checkoutButton___jSkkJ'))) #顯性等待 不然爬蟲跑太快了 抓不到元素
        search_buy = browser.find_element_by_class_name('SasCheckoutButton__mod___1BK9F.CheckoutBar__buyNowBtn___qgDtR.CheckoutBar__checkoutButton___jSkkJ').click()
        print(search_buy)
        print ('已定位到元素')
        break
    except:
        print("還未定位到元素! 刷新")
        browser.refresh()

在此處我們設定成,登入後,只要沒有找到立即購買的按鈕,我們就用refresh這個方法刷新網站,直到找到之後再來接續前面的步驟,也就是說假設搶購開放時間是12點整,我們可以在11:55分就開啟這份程式,讓它持續做循環,就可以在十二點按鈕被更新到網站時,直接完成搶購。

以上就是整個搶購機器的教學,當然如果你真的想要搶到ps5的話,我想你還會需要一個網速非常快的環境,整體來講應該是講解爬蟲的原理,真的想要搶到的話,我對於爬蟲的世界探索也還沒有到非常大師級,或許會有更好的寫法或者執行方式來去做搶購,但就將我摸索出來的分享給大家,如果你有任何想學關於Python的後續也可以留言在下面,搶購機器的教學就到這裡!

馬上看–JavaScript教學-從打造一個計時器裡認識JavaScript(上)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *