スプレッドシートでサイトデータを取得するスクレイピング

表計算ソフトをデータ処理として扱わない使い方に違和感を感じることもありますが使い方は自由です。

スプレッドシートは環境により制限のある企業もありそうですが、ダウンロードすればエクセルファイルになるので都合がいいです。

今回は いつもの作業をZapierを使って半自動化
後半部分で書いた 「Push by Zapierを利用したブックマーク」を基に追加情報を取得するためのスクレイピングをします。


Google スプレッドシートはExcelと同じ表計算ソフトです。
スクレイピングはいわゆるサイト・クローラーと同じです。
スクレイピングの話になるとPythonでのBeautifulSoupについてがあふれていますが、もっと手軽にできるといいですよね。

そもそも、そんなに取得するデータってある?

試してみたいデータや更新頻度が高いサイトは禁止されていることもあるので注意しましょう。
Yahoo!ファイナンスヘルプ - Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止しています
https://www.yahoo-help.jp/app/answers/detail/p/546/a_id/93575/faq/pc-detail

というわけで、静かにスプレッドシートでスクレイピングします。

いつもの作業をZapierを使って半自動化Push by Zapierを利用したブックマーク」を基に説明用に自動車関連企業のサイトインデックスURLをデータ化しました。
  • A列 ナンバー
  • B列 ページタイトル
  • C列 ページURL
  • D列 タイムスタンプ
図1:今回のために作成したデータです。


こんな感じでスプレッドシートに保存されるブックマーク的データです。
それでは追加していきましょう。

=IMPORTXML(URL, XPathクエリ)

決まったサイトであればサイトコンテンツ部分の取得も可能でしょうが、今回は特定のサイトではなくブックマークなので主に<head>内の記述を取得します。

1. 試しにサイトのページタイトルを取得してみよう

E列2行目に
=IMPORTXML(C2,"/html/head/title")

C2のURL, FullXPathを入れています。"//title"でもOKです。
XPathの理解ができれば取得できます。
タイトル(図1:B列)はブックマーク時に取得していますので、サイトの説明文である"description"を取得しよう。

2. XPathはどうなる?

図1でのNo1のサイトではdescriptionは 図2のように取得できます。
図2 Chrome 検証 > Elements

"/html/head/meta[4]" となります。
metaの[4]番目ということになりますが、別のサイトでは[1]番目や[5]番目かもしれないのでこれでは困ります。
IMPORTXML - Docs Editors Help
https://support.google.com/docs/answer/3093342

XPath Syntax
https://www.w3schools.com/xml/xpath_syntax.asp
XPath wildcards can be used to select unknown XML nodes.@* Matches any attribute node
@を使って属性 matchさせます。
Attribute (属性) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
https://developer.mozilla.org/ja/docs/Glossary/Attribute
"//meta[@name='description']/@content"

E列2行目に
=IMPORTXML(C2,"//meta[@name='description']/@content")

図2では表のヘッダ部にXPthを入れていますのでセルを固定指定に =IMPORTXML(C2,$E$1)

図3赤字部分が設定したXPath

すぐには反映されず一旦閉じて忘れたころに取得できてます。

その他 meta属性

  • metaキーワードを取得する //meta[@name='keywords']/@content
  • og:imageを取得する //meta[@property='og:image']/@content
     =IMAGE()を使って画像も表示できる 
  •  個人的にはどんなviewport設定しているのか気になるので
    • //meta[@name='viewport']/@content 
head には何が入る? HTML のメタデータ - ウェブ開発を学ぶ | MDN
https://developer.mozilla.org/ja/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML

The Open Graph protocol
https://ogp.me/

式はコピーしていけばいいのですがZapierを使ってスプレッドシートに反映する場合はもう少し関数を使う必要があります。
Push by Zapierを利用したブックマーク」(参照:いつもの作業をZapierを使って半自動化)ZapierのCustomize Spreadsheet Rowで式をセットします。

=INDIRECT()

Zapierでは1行ずつのデータを反映させていきます。
Zapierでも値に式を入れておけばスプレッドシートにも反映されます。

=======
例:Zapierでのスプレッドシート入力:UNIXタイムスタンプ変換

Choose Action Event 

- Create Spreadsheet Row

Customize Spreadsheet Row

Pocketから取得したデータの場合には、「Time Added,」というUNIXタイムスタンプの値があります。仮に [C列 : Time Added] として空白セルにヘッダをつけておきます。仮に [ D列:Date]とします。

その場合にZapierの「Customize Spreadsheet Row」の値設定で以下の式を入れておきます。
=(INDIRECT("C"&ROW()) + 32400) / 86400 + 25569


C列のROW()行目という式で指定したセルを参照し計算した結果がD列に反映されます。
=======

 =INDIRECT(C&ROW())
=IMPORTXML(INDIRECT(C&ROW()),$E$1)

あとはエラー対策としてIFERRORでハイフンを

=IFERROR(IMPORTXML(INDIRECT(C&ROW()),$E$1),"-")


その他処理

  • 週次で新しいシートに値コピペしてデータ取得負荷がかからないようにしてます。
  • ちなみにZapierには「Formatter by Zapier」といものがありフォーマット変換を可能にします。 

関連記事