NokkunBlog

Keep technology simple.

PythonでAmazon商品の自動購入

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を使ったけど便利で楽しいな。

グレードアップ

在庫が無かった時の場合も考えてみた。

  1. 商品ページを読み込む。
  2. 今すぐ買うボタンがあるかどうかチェックする。
  3. なければ再試行(リロード)、あればログインして購入。

今すぐ買うボタンがあるか、ないかは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にしてあるので、購入しない。

間違って注文したら大変だからね!