LoginSignup
3
7

More than 1 year has passed since last update.

楽天ラッキーくじをPythonとSeleniumで自動化する

Last updated at Posted at 2022-03-16

こんにちは!
私は自分のブログでこのような記事を書きました。

楽天ラッキーくじを自動化する【ポイント不労所得】

リンク先ではコードについての解説より、どのように動くのかをメインに解説していたので、本記事ではソースコードの解説を詳細にしようと思います!

ソースコード

ソースコードは以下の通りです。

app.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

#Chromeオプション
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--no-sandbox')
options.add_argument('--lang=ja')
options.add_argument('--user-data-dir=' + 'ユーザーデータのディレクトリ')
# Chromeドライバーの起動
driver = webdriver.Chrome(r'driver/chromedriver.exe', chrome_options=options)

# くじ一覧にアクセスする
driver.get("https://rakucoin.appspot.com/rakuten/kuji/")
urls = driver.find_elements_by_xpath ("//table/tbody/tr/td/a")
url_txts = [urls[i].get_attribute("href") for i in range(len(urls)-2)]

for i in range(len(url_txts)):
    driver.get(url_txts[i])
    #もしまだくじを引いてなかったら
    print("Accessing " + url_txts[i])
    if(len(driver.find_elements_by_id("entry"))>0):
        print("success")
        time.sleep(2)
        start_button = driver.find_element_by_id("entry")
        start_button.click()
        time.sleep(20)
    else:
        print("faiiled")
        time.sleep(2)
        continue
driver.close()
driver.quit()
exit()

Seleniumの準備については詳しいページが多々あるので、そちらに譲ります。

では順に解説をしていきます。

Chromeドライバのオプションについて

app.py
#Chromeオプション
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--no-sandbox')
options.add_argument('--lang=ja')
options.add_argument('--user-data-dir=' + 'ユーザーデータのディレクトリ')
# Chromeドライバーの起動
driver = webdriver.Chrome(r'driver/chromedriver.exe', chrome_options=options)

実践/現場のPythonスクレイピング
こちらの記事などに解説されていますが、一応どのような環境においても動くためのオプションです。

くじ一覧にアクセスする

app.py
# くじ一覧にアクセスする
driver.get("https://rakucoin.appspot.com/rakuten/kuji/")
urls = driver.find_elements_by_xpath ("//table/tbody/tr/td/a")
url_txts = [urls[i].get_attribute("href") for i in range(len(urls)-2)]

こちらのリンクでは、その時に開催されているくじをまとめてくださっています。
そちらを利用してurl_txtsにリンクを格納します。

くじを引いていく

app.py
for i in range(len(url_txts)):
    driver.get(url_txts[i])
    #もしまだくじを引いてなかったら
    print("Accessing " + url_txts[i])
    if(len(driver.find_elements_by_id("entry"))>0):
        print("success")
        time.sleep(2)
        start_button = driver.find_element_by_id("entry")
        start_button.click()
        time.sleep(20)
    else:
        print("faiiled")
        time.sleep(2)
        continue
driver.close()
driver.quit()
exit()

url_txtsに格納したリンクに一つずつ大人しくアクセスしていきます。
Seleniumの動作の高速さゆえ、処理が間に合わないところもあるので、所々time.sleepを入れ込んでいます。

時々何らかの原因で、くじページにアクセスできなかったり、既に引いてしまったくじページにアクセスしてしまったりするので、その際は"failled"と表示することにします。

一通り処理が終わったら、SeleniumとPythonの動作を終了します。

まとめ

このようにそれほど長くないコードでくじの自動化ができました。
本当はheadlessにしてHeroku上で自動実行したいのですが、ユーザーディレクトリを上手く読み込んでくれないようで困っています。
一々楽天アカウントにログインするのも不審ですしね…

3
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7