こちらの記事は次のようなことを知りたいという方に向けて書いています。
- pythonを使ってみたいけど、何から手をつければいいかわからない!
- pythonの自動化の例を見てみたい!
- 楽天ポイントの明細の履歴をcsvダウンロードしたいけどpythonでできないかな?
今回は、python初心者に向けたスクレイピングのやり方を、楽天ポイントの明細のダウンロードを例にして説明しますね。
pyhtonスクレイピングの基礎知識
pythonの特徴と簡単にできること
pythonの特徴については、下記リンクで説明していますのでこちらもご参照ください。
簡単にまとめますと、
- シンプルで覚えることが少ない構文になっている
- 1行で多くの処理を記述することができる
- 標準ライブラリとして、多くの機能があらかじめ用意されており便利に使える
- 幅広い用途に使えるPython向け外部ライブラリが豊富に存在する
- 自動でのデータ処理や分析をおこなうなどの業務効率化
- スクレイピングによるWeb上のデータの自動収集
ということになります。
pythonでスクレイピングなど、プログラムのコードを書いていく場合、デバッグなどの作業には仮想環境を使用することをオススメしています。
こちらのリンクで説明しています。
スクレイピングの基本
スクレイピングとは、簡単に言うと、プログラムを活用してインターネットのWebサイトの情報を取ってくる、と考えていいと思います。
手順としては以下のとおりになります。
- 取得したい情報を保有しているWebサイトを特定する
- 対象のWebサイトのHTMLデータをクローラによって取得し、そのデータから必要な情報だけをスクレイピングしてサーバに保存する
- 保存したデータを整理、解析して、目的に合ったデータベースを作成する
- 作成したデータベースを活用する
なお、pythonでスクレイピングをおこなう場合、絶対に気をつけなければならないことがあります。
下記の記事でも説明していますが、接続先のサーバーに必要以上の負荷をかけることだけは絶対にしないでください。基本的には、自分がリンクをクリックしていくのと同じくらいのスピードで考えておいたほうがいいです。
私が公開するコードは、必要以上にウェイト時間を設定していますのでそのまま使っていただく分には問題ないと考えますが、コードを編集する場合は、必ずウェイト時間を設定するようにしてください。
ただ、ウェイト時間がある程度長くても、放っておけば自動的にデータを落としてくれるわけですからあまり気にすることはないと思いますよ。
pythonプログラムの構築
要件の確認
pythonでスクレイピングをおこなう場合、基本的に自分がWebサイトを閲覧するのと同じようにしていきます。
今回トライするのは楽天ポイントクラブのポイント実績からリストをダウンロードして、csvファイルに保存します。
クレジットカードの利用明細や、銀行の入出金明細ならばcsvダウンロードができるのが当然のようになっていますが、そうではない場合、pythonなどでスクレイピングできると便利です。
楽天ポイント明細は以下のように表示されています。
これをデータとして保存するには、通常であればこうやって、範囲指定してコピー→Excelなどにペースト、としますが大量にある場合はなかなか面倒です。
これを自動でできるように、今回は以下の要件を満たすようにしましょう。
楽天ポイント明細で表示されている内容をcsvファイルに自動で保存する
手順の確認
pythonでプログラムを書いていくに当たり、実行手順を確認します。
とは言っても、今回の明細ダウンロードはそれほど複雑ではありません。
- 楽天ポイントクラブのURLにアクセスする
- IDとパスワードを入力して、サインインする
- 1ページ目の画面でデータをダウンロードする
- 2ページ目に移動する。そこでもデータをダウンロードする
- 最後のページまで終わったら、csvファイルにデータを書き出して保存する
Webサイトをスクレイピングするに当たり、ChromeDriverを使用します。
このChromeDriverの使用方法については、別記事で書いていますのでそちらをご参照ください。
pythonプログラムの実行
pythonプログラムの公開
こちらが今回の楽天ポイント明細のスクレイピングのpythonコードです。
IDとパスワードを入力すれば、すぐに使えると思います。
ポイント利用と獲得をプラスマイナスで表示するために二回コードを書いていて、もっと効率化はできるのでしょうけど、今回はそのままにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | from selenium import webdriver import pandas as pd import time import csv import os def get_r_info(): # pythonファイルと同じディレクトリにchromeriver.exeがある場合引数は空でOK driver = webdriver.Chrome() driver.get('https://point.rakuten.co.jp/history/?l-id=point_top_history_pc') # chromedriver起動待ちを3秒似設定 time.sleep(3) try: # 楽天ポイントのログイン画面からIDフィールドを検索、IDを入力 id = driver.find_element_by_id("loginInner_u") # ↓自分のIDを入力 id.send_keys("xxxxxxxxxxxxxxx") # 同じくパスワードフィールドを検索、IDを入力 password = driver.find_element_by_id("loginInner_p") # ↓自分のパスワードを入力 password.send_keys('xxxxxxxxxxxxxxx') time.sleep(1) # ログインボタンを検索、ログインボタンをクリック login_button = driver.find_element_by_name("submit") login_button.click() except: print('Error') # 表示ページの定義 page = 1 confirm_page = 'NEXT' # リストを作成 columns = ['date', 'service', 'detail', 'rankup', 'action', 'point', 'note'] # 配列名を指定する df = pd.DataFrame(columns=columns) count = 1 # 実行 try: while(str(confirm_page) == 'NEXT'): if count > 1 : driver.get(url) print(str(page) + "ページを取得中...") # ポイントの獲得情報を取得 posts = driver.find_elements_by_css_selector('.get') for post in posts: # 日付 date = post.find_element_by_css_selector('td.detail .date').text date = date.replace("[", "") date = date.replace("]", "") service = post.find_element_by_css_selector('.service a').text detail = post.find_element_by_css_selector('td.detail').text try: rankup = post.find_element_by_css_selector('.label-rankup').text except: rankup = 0 action = post.find_element_by_css_selector('.action').text point = post.find_element_by_css_selector('.point').text point = point.replace(',','') note = post.find_element_by_css_selector('.note').text # スクレイピングした情報をリストに追加 se = pd.Series([date, service, detail, rankup, action, point, note], columns) df = df.append(se, columns) # ポイントの利用情報を取得 posts = driver.find_elements_by_css_selector('.use') for post in posts: # 日付 date = post.find_element_by_css_selector('td.detail .date').text date = date.replace("[", "") date = date.replace("]", "") # サービス service = post.find_element_by_css_selector('.service a').text market = 0 # else : detail = post.find_element_by_css_selector('td.detail').text product = '' # ランクアップ try: rankup = post.find_element_by_css_selector('.label-rankup').text except: rankup = 0 # アクション action = post.find_element_by_css_selector('.action').text # ポイント point = post.find_element_by_css_selector('.point').text point = int(point.replace(',','')) * -1 # 備考 note = post.find_element_by_css_selector('.note').text # スクレイピングした情報をリストに追加 se = pd.Series([date, service, detail, rankup, action, point, note], columns) df = df.append(se, columns) # ページ数を1増やす page += 1 # 次のページに進むためのURLを取得 confirm_page = driver.find_element_by_css_selector("ul.pagination li:last-child a").text url = driver.find_element_by_css_selector("ul.pagination li:last-child a").get_attribute("href") count += 1 print('次のページを開いています・・・') time.sleep(3) except: print("最終ページです") # 最後に得たデータをCSVにして保存 filename = "rakuten_point.csv" df.to_csv("csv/" + filename, encoding="utf-8-sig") print("終了しました!!") get_r_info() |
pythonプログラムの実行
pythonプログラムの実行は、以下の手順でおこないます。
- 上記のプログラムをコピーして、scraping_rakuten_point.py(ファイル名はご自由におつけください)として保存する
- コマンドプロンプトからpython仮想環境に入る
- scraping_rakuten_point.pyを実行する
コマンドプロンプトからpython仮想環境に入り、プログラムを実行します。
ChromeDriverが立ち上がり、ユーザIDとパスワードが自動で入力され、ログインボタンが押されます。
コマンドプロンプト側では、進行中のメッセージが出ています。
プログラムが終了すると、ChromeDriverも自動で終了します。
放っておいても大丈夫ですね。
プログラムの入っているフォルダの下のcsvというフォルダの中に、rakuten_point.csvというファイルが保存されています。
結果の確認
csvファイルを開いて、内容を確認します。
Webサイトで確認するよりも、Excelでデータを確認できると、分析にも利用できそうですね。
ちなみに楽天ポイントはいろいろなキャンペーンをやっている一方で、本当に獲得できているかわからないとか、期限が非常に短くて期限切れでポイントを失ってしまうといったケースがよく聞かれますので、確認はシておいたほうがいいと思います。
スクレイピングは便利に使えば自動でデータを取得して、それを分析に使用することができます。
今回は楽天ポイント明細という、利用者が限られるような内容ですが、いろいろな自動化を私のブログで紹介していければいいなと思います。
ここまでお読みいただきましてありがとうございました。