pythonのseleniumを使って、Amazonにログインし、購入する一歩手前までのプログラムを書いてみた。
seleniumにはWebドライバーが必要だが、Safariの場合開発メニューから「リモートオートメーションを許可」するだけで良い。
以下の通り、認証情報やURLを確認して記載する。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
LOGINURL = 'https://www.amazon.co.jp/ap/signin?.....'
MAILADDRESS = '.....'
PASSWORD = '.....'
PRODUCTURL = "https://www.amazon.co.jp/dp/...../"
PRODUCTURLの最後には、購入したいamazonの商品IDを入れる。
Safariを起動して購入ボタンを押す処理がこちら。
def main():
driver = webdriver.Safari()
driver.get(LOGINURL)
# ログイン処理
login_input = driver.find_element(By.ID, "ap_email")
login_input.send_keys(MAILADDRESS)
# 以下のコードではクリックできなかった
# driver.find_element(By.ID, "continue").click()
# 続けるボタンをクリック
driver.find_element(By.ID, "continue").send_keys(webdriver.Keys.ENTER)
time.sleep(1)
# パスワード入力
password_input = driver.find_element(By.ID, "ap_password")
password_input.send_keys(PASSWORD)
# サインインボタンをクリック
driver.find_element(By.ID, "signInSubmit").send_keys(webdriver.Keys.ENTER)
time.sleep(3)
# ログイン終了
# 商品ページへ
driver.get(PRODUCTURL)
time.sleep(2)
# 今すぐ買うボタンを押す.読み込みに時間がかかる。
driver.find_element(By.ID, "buy-now-button").send_keys(webdriver.Keys.ENTER)
time.sleep(5)
if __name__ == "__main__":
main()
ちなみに、今すぐ買うボタンを押しただけでは商品は購入できず、最後に確認ボタンを押す必要がある。
sleepの時間は適当に設定しているが、ネットワークの読み込みが遅い場合などでは、時間を長くしないとエラーが出ると思う。
久々にseleniumを使ったけど便利で楽しいな。
グレードアップ
在庫が無かった時の場合も考えてみた。
- 商品ページを読み込む。
- 今すぐ買うボタンがあるかどうかチェックする。
- なければ再試行(リロード)、あればログインして購入。
今すぐ買うボタンがあるか、ないかはtry catchを使うと判別できる。
繰り返す回数は自由に指定できるようにした。
ログインURLは勝手に遷移してくれるので、コード上記載する必要はない。
import datetime
import time
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
MAILADDRESS = ''
PASSWORD = ''
PRODUCTURL = "https://www.amazon.co.jp/dp/429500..../"
TRYC = 2
WAITTIME = 1
# 商品画面、ログイン画面、購入確定画面の順番に遷移する
def login(driver):
# ログイン処理
login_input = driver.find_element(By.ID, "ap_email")
login_input.send_keys(MAILADDRESS)
driver.find_element(By.ID, "continue").send_keys(webdriver.Keys.ENTER)
time.sleep(WAITTIME)
# パスワード入力
password_input = driver.find_element(By.ID, "ap_password")
password_input.send_keys(PASSWORD)
driver.find_element(By.ID, "signInSubmit").send_keys(webdriver.Keys.ENTER)
time.sleep(WAITTIME)
# 注文確定
try:
driver.find_element(By.ID, "placeYourOrder").send_keys(webdriver.Keys.ENTER)
time.sleep(WAITTIME)
print("bought")
except NoSuchElementException:
print("can't buy")
def main():
driver = webdriver.Safari()
driver.get(PRODUCTURL)
time.sleep(WAITTIME)
for i in range(TRYC):
# 在庫切れを考慮して、ボタンがあるかないかで、分岐する
try:
print("開始します.", i, "回目", datetime.datetime.now())
# 今すぐ買うボタンを押す.
driver.find_element(By.ID, "buy-now-button").send_keys(webdriver.Keys.ENTER)
time.sleep(WAITTIME)
if driver.title == "Amazonサインイン":
print("サインイン画面が出てきました。")
login(driver)
break
except NoSuchElementException:
# 今すぐ買うボタンが無かった場合、繰り返す
print("今すぐ買うボタンが見つかりませんでした。")
driver.refresh()
time.sleep(WAITTIME + 2)
if __name__ == "__main__":
main()
ちなみに、最後の注文確定ボタンは存在しないIDにしてあるので、購入しない。
間違って注文したら大変だからね!