Search 4 Truth

Search 4 Truth

Pythonと仮想通貨

【仮想通貨】bitFlyer LightningをAPIを使わずにスクレイピングする【Python】

今回は「Selenium」と「PhantomJS」を使ってリアルタイムでbitFlyer Lightningの価格を取得していきたいと思います。

bitFlyerはAPIを提供していますが、1分間にリクエストできる回数が200回と決まっています。そこでseleniumを使ってこのウェブページから直接価格を抜くことで無制限に使うことができます。

f:id:lisbeths:20180130191043p:plain

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のログイン画面に行きます。

f:id:lisbeths:20180130193015p:plain

右クリックで「検証」を押します。入力フォームである「input要素」をHTMLから探します。(HTML用語はは分からないので。。。。雰囲気でやってます。。)

f:id:lisbeths:20180130203042p:plain

ありましたね。「LoginId」というのがメールアドレス(ID)の入力フォームのようです。

f:id:lisbeths:20180130203146p:plain

パスワードの入力フォームは「Password」でした。

f:id:lisbeths:20180130203854p:plain

次にログインボタンを押します。「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()
文字列出力

これでログインすることができるようになったので、ブラウザでもログインしてみます。次に抜き出したい情報を選びます。今回は買値のみを抜いてみます。さっきと同様に右クリックして「検証」をします。

f:id:lisbeths:20180130212019p:plain

「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に入れて実行します。

f:id:lisbeths:20180130222320g:plain