after work Labo

「好きなこと・興味がわいたこと」を時々「お勉強させて頂いてます!」

簡単!GoogleスプレッドシートのWeb関数

はじめに

 

Webで公開されている情報を自動収集し活用できると便利ですが、Python(パイソン)、Ruby(ルビー)を使うのが一般的で、これらの言語を使ったWebスクレイピングの方法がたくさん公開されてます。

 

“あトん”も機械学習で遊んでみようと思い、初心者向きのPythonを勉強してみようと考えましたが、Javaもよく理解してない状態で別の言語をかじるのは良くないのではと思い、Pythonのお勉強は後回しにしてます。

 

と計画的にプログラミングを学習しているかのように建前を述べましたが、実はJavaのお勉強は随分さぼってます。(汗)

 

一方Webスクレイピングのツールを調べてみると、上記以外にもたくさんあり、ExcelでもVBAを使えばWebスクレイピングが出来るようです。

 

しかし今更IEを使うのは絶対避けたいし、Edgeは今後どうなるのか不透明なのでVBAの利用は候補から外しました。

 

「スクレイピングのプログラミングは面倒くさい」という自分と「プログラミングしなくてもWebスクレイピングをやりたい」という自分に板挟みになって、毎晩苦しんでいました。(…嘘です)

 

ところが、きれいなお姉さんの画像整理をきっかけに、解決策の1つを見つけることができたので、その方法を紹介したいと思います。

 

それは無料表計算ソフトの「Googleスプレットシート」の利用です。

www.google.com

 

「Googleスプレットシート」を使えば、何とプログラミングが一切不要で超簡単にWebデータを収集できるのです。

 

この記事では、前半にスクレイビングとは何かを解説し、後半で2019年「 はてなブログ デザインテーマコンテスト」の応募作品をスクレイピングで集計分析した結果を紹介します。

blog.hatenablog.com

 

Webスクレイピングとは

 

Webサイトから情報を自動収集して加工する作業を、Webスクレイピング(Web scraping)と呼ばれてます。

 

 

一方、クローラー(crawler)がWebサイトの情報を収集してインデックスを作成する作業は、クローリング(crawling)と呼ばれてます。

 

スクレイピングもクローリングもWebサイトのHTMLから情報を収集するので似てますが、クローリングはページ全体の情報を収集するのに対して、スクレイピングは指定したデータのみを抽出する点で違いがあります。

 

どんな情報をスクレイピングすると便利なのか

例えば、指定した「銘柄の株価」「物件の不動産」「地域の天気」「区間の交通量」「お店の人気メニュー」「スポーツの試合結果」とかがあります。

 

ブロガーの方がよくやっているのは、指定したユーザの「ID」の「最新更新記事の内容」等があげられます。

 

これらの情報が一覧で見れたり、時系列で表示できると、知りたい情報をリアルタイムで分析でき、いろんな場面で活用することが期待できそうです。

 

スクレイピング時の注意事項

 スクレイピングはWebサイトから情報を取得する行為ですが、著作権侵害にならないのかが心配ですね。

 

著作権上の問題

結論から言うと、法律の範囲内の利用であれば「合法」となってます。

 

2019年1月1日より前は「著作権法 第四十七条の七」で、スクレイピングは非営利目的に限定せず認められてました。

(情報解析のための複製等)
第四十七条の七 著作物は、電子計算機による情報解析(多数の著作物その他の大量の情報から、当該情報を構成する言語、音、影像その他の要素に係る情報を抽出し、比較、分類その他の統計的な解析を行うことをいう。以下この条において同じ。)を行うことを目的とする場合には、必要と認められる限度において、記録媒体への記録又は翻案(これにより創作した二次的著作物の記録を含む。)を行うことができる。ただし、情報解析を行う者の用に供するために作成されたデータベースの著作物については、この限りでない。

 

2019年1月1日、著作権法の一部を改正する法律(平成30年法律第30号)が施行となり、第四十七条の七は削除され第三十条の四の二に変わり、利用範囲が更に拡大されました。

(著作物に表現された思想又は感情の享受を目的としない利用)
第三十条の四 著作物は、次に掲げる場合その他の当該著作物に表現された思想又は感情を自ら享受し又は他人に享受させることを目的としない場合には、その必要と認められる限度において、いずれの方法によるかを問わず、利用することができる。ただし、当該著作物の種類及び用途並びに当該利用の態様に照らし著作権者の利益を不当に害することとなる場合は、この限りでない。
一 著作物の録音、録画その他の利用に係る技術の開発又は実用化のための試験の用に供する場合
二 情報解析(多数の著作物その他の大量の情報から、当該情報を構成する言語、音、影像その他の要素に係る情報を抽出し、比較、分類その他の解析を行うことをいう。第四十七条の五第一項第二号において同じ。)の用に供する場合
三 前二号に掲げる場合のほか、著作物の表現についての人の知覚による認識を伴うことなく当該著作物を電子計算機による情報処理の過程における利用その他の利用(プログラムの著作物にあつては、当該著作物の電子計算機における実行を除く。)に供する場合

 

どこがどう変わったかの新旧対照表が文化庁のサイトで公開されてますのでリンクを貼っておきます。

著作権法施行令の一部を改正する政令 新旧対照表

 

なお、対照表を見て一つ驚いたのが、条文が縦書きで新旧が上下の表になってました。

 

こんな難読な資料を会社で作ったら「お前はアホか」とボコボコに言われますが、文化庁では違うようです。

 

早稲田大学法学学術院 上野達弘教授がまとめた資料が分かりやすいのでリンクを貼っておきます。

平成 30 年著作権法改正について

 

なお、上野達弘教授は著作権法改正で、日本は機械学習パラダイスになると説明されてます。そして、著作権法改正で日本はAI開発が加速するという記事も出てますので、興味のある方はご一読をおすすめします。

 

rclip.jp

 

www.itmedia.co.jp

 

さて、スクレイピングは著作権上は合法であると分かりましたが、利用規約を違反すると民事上・刑事上問題になる場合があるので注意が必要です。

 

民事上問題となるケース

それは、Webサイトのサービス利用時に会員登録や利用規約をクリックし自発的に同意した場合です。

 

利用規約にスクレイピング禁止が明示されていた場合、サービス利用者がこのWebサイトをスクレイピングすると、規約違反でWebサイト管理者より訴えられる恐れがあります。

 

例えば、「Twitter サービス利用規約 4. 本サービスの利用」には以下が規定されてます。https://twitter.com/ja/tos

(iii)Twitterから提供される(かつ該当する利用条件に従う場合にのみ提供される)、当社の現在利用可能な公開インターフェース以外の方法(自動プログラムか否かを問わない)で、本サービスへのアクセスもしくはその探索またはアクセスもしくは探索の試み(ただし、Twitterとの個別契約で特に許可されている場合は除く)(注:本サービスへのクローリングは、robots.txtファイルの定めによる場合は認められていますが、Twitterによる事前の同意がないまま本サービスのスクレイピングをすることは明示的に禁止されています

 

もし、Twitter利用者が許可された方法以外でスクレイピングした場合は、規約違反となります。

 

刑事上問題となるケース

短時間にWebサイトへ多重アクセスし高負荷を発生させ、サーバーの運営を妨害するような解析を行った場合、偽計業務妨害罪で訴えられる恐れがあります。

 

2010年3月に発生した「Librahack事件」は、偽計業務妨害容疑で逮捕された有名な事例ですね。

ja.wikipedia.org

 

これは図書館の検索システムに不満を持った男性が自作クローラでスクレイピングした際、過度にリクエストを送ったため、検索システムに障害を発生させたものです。

 

この男性は起訴猶予処分となりましたが、やり方を間違えると警察の考え方一つで逮捕されてしまう恐れがあるということを認識させられた問題です。

 

その他のルール

サーバー運営者(サイト運営者)が下記のようにクロールを制限している場合は、その意向に従いましょう。

  • robots.txtのDisallowに記述されたパス配下はクロールしない。
  • rel="nofollow" が設定されたページ配下はクロールしない。

 

robots.txtには以下が記述されてます。

User-agent: クローラーの種類
Disallow : クロール禁止のパス
Allow : クロール許可のパス
Crawl-delay : クロールする間隔(秒)
Sitemap : サイトマップXMLのURL

 

例えば、Yahoo画像検索(https://search.yahoo.co.jp/image/)のrobots.txtには以下が記述されてます。

User-agent: *
Disallow: /

 

これは全てのクローラーについてYahoo画像検索の全てのパスのクローリングすることを禁止(拒否)しています。

 

もし、これを無視してクローリングすると動産不法侵入と見なされる可能性があります。

 

そして、これを継続的に行った場合、DoS攻撃(サーバーに過大な負荷を与え、サービス業務を妨害する)と見なされる恐れがあります。

 

もしスクレイピング行為で何等かの損害が発生した場合は、運営者から訴えられるという最悪の結末を受けるかも知れません。

 

robot.txtと"nofollow"について、もっと詳しく知りたい方は、下記サイトをご覧下さい。

developers.google.com

support.google.com

 

注意事項のまとめ

スクレイピングは「みんなやっているから大丈夫じゃないの」と思い込んでやるのではなく、著作権・民事・刑事において問題とならないよう遵守し、自己責任で行って下さい。

 

はてなブログのスクレイピング方法

 

これからGoogleスプレットシートでのスクレイピング事例を紹介しますが、Googleスプレットシートでスクレイピングができるのを知ったのは、今年になってからです。

 

スクレイピングはPythonだと思い込んでいたので、Googleスプレットシートに超便利な関数があるとは、思いも知りませんでした。(汗)

 

きっかけは、きれないお姉さんの画像整理です。

 

きれいなお姉さんは、はてなフォトライフに保存してますが400枚を超えたため、エクセルで画像とアドレスを整理してました。

 

分かりやすいようにセルにサムネイル画像を貼り付けていたのですが、ソートするとグジャグジャになってしまい大変困ってました。

 

何か良いものがないか調べたら、GoogleスプレットシートにIMAGE関数があり、参照したい画像のURLを入れるとセルに画像が表示できるのです。

 

IMAGE関数

 使用方法は簡単で、セルに下記関数を入力するだけです。

IMAGE(URL, [モード], [高さ], [幅])

 

IMAGE関数の詳細はIMAGE - Docs Editors Help をご覧ください。

 

Googleスプレットシートは超便利!と感激して、Googleスプレットシートの記事をググっていたら、スプレイピングに関する記事を発見しました。

qiita.com

 

この記事によりIMPORTHTML関数という神関数の存在を知りました。

 

Googleスプレッドシートは無料なので大したことは出来ないだろうと思い込んでいた自分がバカでした。もっと早く使っていればと、凄く反省しました。

 

IMPORTHTML関数

IMPORTHTML関数の書式は下記のようになってます。

=IMPORTHTML(URL, クエリ, 指数)

 

<ul></ul>のリストで表現されているデータを取得する場合は、クエリは"list"を指定します。

=IMPORTHTML(URL, "list")

 

<table></table>の表で表現されているデータを取得する場合は、クエリは"table"を指定します。

=IMPORTHTML(URL, "table")

 

listやtableの特定の順番のデータを表示したい場合は、指数にその番号の数字を指定します。

=IMPORTHTML(URL, "list",番号)
=IMPORTHTML(URL, "table",番号)

 

上記リストやテーブルは複数のデータを一括して取得する場合は便利ですが、複数のURLのデータを横並びで表で表示する場合はXPathを使用します。

=IMPORTHTML(URL, "XPath")

 

IMPORTHTML関数の詳細はIMPORTHTML - Docs Editors Help をご覧下さい。

 

それでは2019年「 はてなブログ デザインテーマコンテスト」の応募作品をスクレイピンしてみます。

 

XPathの取得方法

スクレイピングしたい応募作品のページを表示し、Chromeの検証モードに入ります。

 

検証モードは、右クリック→検証を選択するか、F12 又は Ctrl+Shift+Cのショートカットキーで起動します。

(注)上記テーマは未完成なので現在非公開です。

 

次に、①左上の矢印アイコンをクリック → ②スクレイピングしたい要素を左クリック → ③反転した列を右クリック → ④Copyを選択 → ⑤Copy XPathを選択

上記作業で下記XPathを取得できます。

//*[@id="sidebar"]/div[3]/ul/li[3]/span

 

次に、Windowsはダブルクオーテーション「”」のidを認識できないので、シングルクオーテーション「’」に書き換え、XPathを修正します。

 //*[@id='sidebar']/div[3]/ul/li[3]/span

 

デザインテーマのインストール数をセルに表示する場合は、下記のように入力します。

=ImportXML(URL,"//*[@id='sidebar']/div[3]/ul/li[3]/span")

 

 

今回作った表では、テーマストアのURLを入力すると「インストール数」以外に「プロフィール画像」「作者」「スクリーンショット」「テーマ名」「投稿日」も自動取得できるようにしました。

 

なお「スクリーンショット」等の画像をIMAGE関数で表示する場合は、一工夫必要なので少し補足します。

 

img要素を取得した場合、そのXPathを入れても画像は表示できないので、imgの後に「/@src」を追加して下さい。

=image(ImportXML(URL,"//*[@id='main']/div[1]/div/img/@src"))

 

Googleスプレッドシートでのスクレイピング制限

スプレットシートのWeb関数はGAS(Google Apps Script)の制限を超えて実行することはできません。

 

Googleのサーバでの実行は、2018年8月現在、下のような厳しい制限がかかってます。

スクリプト実行時間 :6分/回
カスタム関数実行時間:30秒/回
同時実行:30

従って、ワークシート内にWeb関数が30以上あり、各セルのデータ取得が遅い場合は最大30秒待ち、もしタイムアウトになったら、まだ未実行の関数を実施することになります。

 

従って、実行待ちのセルは「Loding...」が表示されマウスオーバさせると下記が表示されます。

リクエスト数が多いためデータの読み込みに時間がかかる可能性があります。スプレッドシート内で作成した IMPORTHTML、IMPORTDATA、IMPORTFEED、IMPORTXML 関数の量を減らしてみてください。

 

GASの制限事項の詳細は下記サイトを見て下さい。

developers.google.com

 

「 はてなブログ デザインテーマコンテスト」の分析

 

スクレイピングするのは分析するのが目的なので、取得したデータを使ってグラフで表示してみます。

 

投稿作品の推移

「 はてなブログ デザインテーマコンテスト」は応募期間が2019年1月16日(水)~ 2019年3月14日(木)となっており計25の作品が応募・投稿されてます。

 

1月21日にYochix2さんの初投稿がありましたが、2週間以上作品の投稿はなく、c-miyaさんが2月8日の投稿以降、毎週コンスタントに投稿が発生してます。

 

コンテストの評価基準の一つの指標にインストール数があるので、どの作者のどのテーマ名が一番インストールが多いのかをグラフに表示してました。

 

インストール数の推移

 縦軸は上から時系列に投稿されたテーマ名となってます。

 

集計結果はshiromatakumiさんの「Silence」がブッチギリでダントツ一番となってます。2番目はc-miyaさんの「FlatBox」となってます。

 

金賞、銀賞はこの2名の方で、ほぼ確定ではないかと予想できます。3位以降は団子状態となっており、今後のインストール数の伸びで順番が入れ替わるのではないでしょうか。

 

なお、早く投稿した方がインストールされる数は多くなる確率が高いのですが、公開後1日当りにインストールされた数で比較すると、少し様相が変わってきます。

 (注)グラフにLoding...やデータなしと表示されている場合はデータを再取得中の為です。

 

tableturningさんの「美しさにこだわった「cosmo」、Kuichiさんの「MonoTsuduri」、ktrw3200さんの「絢爛(KENRAN)」、Askthewindさんの「Tango」は「FlatBox」の平均インストールを超える伸びを示しています。

 

結果発表の4月4日まで、まだ時間があるので、完成度が高いテーマは更にインストール数が伸びることが予想され、誰が銀賞を取るの予断を許さない状況ですね。

 

2019年4月4日追記

 

コンテストの受賞作品が発表されたので、リンクを貼っておきます。

blog.hatenablog.com

 

金賞

c-miyaさんの「FlatBox

銀賞

shiromatakumiさんの「Silence

Kuichiさんの「MonoTsuduri

銅賞

tak-kunさんの「Debriefing(デブリーフィング)

Askthewindさんの「Tango

rokuzeudonさんの「SquarePlates

blogcustomizeさんの「classic diary(日記向け)

Yochix2さんの「Ja


でした。

 

受賞された方、おめでとうございます!

 

追記はここまで

 

最後に、デザインテーマのページスピードをGoogleのPageSpeed Insightsで測定したので、参考に公開します。

 

ページスピードテスト

 各テーマのデモページだと使用している画像やデモ記事の容量が違うのでばらついてしまうので、ページスピード計測専用のブログを作り、このブログにデザインテーマをインストールし測定しました。

hateb.hateblo.jp

 

なお、このブログは“あトん”の好みで作ったテストサイトなので、記事の文章については深く突っ込まないでください。

 

それでは、きれいなお姉さんの画像をちりばめたテストサイトに投稿されたテーマをインストールし、PageSpeed Insightsで計測してみました。

 

測定は2回実施し、スコアが良い方を記録しました。

 

いくつかのテーマを除き、パソコンでは80後半のスコアが出ており良好な結果でした。しかしモバイルについては、50に届くかどうかとういう、あまり良くない結果となってます。

 

これは、CSSの記述がまずい訳ではなく、はてなのモバイル対応の事情により、余計な物まで読み込んでいる影響だと思います。

 

モバイルファーストの時代なのに、はてなブログがこのように読み込みスピードが遅いのは大変残念な状況だと言えます。

 

もし、今後改善する予定がないのであれば、他のサービスへの乗り換えを真剣に考えないといけないのかも知れません。

 

まとめ

GoogleスプレッドシートのWeb関数を使うとスクレイピングを簡単にできることがわかりました。

 

高度なことはGoogle Apps ScriptやPython等でプログラミングする必要がありますが、定型的なデータ取得はGoogleスプレッドシートを使った方が楽だと思います。

 

サーバに負荷がかかるスクレイピングは避けるべきですが、ライトな作業はGoogleスプレッドシートで十分でしょう。

 

エクセルを使ったことがある人は、容易にGoogleスプレッドシートを使うことができると思いますので、ぜひタダなので使い倒して見て下さい。

 

それでは今回の記事はこれでおしまい。