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

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

[楽天ラッキーくじを自動化する【ポイント不労所得】](https://stock-stu.com/rakuten-auto-lottery)

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

## ソースコード
ソースコードは以下の通りです。
```python: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ドライバのオプションについて
```python: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スクレイピング](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#code-blocks---%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF)
こちらの記事などに解説されていますが、一応どのような環境においても動くためのオプションです。

### くじ一覧にアクセスする
```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)]
```
[こちらのリンク](https://rakucoin.appspot.com/rakuten/kuji/)では、その時に開催されているくじをまとめてくださっています。
そちらを利用してurl_txtsにリンクを格納します。

### くじを引いていく
```python: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上で自動実行したいのですが、ユーザーディレクトリを上手く読み込んでくれないようで困っています。
一々楽天アカウントにログインするのも不審ですしね…