スクレイピング(スプレッドシート版)

スプレッドシートによるサイトの要素を取得する方法

スプレッドシートの関数を使いスクレイピング(サイトの情報を取得)します。
取得する要素として、タイトル、ディスクリプション等のメタタグ、ページ内の要素の取得を行います。
スクレイピング出来る関数には「IMPORTXML」、「IMPORTHTML」、「IMPORTDATA」、「IMPORTFEED」とありますが、今回は「IMPORTXML」、「IMPORTDATA」を使用し例を挙げて進めます。
ただ、悲しい事に完全無欠なスクレイピングを目指したい場合、スプレッドシートの関数では限界がありますので取得対象のサイト、取得状況、用途を考慮して選定して下さい。

    準備するもの

  • 要素を取得したいページのURL
  • Googleアカウント

スプレッドシートを開く

googleへログインし、スプレッドシートを開きます。
右下の+ボタンより、新しいスプレッドシートを作成します。

取得したいサイト情報

取得したいページのURLをセルに貼り付けてください。

例として気象庁のページから取得を行ってみます。
http://www.jma.go.jp/jma/index.html

次に、「head」タグ内の、「title」、「description」、「keywords」を取得する関数を入力します。
使用する関数は「IMPORTXML」です。
対象のURLのセルが「D4」の場合、下記の様になります。

■title

=IMPORTXML($D$4,"/html/head/title")

■description

=IMPORTXML($D$4,"/html/head/meta[@name='description']/@content")

■keywords

=IMPORTXML($D$4,"/html/head/meta[@name='keywords']/@content")

関数の第二引数が、なんだかヤヤコシイと感じた方はブラウザのデベロッパーツールで「Xpathの取得」が割と簡単に入手をお勧めいたします。※IDの指定部分等ダブルクォーテーション「”」がある場合シングルクォーテーション「’」に修正してください。
(サイトによって細かい調整が必要になる場合があります。)

※第二引数の説明

  • IDで取得したい場合・・・「//*[@id=’logo’]
  • 属性で取得したい場合(例として画像のalt)・・・「//*/img/@alt
  • 順番で取得したい場合・・・「//*/div[1]

【上記までのイメージ】

※注意
上記でも取得できない場合があります。
サーバーサイドで構成されたタグであれば取得が可能ですが、jsの「document.write」でHTMLを生成している場合取得ができない場合がそれに当てはまります。

JSのソースコードの記述を取得する

jsの「document.write」の場合は「IMPORTDATA」を使い取得を試みます。
ほぼ「IMPORTXML」と同様です、第一引数はjsを参照させます。
※第二引数については省略します。表示書式や、取得するjs、csvの文字区切りに関係している様です。

余談ですが、不要な文字が入っている場合、「SUBSTITUTE」の関数を使うと便利でした。

jsの記述について、全てが外部ファイルではありません。

そういう場合は、「@src」、「text()」と出し分けます。
関数の例を下記に記載します。

=IF(ISERROR(
  IMPORTXML($D$4,"//*/script[" & C52 & "][@type='text/javascript']/@src")),
  IMPORTXML($D$4,"//*/script[" & C52 & "][@type='text/javascript']/text()"),
  IMPORTXML($D$4,"//*/script[" & C52 & "][@type='text/javascript']/@src")
)

※すこし込み入った関数になったので内容内訳を明記
・外部ファイルとして読み込み読めるか判別する
・外部ファイルとして読み込めないので、べた書きのJSを出力する
・外部ファイルとして読み込めたのでファイル名を出力する

これでタイトル、ディスクリプション、キーワードのメタタグ、ページ内の要素(ニュースの一覧)を取得ができました。


これにて完了とします。
別途、使う機会があれば「IMPORTHTML」、「IMPORTFEED」の関数も纏めたいと思います。