資産運用の可視化
外貨、株式、投資信託等の資産運用をされている皆様、どのように自分の投資先商品やその候補の状態を可視化されていますか?
アカウントアグリゲーション・サービスも便利になりましたが、どちらかというと家計管理向きのものが多く、投資の管理としては痒いところに手が届かない場合もあると思います。
Googleスプレッドシートを使うと、スクレイピングが簡単に実装出来、ちょっとした個人投資ポータルが作れます。(作成イメージは下の画像)
本当はそのまま使えるサンプルコードをお見せしたいところですが、万が一、結果的に特定のサイトへのサーバー負荷増大に関わると、法令順守上の問題となりうるので、本ブログのサンプルコードは、URLは伏せ、架空のHTMLの構造で書かせていただきます。読者の皆様の好みのソースサイトで試す時の叩き台としてご参考になれば幸いです。
また、スクレイピングを利用規約で禁止しているサイトもありますので、ご注意下さい。
スクレイピング関数
Googleスプレッドシートには、XPathで簡単にスクレイピングが出来るIMPORTXMLという関数があり、IMPORTXML(URL, XPathクエリ)という書式です。
金融情報サイトから何らかの時価データを取得する時のイメージは、以下の通りです。
=IMPORTXML("https://xxxxxxxxxx/xxxx/xxxx","//span[@class='price']")
#XPathクエリの記述
IMPORTXMLの1つ目の引数は取得したいデータが含まれるURLです。
問題は2つ目の引数のXPathの記述方法で、これにクセがあり、正しいはずと思ったXPathを書いてもエラーが出ることがあります。
ここではIMPORTXML関数の仕様やXPathの概念の厳密な話は避け、いくつかのWebサイトでの経験上、「とりあえず通ることの多い」書き方をご紹介します。
XPathとは、WebサイトのソースのHTMLやXMLの中から、特定の構成要素を指定するための構文です。前述の例では、1つ目の引数のURL"https://xxxxxxxxxx/xxxx/xxxx"
の中で、取り出したい価格情報等が記載されている箇所を"//span[@class='price']"
という記述で指定しています。
このようなXPathを得るには、次の手順で取得したい箇所のHTMLソースを特定します。
- ChromeブラウザでスクレイピングしたいWebサイトのページ
https://xxxxxxxxxx/xxxx/xxxx
を開きます。 - ページ中のスクレイピングしたい箇所をドラッグします。
- 右クリックメニューで「検証」を選ぶと、窓の右上にHTMLソースが表示され、例えばUSD/JPYの為替レートの情報ページで103.38というデータをドラッグしている時、
<span class="price">103.38</span>
といったようなHTMLの該当部分が水色にハイライトされます。これがドラッグした箇所のHTML記述です。
ちなみに、この水色にハイライトされた部分を右クリックすると、Copy->Copy XPathというメニューがあり、XPathを取得出来ます。しかし、これをこのままIMPORTXMLの引数で使うとエラーとなる場合が多く、上手く行かない感じです。これが先ほど申し上げたこの関数の"クセ"です。
IMPORTXML関数の引数としてのXPathの記述方法として現時点の私なりの現実解が、上記の"//span[@class='price']"
をテンプレートにすることです。
このXPathの意味は、"//"が対象URLのHTMLの全要素から探索することを表し、spanタグのうち、class='price'という属性を持ったものを探すということです。
これにより、上記の<span class="price">103.38</span>
に辿り着くことが出来ます。
上記では探索の対象がspanタグで、class属性がキーとなり、その値が"price"であるものを探索する場合を例に示しましたが、タグの種類、キーとなる属性の種類や値はサイトやページ毎に異なり、spanタグのところは例えばdivタグやtdタグ、class属性のところは例えばid属性となる場合があり、探索するHTMLに合わせて置き換えることで様々なWebサイトに適用出来ます。(<span class="price">103.38</span>
という記述は、特定のサイトからの引用ではなく、金融情報サイトでありそうな仮想のものです。)
書式設定と文字列処理
IMPORTXML関数で取ってきたデータが、例えば文字列"103.38円"といった具合に、数値型ではなく、文字列型でかつ余計な文字列を含んでいる場合もあります。このような場合、下記のように、SUBSTITUTE関数で余計な文字列を除去した後、VALUE関数で数値型に変換し、数値データとして使えるようにします。
=VALUE(SUBSTITUTE(IMPORTXML("https://xxxxxxxxxx/xxxx/xxxx","//span[@class='price']"), "円", "", 1))
おわりに
IMPORTXML関数は、サイトやページによって上手くいくところと、いかないところがあり、上手く行くところでも時々実行失敗が発生するなど、非機能面での使いにくさはありますが、個人レベルでのWebスクレイピングによる情報収集のハードルを下げてくれたことは画期的に感じました。
※当ブログは、特定の銘柄・商品等の勧誘や売買の推奨等を目的としたものではありません。