8 min readPython
Python x Seleniumを使って楽天の「ラッキーくじ」を自動化!?
楽天には「ラッキーくじ」というくじ引きがあります。楽天会員ならば誰でも引けて、毎日1度利用可能です。ただ毎回ページを開いて、くじ引きするのは大変です。そこで、今回はPython x Seleniumを活用し、くじ引きを自動化致します。
目次
目次を開く⬇︎
執筆者 - おすすめの記事2選
楽天ラッキーくじとは?
楽天には「ラッキーくじ」というくじ引きがあります。楽天会員ならば誰でも引けて、毎日1度利用可能です。
くじに当たることができれば、楽天スーパーポイントを獲得できます。当選本数は、1000ポイント(1名)、1ポイント(1000名)程度と、なかなか当たりません。
ただ、【楽天】ラッキーくじ一覧のページを見てもわかる通り、たくさんのくじを毎日引けるので、数多くチャレンジすればチャンスを掴めそうです。
用意するもの
- 楽天への会員登録
- ローカルにてPython環境が叩ける状態であること(ターミナルにて
python -V
でバージョンが表示されていること) - PythonでSeleniumが利用できる環境
- コードを編集する、個人に合うエディタが使える状態であること(おすすめはVsCode)
アーキテクチャ
実行手順
上記のアーキテクチャを見ただけではわからない部分も多々あるかと思います。まずは以下の手順を踏まえて、ローカル環境(自身のパソコン)にて実装してみましょう。
ローカル環境上にファイルを置く
以下の作業は、私の方で実際に作成したコードを、自身のパソコンへファイルを置く作業になります。
- こちらのページに訪問ください。
- 緑の「Code」と書かれているボタンをクリックして、 「Download ZIP」をクリックください。
- ダウンロードしたZipファイルをドラック&ドロップを使って、デスクトップへファイル移動して下さい。
- Zipファイルを展開するために、デスクトップに置いた先ほどのファイルをダブルクリックして下さい。
Python を実行してみる
必要なパッケージ(Pythonを実行する際に汎用的に使われるコード群)をインストールして、Pythonを実行します。
- ターミナルを開いて、kuji-masterのディレクトリへ移動します。(
cd
を利用する。) - ターミナル上で
pip install -r requirements.txt
と入力する。(kuji-masterディレクトリ内にrequirements.txtファイルを用意していて、ファイルを実行するために必要なパッケージ情報を記載しています。その情報を元に自身のパソコン内へパッケージを格納しています。) - お好みのエディタを立ち上げます。
- kuji.pyファイルを開いて、以下のコードを変更する。
- 【楽天】ラッキーくじ一覧 を参考に、kujiUrlListの配列値へ好みのくじURLを格納してください。(例 : https://kuji.rakuten.co.jp/14d330d3e0)
- userIdの値に楽天ページへログインする際のユーザーIDを格納する。
- passwordの値に楽天ページへログインする際のパスワードを格納する。
- 最後に
python kuji.py
を実行すると、デモのようにブラウザが立ち上がって、くじページへ遷移し、くじ引きしてもらえます。
完成動画
よくわかるコード解説
以下のkuji.py
コードでは、
- 指定されたくじ引きを行うページを開く。
- くじを引くためのHTML要素を指定する。
- 上記の要素をクリックする。
を行っております。くじを押せる要素がなければ、except NoSuchElementExceptionの例外に飛ばされ、後続処理が残っているにも関わらず実行されないことを防いでいます。
1# 指定URLのくじを引く関数
2def openKujiBrowser(selenium, url):
3 # 処理中にエラーが発生して、後続処理に対し動作停止になるのを防ぐためtryしている。
4 try:
5 # 指定URLへアクセス
6 selenium.access(url)
7
8 # ページ読み込みのために遅延させる。
9 selenium.stop(5)
10
11 # くじ開始ボタンの要素をセット
12 selenium.find_element_xpath("//*[@id='entry']")
13 # くじ開始ボタンクリック
14 selenium.click()
15
16 # くじの実行時間のために遅延させる。
17 selenium.stop(20)
18
19 # 要素がない場合のエラーハンドリング
20 except NoSuchElementException:
21 selenium.stop(1)
以下のautomate.py
コードでは、
- __init__関数でインスタンスの初期化を行う。
- driver, elementの変数を持たせる。
- driver : ブラウザ操作する要素自身を表すもの。
- element : 指定したHTML要素自身を表すもの。
- access関数で指定されたページへアクセスする。
- find_element_by_id, find_element_css_name, find_element_xpath関数で、操作したいHTML要素を設定する。
- set_value関数で、操作したいHTML要素に対して値を格納する。
- click関数で操作したいHTML要素に対してクリックする。
- stop関数で時間を指定して、プロセス実行を遅延する。
- quit関数でブラウザ操作を終了する。
操作を行っております。
1class Selenium:
2 driver = None
3 element = None
4
5 def __init__(self):
6 options = webdriver.ChromeOptions()
7 # ブラウザを開くことなくバックグラウンドにて実行する。
8 # options.add_argument('--headless')
9
10 self.driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
11 # ブラウジングするwindow幅を設定する。
12 self.driver.set_window_size(1300, 1040)
13
14 def access(self, url):
15 self.driver.get(url)
16
17 def find_element_by_id(self, name):
18 self.element = self.driver.find_element_by_id(name)
19
20 def find_element_css_name(self, name):
21 self.element = self.driver.find_element_by_css_selector(name)
22
23 def find_element_xpath(self, name):
24 self.element = self.driver.find_element_by_xpath(name)
25
26 def set_value(self, value):
27 self.element.send_keys(value)
28
29 def click(self):
30 self.element.click()
31
32 def stop(self, num):
33 time.sleep(num)
34
35 def quit(self):
36 self.driver.quit()
今日のまとめ
- Seleniumを活用することでブラウザ操作を容易に行うことができる。
- ブラウザ操作をしていて、要素が見つからない場合の例外処理としてtry exceptを活用する。
- ブラウザが完全に読み込まれるのを遅延させるために、sleepを活用する。
こんなことにもチャレンジしてみよう
- 他のWebページに関してもSeleniumを活用して操作してみよう。
- 毎回ファイル実行する度にブラウザが表示されるのはやや不便です。Headlessを活用してブラウザ表示せずに操作してみよう。
- 毎回コマンドを入力して実行するのは不便です。crontabやLambda, Google Cloud Functions等を活用してみよう。
- くじの結果をスプレットシートなどに記録して、データ分析してみる。(時間帯別)
参考文献
- 例外とは?
- 例外処理とは?
- Pythonで利用するクラスとは?
- Headlessについて
- Crontabの使い方
- Lambdaの使い方
- Google Cloud Functionsの使い方
- seleniumで「楽天 ラッキーくじ」を自動化して、運試しをしてみる