【仮想通貨】bitFlyer LightningをAPIを使わずにスクレイピングする【Python】
今回は「Selenium」と「PhantomJS」を使ってリアルタイムでbitFlyer Lightningの価格を取得していきたいと思います。
bitFlyerはAPIを提供していますが、1分間にリクエストできる回数が200回と決まっています。そこでseleniumを使ってこのウェブページから直接価格を抜くことで無制限に使うことができます。
PhantomJSはウェブブラウザーと同様の振る舞いができるのでサーバーに過度な負担を与えること無く、無限に価格を取り出せます。コード見てさっさと使いたいって人は目次から一気にコードに飛んで下さい。
使った環境
・MacBook Air Early 2015 Sierra 10.12.6
・Python3.6.2 pip3
・iTerm2(コマンドプロント)
・Chrome
準備するもの
・PhantomJS(http://phantomjs.org/)
・Selenium(pip3 install selenium)
・BeautifulSoup(pip3 install beautifulsoup4)
・re(標準モジュール)
・bitFlyerのアカウント
PhantomJSはpathを通して使える状態にしておいてください。
スクレイピングの概要
ログイン
まずはbitFlyer Lightningのログイン画面に行きます。
右クリックで「検証」を押します。入力フォームである「input要素」をHTMLから探します。(HTML用語はは分からないので。。。。雰囲気でやってます。。)
ありましたね。「LoginId」というのがメールアドレス(ID)の入力フォームのようです。
パスワードの入力フォームは「Password」でした。
次にログインボタンを押します。「Login_btn」というのがボタンのようですね。これでログインすることができるようになったので、コードにまとめます。
from selenium import webdriver from time import sleep from bs4 import BeautifulSoup as bs import re ma = "メールアドレス" pw = "パスワード" #関数Loginにログインするための一連の動作をまとめました def Login(): #「bitFlyer Lightning」に移動 driver = webdriver.PhantomJS() driver.get("https://lightning.bitflyer.jp") #メールアドレスを入力 login_id = driver.find_element_by_id("LoginId") login_id.send_keys(ma) #パスワードを入力 login_pw = driver.find_element_by_id("Password") login_pw.send_keys(pw) #ログインボタンをクリック driver.find_element_by_id('login_btn').click()
文字列出力
これでログインすることができるようになったので、ブラウザでもログインしてみます。次に抜き出したい情報を選びます。今回は買値のみを抜いてみます。さっきと同様に右クリックして「検証」をします。
「command + f」でaskなどで検索したら「Best_Ask」という要素を発見しました。
<option value="ASK">Best Ask (現在 1,271,391)</option>
この中にある文字列部を抽出するために正規表現を使います。
#ページのソースをutf-8でエンコード。。。? #BeautifulSoupでhtmlにパースする html = driver.page_source.encode("utf-8") soup = str(bs(html,"html.parser")) #正規表現のパターン #htmlの中からパターンを抽出 #findallでリストが返ってくるのでインデックスに0を指定して出力 p = '<option value="ASK">(.+)</option>' m = re.findall(p,soup) print(m[0])
さっきのコードとくっつけて実行してみます。
Best Ask (現在 1,267,000)
できましたね。
コード
全体像
from selenium import webdriver from time import sleep from bs4 import BeautifulSoup as bs import re ma = 'メールアドレス' pw = 'パスワード' def Login(): driver = webdriver.PhantomJS() driver.get('https://lightning.bitflyer.jp/?lang=ja') login_id = driver.find_element_by_id("LoginId") login_id.send_keys(ma) login_pw = driver.find_element_by_id("Password") login_pw.send_keys(pw) driver.find_element_by_id("login_btn").click() while True: html = driver.page_source.encode("utf-8") soup = str(bs(html,"html.parser")) p = '<option value="ASK">(.+)</option>' m = re.findall(p,soup) print(m[0]) if __name__ == '__main__': Login()
htmlをパースして正規表現で抜き出す処理を無限ループさせています。メールアドレスとパスワードをそれぞれ変数maとpwに入れて実行します。