スクレイピング不可サイトへのブックマークレット戦術

みなさまこんにちは、フリーランス太田雅昭です。

今回はブックマークレットを用いたスクレイピングについて解説させて頂きます。

[rtoc_mokuji]

スクレイピングについて

スクレイピングはウェブサイトから情報を抽出する技術を指します。手法は様々で、Pythonで仮想ブラウザを通して行うなどがあります。情報を抽出する立場から見れば、わざわざ目で必要な情報を探すよりもスクリプトで一気に取得する方が便利なのは間違いありません。ですがそれはあくまで利用者の立場で見た考えであり、情報提供者から見ればまた違った視点となります。

サーバーの負荷や収益などの観点からスクレイピングをされたくない情報提供者は、スクレイピングを防止する為の対策を講じることもあります。例えば以下のような対策があります。

  • HTML直出力ではなくJavaScriptで動的にコンテンツを生成
  • 怪しいアクセスには「私はロボットではありません」のRECAPTCHA認証を表示
  • APIを提供してサーバーの負荷を下げようとする、利用者と情報提供者お互いに利益のあるWin-Winな方法

この他にも様々あるかと思われますが、こうしたスクレイピングをする側とされる側のいたちごっこの中で、情報提供者に迷惑をかけないブックマークレットによる情報抽出方法があります。

公開データのスクレイピングは基本的に違法ではない

ログインなどを必要としない、一般的に公開されているデータのスクレイピングは違法ではありません。一方で、ログインしないと見れないデータをスクレイピングし、再利用する際には違法かどうかを個別に判断する必要があります。以下のサイトが参考になるかと思います。

https://self-development.info/%e5%85%ac%e9%96%8b%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%82%8b%e3%82%a6%e3%82%a7%e3%83%96%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e3%80%8c%e3%82%b9%e3%82%af%e3%83%ac/

ブックマークレットについて

ブックマークレットはBookmark(ブックマーク)とApplet(アプレット)を組み合わせた造語とされており、小さなスクリプトをブックマークとして機能させる方法です。このブックマークレットをクリックすることで、現在表示しているウェブサイト上で、任意のスクリプトを実行することができます。以下に簡単なブックマークレットの例を示します。

javascript: alert(document.querySelector('head title').textContent);

これはサイトのタイトルを表示するブックマークレットです。これを使用するには、以下のような方法があります。

  • クロームなどブラウザのアドレスバーに直接打ち込む
  • 任意のブックマークを作成してからURLを編集
  • HTMLでリンクを生成してブックマークバーにドラッグ&ドロップ

これらのうち、開発者なら1つ目が手っ取り早いでしょうし、ブックマークレット利用者なら3つ目が最もお手軽でしょう。3つ目は例えば

サイトタイトルを取得

といったリンクを作成し、それをブックマークバーにドラッグ&ドロップすることでブックマークレットの登録が完了します。あとは任意のサイトでそれを実行するだけとなります。試しに上のリンクをブックマークバーにドロップして試していただければ、このページのタイトルが以下のようにアラート表示されるはずです。なお執筆時点のスクリーンショットですので、タイトルなど変更されている可能性もあります。

ブックマークレットによるスクレイピングと対策

ブックマークレットによるスクレイピングの対策は難しいでしょう。実際に人が視認できる状態までレンダリングされ、DOMエレメントもしっかり展開されている状態がほとんどです。ほとんどのサイトで有効と思われます。

ブックマークレットによるスクレイピングとサーバー負荷

ブックマークレットによるスクレイピングは、ほぼ人の手による情報収集に近い性質を持っていると言えます。自動で複数のIPアドレスから連続的にアクセスすることも無ければ、サイトの重要なお知らせを見逃すことも少ないでしょう。2023年3月現在、飲食店への迷惑行為のために、性善説で成り立っていたシステムが立ち行かなくなると言ったニュースが話題となりました。クラッカーとそれへの対抗のいたちごっこはテクノロジーを進歩させますが、そのために本来受けられていたであろうサービスを受けれなくなる可能性があるのも否定できません。その点、ブックマークレットによるスクレイピングは利用者にも運営者にも優しいものであり、そういったリスクも少なくなるでしょう。

スプレッドシートとの連携

上記で述べさせていただいた通り、ブックマークレットでデータを取得できることは分かりました。続いてそのデータを送信する場所を作っていきます。ブックマークレットからアクセスする先は、以下のようなものがあります。

  • ブラウザのストレージ
  • 各種サービスのAPI
  • スプレッドシートのウェブアプリ

このうちブラウザのストレージは何かの拍子で消えてしまう可能性もあります。各種サービスのAPIは、用途によっては良い選択肢です。一方スプレッドシートのウェブアプリは大抵の用途に対応でき、費用もかからずお手軽です。またデータ集計も楽に行えます。

ウェブアプリ

スプレッドシートのウェブアプリを使えば、まるでウェブサイトのようなページを作成することができます。今回はデータ受信用にのみ使いますので、以下のようなGASを作成します。

function doPost(e = {
  parameter: {},
}) {
  const useParams = 'name,price,likeNum,commentNum,img1,img2,description';
  const data = e.parameter;

  const row = [];
  for (let title of useParams.split(',')) {
    row.push(data[title]);
  }

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データ').appendRow(row);
}

あとはこのウェブアプリをデプロイし、ブックマークレットから送信するだけです。なお実際のコードはそれぞれの項目を整形してスプレッドシートに書き込むため、もう少しだけ複雑となります。

まとめ

いかがでしたでしょうか?ブックマークレットによるスクレイピングは実際に人の手で1つ1つのページを表示しなければならず手間もありますが、様々な対策のされているサイトでも抽出できる可能性があります。ぜひ参考にしていただけましたら幸いです。

最後までお読み頂き、ありがとうございました。