iT邦幫忙

2021 iThome 鐵人賽

DAY 13
10
Software Development

奇怪的知識增加了!原來程式還可以這樣用?!系列 第 13

[Day13] 搶 PS5 程式怎麼寫? 動態爬蟲詳細教學!

我知道PS5已經退燒了,但要不是因為想搶PS5我根本不會碰Python (一種恩人的概念)
所以今天還是拿PS5舉例喔~


Selenium的基本用法

大家只要想Selenium就是模擬我們用電腦的點擊、打字、導向網頁等行為

  • 導向指定網頁
driver.get("https://m.momoshop.com.tw/mymomo/login.momo")

要買東西,第一步就是要先到購物網站登入。
driver.get() 裡面放的是你要連的網站,這邊打開是momo購物網的登入頁面喔~
https://ithelp.ithome.com.tw/upload/images/20210911/20133286zxv9yZeqET.png

  • 打字
driver.find_element_by_id('memId').send_keys('你的帳號')
driver.find_element_by_id('passwd').send_keys('你的密碼')

再來就是要輸入你的帳號密碼,send_keys() 裡面放的是你要輸入的字,
那要怎麼知道要在哪一個框框輸入帳號呢? 首先要在網站頁面按 F12
接下來再按圖片1號處的選取箭頭,點擊圖片2號處的帳號框框,就可以得到帳號框的屬性囉(圖片3號處)!
https://ithelp.ithome.com.tw/upload/images/20210911/20133286hOhY95HoCK.png

知道帳號框框的id是memId後,就可以用find_element_by_id() 定位元素了~
其實也不一定要用id定位,只是這個方法最不會錯,其他定位方式可以看Selenium官方文件喔~

  • 點擊
driver.find_element_by_class_name('login').click()

輸入完帳號密碼要點擊下方的登入,我這邊用的定位方式是class name,
https://ithelp.ithome.com.tw/upload/images/20210911/20133286yQeNi3IyvO.png

  • 顯性等待
WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located((By.ID, 'buy_yes')))

進入PS5購買頁面會看到可訂購時通知我的按鍵 (不可購買)
https://ithelp.ithome.com.tw/upload/images/20210911/20133286nR570Xcg1N.png
所以我們要用顯性等待方式,每0.5秒刷新一次頁面,直到偵測到直接購買按鈕為止
那要怎麼得到直接購買按鈕的id呢? 去別的商品頁面看就可以囉~
https://ithelp.ithome.com.tw/upload/images/20210911/201332867fQPXZkwDk.png

完整程式碼(不含結帳部分)

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
prefs = {
    'profile.default_content_setting_values':
        {
            'notifications': 2
        }
}
options.add_experimental_option('prefs', prefs) 
options.add_argument("disable-infobars") 

driver = webdriver.Chrome(options=options)
driver.maximize_window() 

driver.get("https://m.momoshop.com.tw/mymomo/login.momo") # 到登入頁面

driver.find_element_by_id('memId').send_keys('帳號') # 輸入帳號
driver.find_element_by_id('passwd').send_keys('密碼') # 輸入密碼
driver.find_element_by_class_name('login').click()

driver.get("https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=8267514&str_category_code=2900100474")
#driver.get("https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=8820259&mdiv=shopCart")

while 1:
    try:
        buy = WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located((By.ID, 'buy_yes'))) # 顯性等待
        buy.click() # 偵測到可以購買按鈕就點擊按鈕
        print ('可以購買!')
        break # 後面結帳部分就不寫囉
    except:
        print("還不能購買! 重新整理!")
        driver.refresh() # 重整頁面

成果發表會從缺

因為PS5一直都沒補貨,加上我也沒錢買,所以這次沒有成果發表會喔哈哈


上一篇
[Day12] WebDriver安裝教學aka自動發文器第二集
下一篇
[Day14] 家裡WiFi被媽媽鎖了怎麼辦? 教你用Python破解WiFi密碼 !
系列文
奇怪的知識增加了!原來程式還可以這樣用?!24
1
dscwferp
iT邦高手 1 級 ‧ 2021-09-13 12:58:50

GOOD!
還好我老婆很享受點點點樂趣
沒要我幫她搶!
呼~~~

1
Marvin
iT邦新手 5 級 ‧ 2021-09-13 13:48:01

嗚嗚~~如果我早點看到這篇,我就....

1
johnqq
iT邦新手 5 級 ‧ 2021-09-13 16:52:10

寫這種搶票最大的困難點在於你點下購買他只是進入購物車,還有後續結帳部分
除非你以前有結帳過,有寫完後續處理
不然在完成結帳前,你搶到的名額還是會被結帳的人搶走

lulu_meat iT邦新手 4 級 ‧ 2021-09-13 16:55:24 檢舉

因為我之前有買過東西,所以只要輸入卡好按送出就買好了XD

3
jiatool
iT邦新手 5 級 ‧ 2021-09-14 09:21:23

真的是實用的教學 XDDD

雖然好像沒很相關,
但如果想在 PChome 搜尋商品,也歡迎參考我這篇~
[Python爬蟲實例] PChome 線上購物 (上篇)

lulu_meat iT邦新手 4 級 ‧ 2021-09-14 09:29:27 檢舉

寫的超詳細!! 只好拍手五次ㄌ

1
mackuo
iT邦新手 4 級 ‧ 2021-09-14 09:35:52

感謝教學!!
剛剛試了一下,網頁是不能訂購的狀態,
但程式執行後,卻回應說「可以購買」,
是我弄錯了什麼嗎?

看更多先前的回應...收起先前的回應...
lulu_meat iT邦新手 4 級 ‧ 2021-09-14 10:15:26 檢舉

喔喔喔!!!!太感謝了!
我之前測試的時候拿可以購買的商品做測試,忘記改回來><

buy = WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located((By.ID, 'buy_yes'))) # 改成BY.ID,'buy_yes'

這行改掉就沒有問題了喔~~
謝謝您的提醒!!!

mackuo iT邦新手 4 級 ‧ 2021-09-14 10:19:44 檢舉

謝謝您的回覆!!

但這次您的帳號,密碼直接寫在code中了喔!!!

lulu_meat iT邦新手 4 級 ‧ 2021-09-14 10:24:59 檢舉

........我要崩潰了
好險你有跟我說

mackuo iT邦新手 4 級 ‧ 2021-09-14 10:31:43 檢舉

哈哈哈,謝謝您了。
有空再好好拜讀您的系列文,真的太讚了。

lulu_meat iT邦新手 4 級 ‧ 2021-09-14 10:34:33 檢舉

看來我還沒從打完疫苗的副作用康復

1
cheerupche
iT邦新手 5 級 ‧ 2021-09-16 17:03:57

來了
這篇也好有趣XD

lulu_meat iT邦新手 4 級 ‧ 2021-09-16 17:40:43 檢舉

這篇我覺得留言比正文有趣XD

我要留言

立即登入留言