仮想通貨のレートをCoinGeckoから取得するscript


各取引所で所持している仮想通貨の日本円やドル換算での合計値(参考値)を日時でトラッキングしてみたいと思ったのですが、取引所のAPIがまだ充実していないこともあり、レートは一律CoinGeckoから取得することにしました.
言語はpython. 試行錯誤含めてメモします.

1. 普通にscrapingで取得してみる(-->うまくいかないので却下)

1-1. httpのget requestを飛ばす

httpのrequestを飛ばすのには、urllibは使いづらいのでrequestsを使用します.

pipでインストールして

> pip install requests

こんな感じで使えます. 便利.(上記リンク先から抜粋)

python
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

今回の場合はこうなります.(例:XP->BTCのレートのページのhtmlを取得)

python
import requests
import bs4
url_str = 'https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/xp/btc'
html = requests.get(url_str).content
1-2. scrapingする

おなじみのBeautifulSoupです.

使い方はネット上にいくらでも書いてあるので調べてください.

1-3. 試しにXP->BTCのレートを取得
python
import requests
import bs4
url_str = 'https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/xp/btc'
html = requests.get(url_str).content
soup_obj = bs4.BeautifulSoup(html, "html.parser").find("div", class_="coin-value").span
print(soup_obj.text.strip())

実行結果はこちら

0.0033$

BTCの値が欲しかったのですが、ドル換算の値が取得されてしまいました.
実はcoingeckoのページを読み込むと最初に$換算のレートが表示された後に、javascriptでBTC等のレートに更新しているようなのです.なので、codeからgetを飛ばして取得したhtmlにはドル換算のレートが含まれてしまいます.
ただ、うまくいく(BTCレートが取得できる)こともあり、タイミングの問題なのかもしれません.
どちらにしろ取得された値が信用できないため、 このやり方は却下しました.

2. Seleniumで取得

ページ読み込み完了(javascriptの実行まで完了)を待つのであればSeleniumを使えばいいのではないかと思い試してみました.
SeleniumはWebページのテスト自動化のためのツールで、画面の表示だけでなくオブジェクトのクリックなどの一般的な操作を実行することも可能です. 今回はページ表示だけのために使用します.
ページ表示のためにChromeを使用するので、Chrome自体とSeleniumのChromeドライバのインストールをしておく必要があります.

2-1. ページを表示してhtmlを取得する

今回の場合はこうなります.(例:XP->BTCのレートのページのhtmlを取得)

python
from selenium import webdriver
browser = webdriver.Chrome()
url_str = 'https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/xp/btc'
browser.get(url_str)
html = browser.page_source
browser.close()
1-2. scrapingする

1-2.と同じです.

2-3. 試しにXP->BTCのレートを取得
python
from selenium import webdriver
import bs4
browser = webdriver.Chrome()
url_str = 'https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/xp/btc'
browser.get(url_str)
html = browser.page_source
browser.close()
soup_obj = bs4.BeautifulSoup(html, "html.parser").find("div", class_="coin-value").span
print(soup_obj.text.strip())

実行結果はこちら

฿0.00000020

うまくいきました.

2. PhantomJSで取得

Seleniumだと毎回ブラウザのウィンドウが立ち上がってしまうので少し目障りです. Seleniumの中のPhantomJSを使用すればブラウザのウィンドウが立ち上がることはないようなので、その方法も試してみました.

2-1. ページを表示してhtmlを取得する

今回の場合はこうなります.(例:XP->BTCのレートのページのhtmlを取得)

python
from selenium import webdriver
driver = webdriver.PhantomJS()
url_str = 'https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/xp/btc'
driver.get(url_str)
html = driver.page_source
driver.quit()
1-2. scrapingする

1-2.と同じです.

2-3. 試しにXP->BTCのレートを取得
python
from selenium import webdriver
import bs4
driver = webdriver.PhantomJS()
url_str = 'https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/xp/btc'
driver.get(url_str)
html = driver.page_source
driver.quit()
soup_obj = bs4.BeautifulSoup(html, "html.parser").find("div", class_="coin-value").span
print(soup_obj.text.strip())

実行結果はこちら

฿0.00000020

うまくいきました.
Seleniumとほぼ同じですが、ブラウザが立ち上がるのは目障りなので、3.のPhantomJSを使用した方法でしばらく運用してみます.

4. (おまけ)運用に使用しているscript

上記試行の結果を整理して運用に使用しているscriptをgithubにあげてあります.( https://github.com/hirokishibayama/CoinGeckoScrape
もし良かったら使ってください. 下記のように使用できます.

> python cgapi.py [[仮想通貨]] [[換算先通貨]] [[取得方法(上記1〜3)]]

使用例

> python cgapi.py xp btc phantomjs
> python cgapi.py xp jpy selenium
> python cgapi.py verge btc requests