members

members

スプレッドシート関数 IMPORTXMLでスクレイピングする方法

Tweet

keyvisual

画像元

 

「単調な作業に時間が取られてしたいことに時間を割けていない」という方も多いのではないでしょうか。
本記事ではそんな面倒な作業を自動化する方法の1つとしてスプレッドシートでのスクレイピング方法について、TECHラボ所属の桑原よりご紹介します。

 

[目次]

1.スクレイピングとは

2.スプレッドシート関数 IMPORTXMLでスクレイピング

3.記事一覧からURLとタイトル、meta要素をスクレイピングする方法

4.まとめ

5.ラボ活動について

 

スクレイピングとは

スプレッドシートでスクレイピングする方法をご紹介する前に
「そもそもスクレイピングとはどういう技術なのか」
「スクレイピングのメリット・デメリットは何なのか」
を簡単に説明します。

 

「Web上の情報を取ってきたい」
「1つ1つ手作業でコピペして管理するのが面倒」

そんな時に登場するのが、Web上の情報を収集することができる技術の1つであるスクレイピングです。
ただし、使用にあたってはいくつか注意すべき点があります。

 

スクレイピングは公式にサポートされているわけではない

API(Application Programming Interface)はサービス提供側が一定の条件を設けたうえで開発者向けに提供している機能のことですが、こちらはサービス側が公式に許可している方法です。

 

一方でスクレイピングは公式にサポートされているわけではないため、相手の許可なくスクレイピングを行っていると、Webサイトの利用規約に引っかかる場合もあるので注意が必要です。

ex) Twitter

例えば、Twitterのサービス利用規約には「8.コンテンツおよび本サービスの利用に対する制限」で以下のように記載されています。

Twitterの事前の承諾なしに本サービスのスクレイピングを行うことは明示的に禁じられています

 

HTMLの構造の変更に影響を受ける

今回ご紹介するIMPORTXMLというスプレッドシートの関数もそうですが、スクレイピングの場合はHTML構造に影響を受けます。

そのためclass名が変わったとかHTMLの階層構造が変わったなどの変化によって設定した方法が使えなくなることがあります。

 

 

スプレッドシート関数 IMPORTXMLでスクレイピング

スプレッドシートの関数IMPORTXMLを使って実際にスクレイピングしていく前に、まずはその使い方について解説していきます。

 

関数:IMPORTXMLの使い方

まずは関数IMPORTXMLの使い方について簡単に見ていきましょう。

[基本の使い方]
=IMPORTXML(“URL”, “XPathクエリ”)
ex) IMPORTXML(“https://blog.members.co.jp/”,”//title”)

URLにはスクレイピングしたいサイトのURLを、XPathにはHTMLの特定箇所を指定する文字列を入力します。
なお、URLは文字列指定する場合はダブルクォーテーションを、セル指定をする場合はそのままセル番号のみを入れます。

 

XPathとは

XPathとは、XML文章中の要素や属性値を指定するための言語で、HTMLの要素を指定することができます。

指定の仕方はHTMLをツリー構造として見たときに、上からたどっていく形で指定します。

ex) html/body/h1

about XPath

 

XPathの取得方法

なかなか馴染みのない方もいらっしゃるかもしれませんが、取得方法はとても簡単です。

1 「F12」で検証ツールを開く

getXPath

 

2 取得したい要素を指定する

getXPath2

 

3 右クリックで「Copy」 > 「Copy XPath」をクリック

getXPath3

 

これでXPathを取得することができます。

 

 

記事一覧からURLとタイトル、meta要素をスクレイピングする方法

さて、XPathの取得方法もわかり準備ができたところで実際にスクレイピングしてみましょう!

 

アウトプットイメージ

まずアウトプットイメージですが、こんなものを作ってみようと思います。
左上に記事一覧ページのURLをおいて、そこから記事URLとタイトル、meta要素を取得して一覧化します。

output

 

URLの取得

まず記事一覧ページからURLを取得する方法を見ていきましょう。

以下ページで記事URLはこの要素をスクレイピングすれば取れそうですが、URLの取得だけは前述の方法で取得したXPath「//*[@id=”container”]/article/div[2]/div[2]/div[2]/div/h2/a」を少し修正する必要があります。

titile

 

実際に取得したXPathを関数に入れてみると「数式の解析エラーです。」とエラー表示がでます。
こんなときは以下をチェックしてみましょう。

 

①:引数のXPath内でダブルクォーテーションを使用していないか

今回使用しているIMPORTXMLという関数で要素を指定するためにダブルクォーテーションが既に使用されているため取得したXPathのダブルクォーテーションはシングルクォーテーションに変更する必要があります。

 

②:URLを取得するための属性指定をしているか

今回取得したXPathは末尾が「/a」で終わっています。
つまりa要素を取得するということになりますが、URLはa要素内のhref属性なので属性の指定が必要になります。

ちなみに要素に紐づく属性を取得する場合は「@」を使ってこのように書きます。
ex) /a/@href

 

③:XPathの始めは「/」か「//」か

HTMLをツリー構造でみた場合の一番上(html)から順番にたどっていき要素を指定するのが「/」。
逆に間の記述は端折った書き方が「//」から始めるタイプです。
XPathを取得すると基本的に後者の記法で書かれています。

 

④:要素の位置を指定しているか

例えば「…/div[3]/div[2]/…」のように書かれている場合は、div要素の3つ目の中のdiv要素の2つ目の…と見ていくことになります。
ちなみに今回取得したXPathは、「div[2]」のように要素の位置を指定する記述になっていますね。

 

⑤配列でデータを取得するか

今回は記事一覧ページからタイトルを全て取得したいです。
そこでソースを確認してみると、「div class=”column”」以下は全ての記事において共通なのでこれらを全て取得できるように指定します。

column2

 

そして、スプレッドシートに配列で取得したデータを貼りつける場合、

同じ列の右や下のセルにデータ(文字含む)が入っているとエラーを起こすので注意しましょう。

 

上記を踏まえて何度かエラーを起こしながらも修正して出来上がったのがこちら。
=importxml(URL,”//div[@class=’column’]/div/h2/a/@href”)

 

titleタグを取得

titleは以下の記述で取得することができます。
=IMPORTXML(URL, “//title”)

ちなみに「//title」は前述の通り途中までの記述(/html/head/)を省略した形なので「/html/head/title」でも大丈夫です。

 

keywordを取得

keywordは以下の記述で取得することができます。
=IMPORTXML(URL, “//meta[@name=’keywords’]/@content”)

 

descriptionを取得

descriptionは以下の記述で取得することができます。
=IMPORTXML(URL, “//meta[@name=’description’]/@content”)

 

まとめ

いかがでしたでしょうか。

今回は面倒な作業を自動化する方法の1つとしてスプレッドシートのスクレイピング方法についてご紹介しました。
このほかにも様々な使い方があるので、今後の記事でご紹介できればと思います。

 

ラボ活動について

最後に、冒頭の「TECHラボ」について気になった方もいらっしゃるかと思うので簡単に説明しますと、メンバーズにはラボという「社員同士での自主的な学び/研究活動をする制度」があります。

その1つであるTECHラボでは、実業務の無駄な作業を効率化・自動化するために、普段業務では使う機会のないプログラミングを学んでいます。

 

コラム執筆者

桑原佑司(くわはら ゆうじ)

第3ビジネスユニット アカウントサービス第17ユニット所属
2017年4月入社。主にWeb広告運用・Webコンサルに従事。
2017年のクリスマスに同期とプログラミング初心者しかいないTECHラボを立ち上げる。TECHラボ代表。
趣味はランニングと服を買うこと。ここ1年はJSでの業務効率化にはまってます。