プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Google スプレッドシートの関数でWebからデータを取得する

 Excel買うのはちょっと高いなぁと思っている時に重宝するのが、Google スプレッドシートです。ブラウザがあればどこでも使えて嬉しく、あのデータあのパソコンに入ってるのにとか、そういったことから開放されます。さらに他の人との共有も簡単なので、使い所沢山あります。
 そんなGoogle スプレッドシートですが、Googleならではというような機能もあります。その1つがImport系のセル関数です。幾つかあるのですが、Webからデータを収拾できるものが幾つかあります。地味だけど便利なので、簡単に紹介してみます。

Import関数



関数名 概要
IMPORTXML XML, HTML, CSV, TSV,RSS/Atom XMLフィードなど、構造化データからデータをインポート
IMPORTHTML HTML ページ内の表やリストからデータをインポート
IMPORTFEED RSS, Atom フィードをインポート
IMPORTDATA 指定したURLのデータを、.csv形式または .tsv形式でインポート

 表をみてもらうと解るように、取得できるデータ種別が重複する部分があります。一方で、使い方としては少しづつ異なっているので、順番に見ていきましょう。

ImportXML



 個人的には、これを使う機会が一番多いです。関数名としてはXMLですが、構造化データを扱う関数となっています。構造化データというのは、それぞれの項目に意味を与えられたデータとなります。XMLやRSS,Atomであれば、それぞれの要素名・データというペアで出てきますよね。またCSV,TSVにしても、列ごとに項目名が与えられ行はその塊という形になっています。またHTMLも名前の一部がmarkup languageとなっているように、構造化データです。HTMLを取れるということで重宝します。

ImportXMLの使い方

ImportXMLの使い方は簡単です。取得先のURLと取得する部分(XPath_query)を指定するだけです。

構文

IMPORTXML(URL, XPath_query)

使用例

IMPORTXML("https://en.wikipedia.org/wiki/Moon_landing", "//a/@href")

 上記サンプルは、WikiPediaからリンク先一覧を取得しています。

f:id:dkfj:20161002115320p:plain

 現実的にこの関数を使う時は、HTMLを取得対象とすることが多いと思います。何故ならWeb上のデータの殆どがHTML形式で提供されているからです。そこでポイントになるのが、XPathの書き方です。方法については色々ありますが、Chromeの機能を利用するのが一番ラクです。取得したい場所を選んだ上で、検証→Copy→Copy XPathで取得できます。こんな形で出てくるので、

//*[@id="cm_cr-review_list"]

ダブルコーテーションをシングルコーテーションに置き換えて利用します。

ImportHTML



 ImportHTMLは、HTMLページ内の表やリストからデータをインポートします。単純にHTMLを取得するのではなく、その中のテーブルかリストを取得するという、素直じゃないやつです。

ImportHTMLの使い方

取得先のURLと抽出するタグのタイプ(table or list)、出現順を指定します。一つ目のテーブル/リストを取得したい場合は、最後のindexは省略可能です。

構文

IMPORTHTML(URL, query, index)

使用例

IMPORTHTML("http://en.wikipedia.org/wiki/Demographics_of_India","table",4)

 取得例は、次のような形です。
f:id:dkfj:20161002120636p:plain

 関数名からは予想できないようなものが取得できるので最初は面食らいますが、意味が解ると便利です。

ImportFEED



 ImportFEEDは、RSSフィードやAtomフィードをインポートします。ImportXMLでも実現できるのですが、RSSやAtomフィードに特化している分、余計な事を考えなくても欲しいデータが取れるようになっています。

ImportFEEDの使い方

取得先のURLとオプションを指定してます。オプションの一つ目のクエリは、取得するデータの指定です。デフォルトがfeedになっていて、通常の場合変更する必要はありません。見出しは、一番上の行に見出し行をつけるかどうかで、デフォルトでは付けないようになっています。最後のアイテム数は、取得するアイテム数です。無指定の場合は、全て取得します。

構文

IMPORTFEED(URL, [クエリ], [見出し], [アイテム数])

使用例

IMPORTFEED("http://news.google.com/?output=atom")

f:id:dkfj:20161002121020p:plain

ImportDATA



 最後にImportDATAです。これは、CSVやTSVを取得します。何気にスプレッドシートで、他のCSVを扱うのは難しかったので、この機能は中々便利です。一方でCSVでデータ提供している所は、あまり無かったりします。

ImportDATAの使い方

取得先のURLを指定するだけという潔さです。

構文

IMPORTDATA(URL)

使用例

IMPORTDATA("http://www.census.gov/2010census/csv/pop_change.csv")

f:id:dkfj:20161002121842p:plain

まとめ



 プログラマという人種は、わりとすぐにプログラムを書いて解決しようとしてしまいます。一方で、既に提供されている機能で実現できるのであれば、それを使うに越したことはないです。ケースバイケースで考えてみましょう。
 ちなみに上記の関数からアクセスした場合のユーザーエージェントは、次のようになっています。サイト側でブロックされている場合があるので、ご注意を

Mozilla/5.0 (compatible; GoogleDocs; apps-spreadsheets; +http://docs.google.com)

See Also:
環境構築レスでAmazonの商品レビューを取得する


データを集める技術

データを集める技術

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例