Computer

Webスクレイピングとは

本記事はスクレイピングの入門編として、スクレイピングの全般について解説していきます。

情報収集を自動化したい、効率化したいという流れで「スクレイピングがいいらしいけど、いったいスクレイピングってなに?スクレイピング で自分の問題は解決するのか?」という方の疑問にお答えしたいと思います。

スクレイピングとは

スクレイピングとは、プログラムを使ってウェブサイトにアクセスして、そこから情報を抽出することをいいます。

ウェブサイトはと本来、ウェブブラウザを使ってアクセスし、ブラウザ内に表示されたコンテンツを人間が目で閲覧することで情報を取得するわけですが、スクレイピングはそれをコンピュータに実行させるのです。

スクレイピングが特に効果を発揮するのは、ウェブページから何らかの規則性があるデータを抽出したい場合です。プログラムは繰り返し実行する定型的な操作を自動化するのが得意なため、ページの構造や作業手順が定型化していればいるほどスクレイピングの費用対効果は大きくなります。

例えば、ショッピングサイトなどで商品がズラリと一覧されているページなどはスクレイピングに適しています。表示されたページから商品画像(のURL)、商品名、商品コード、販売価格を抽出したいとしましょう。

チェックする商品数が少ない場合、一つずつ目で見てメモ帳に書き出してもいいですが、商品数が膨大になると、それらを手作業で抽出するだけで大変な労力です。

一回限りの作業と分かっているのなら気合いと根性の手作業でやり切るのもいいですが、もしその作業を毎日しなければならないとしたら?もはや現実的ではありませんね。スクレイピングはそうした時間がかかって退屈な作業からあなたを解放してくれます。

幅広い適用範囲

先ほどはショッピングサイトを例に挙げましたが、似たような作業は他の業界にもあるはずです。

小売店やサービス業では競合他社の新規出品や価格調査などのニーズはあるでしょうし、不動産仲介や人材紹介などの業種であれば新規の物件情報や求人情報を複数のデータソース(ウェブサイト)から自動的に収集できれば、仕事がはかどるばかりか新たな商機につながるかもしれません。

なにもスクレイピングを行うのは企業に限りません。フィギュアのコレクターが限定アイテムの出品状況の調査を自動化したり、はたまたスポーツの結果や競馬の結果を蓄積するといったホビー的な使い方をすることもできます。

このように、ネット上で公開、更新されているデータさえあれば、、そこにはスクレイピングのニーズがあるといえます。

スクレイピングに適さないもの

スクレイピングが便利だといっても、スクレイピングツールの開発には時間もコストもかかるので、なんでもかんでもスクレイピングが適しているわけではありません。

まず、頻繁に繰り返し行われる作業でないと、ツール開発にかかるコストと自動化によって得られる恩恵が釣り合いません。

また、画像や文章を読み取ったり、人間の感情や暗黙知、経験が判断に影響を与えるようなものも自動化には適しません。データの取得まではスクレイピングで可能ですが、その先の「データをどう扱うか」は、AI(人工知能)、機械学習といった領域になってきます。

さらには利用規約で明示的にスクレイピングを禁止している場合もありますし、対象サイトが技術的にスクレイピングを不可能にしている場合もあります。

規約に違反して被るリスクや、対策をかい潜るコストなどを考慮して、費用対効果を正当化できない場合はスクレイピングを断念することもあります。

APIかスクレイピングか

ここまでは「データ抽出=スクレイピング」みたいな流れできましたが、データ抽出に必ずしもスクレイピングが必要となるわけではありません。eコマースシステムを例に挙げれば、Amazonや楽天などは商品検索のためのAPIを公開しています。

APIは「Application Programming Interface」の頭文字で、異なるプログラム同士がメッセージ(命令やデータ)のやりとりを行えるようにする仕組み全般をいいます。

ウェブの世界でAPIというと、Rest APIかSOAPを指すことがほとんどで、近年ではRest APIでJSON形式のデータをやり取りするのが主流ですが、古めのシステムではSOAPでXMLをやり取りするものもまだまだあります。

人間の目によって消費されることを前提にしたウェブページとは異なり、APIはプログラム利用されることを前提に作られているので、データはプログラムが扱いやすい形式になっているので、スクレイピングよりも簡単に高品質なプログラムを作れるという大きなメリットがあります。

またAPIは仕様が明確に文書化されていて、さらに後方互換性も担保されています。そのため、サイト側がある日突然API仕様を変更して、その影響で既存のプログラムが動かなくなるという心配をする必要はありません。

基本的には、Amazon、Google、Facebook、Twitter、楽天といったインターネットのテクノロジー企業は自社のプラットフォーム用のAPIを提供していることがほとんどですし、「モダン」なサービスであれば最初からAPIを完備しているケースも多いので、まずはAPIの利用可否と機能を評価することが先決でしょう。

スクレイピングの弱点は「脆さ」

一方でスクレイピングはAPIではなく、人間が閲覧するためのウェブページを相手にしています。

ウェブページはプログラムによってスクレイピングされることを想定していないので、「このデータを必ずこういう形式で返す」という取り決めも保証もありません。

スクレイピングは「欲しいデータはページの中ほどにあるテーブル(表)の中にある。テーブルの一行目は見出しなので無視して、商品名は一番左のカラム(列)にあり、価格は右から二番目のカラムにある」みたいな「決めつけ」をしていきます。

作り方によっては、多少の変更に耐えうるプログラムを作ることもできますが、それでもサイト側で大幅なリニューアルがあるとまず動かなくなるでしょう。

ウェブサイトを更新する一切の権限は運営側にあるので、ある日突然、予告なしにサイトの構造が変わったとしても、スクレイピングをしている側が文句をいう筋合いなどありません。引き続きスクレイピングをしたければ、黙ってプログラムを作り変えるしかないのです。

そのため、正規のAPIがある場合はそれを最優先して利用し、APIが存在しない場合にのみスクレイピングを考慮するのです。

そしてスクレイピングツールを開発する際は、「一回作って終わり」ではなく、メンテナンスをし続けないといけないことを頭に入れておかないといけません。

スクレイピングツールは基本的には、現状のサイトから情報を抽出できることを最優先に考え、その後は対象サイトの変更に追随し続けるというアプローチをとられます。

スクレイピングツールは、設計やテストがきちんと行われるそれなりの規模のシステムとは異なり、「ちょっとしたツール」という扱いを受けやすく、勝ててまに作る「やっつけ仕事」になりがちなのですが、しかしいくら「やっつけ」とはいっても、最低限の設計や品質は必要です。

あまりに「安かろう悪かろう」なものを作ってしまうと、変更のたびに必要以上のコストが発生したり品質上のトラブルを抱え込んだり、最終的には初期費用を上回るメンテナンス費用が発生したりして、ある時点で抜本的な作り直しを迫られる可能性もあります。

スクレイピングの関連技術

続いてはスクレイピングに必要となる技術についてみていきましょう。

スクレイピングの考え方は、「ブラウザを使って人間が行っていた操作をプログラムに再現させ、その過程でデータを抽出する」というものなので、基本的にはウェブ関連の技術を用いますが、データの取得と処理の方法は、通常のブラウザを使ったウェブ閲覧とは大きく異なります。

ここからは、ウェブの基盤技術をスクレイピングの文脈を交えつつ紹介していきます。

HTML/CSS/JavaScript

普段閲覧しているウェブページはすべてHTMLで記述されていて、HTMLはウェブに根幹にあるものです。

なんてちょっともったいつけた書き方をしましたが、HTML自体は以下のような「タグ」で装飾されたシンプルな言語で、見たことがある方も多いでしょう。

<h2>ロンドン旅行記</h2>
<img src="bigben.jpg"/>
<p>私がロンドンに旅行してドヤる日記です。</p>
<h3>旅の準備編</h3>
<p>そういえばパスポートが期限切れしていることに気づき最初の仕...</p>

 

ブラウザは、このHTMLのタグを解釈して、指定されたフォーマットで画面上に表示していきます。例えば<h2>は大見出し(heading)、<img>は画像、<p>はパラグラフ、<h3>も見出しとなります。

HTMLはあくまでドキュメントの構造を定義するものであり、通常はこの上にCSSと呼ばれるスタイルを適用して、フォントの色やサイズ、余白などのレイアウトを変更していきます。

そのため、HTMLはページの「骨格」で、CSSは「肌」なんていわれることもあります。あと、ほとんどのウェブページでは画像ファイルも配置されていますね。

さらにブラウザは「JavaScript」というプログラミング言語を実行することができ、JavaScriptを使ってブラウザのAPIを呼び出すことで、サーバーと通信をしたり、ページ内の要素を操作することもできるので、ウェブページをより動的なものにすることができます。

しかしこれはページを普通に閲覧する場合の話で、スクレイピングとなると話が変わってきます。

まずCSSですが、CSSには色やレイアウトといったスタイルの記述情報しかないので、スクレイピングする際には無視して問題ありません。

そして多くの場合、スクレイピング対象のデータはHTML内に記述されていて、HTMLから必要なデータを抽出するのがメインの仕事となります。

また、HTML内には肝心のデータがなく、JavaScriptを使って追加でデータを取得させ(Ajax)、取得したデータからグラフやテーブルを生成させるパターンもあります。JavaScriptが絡むと面倒な気がするかも知れませんが、Ajaxで取得されるデータはJSONやXMLというプログラムで処理しやすい形式なのと、データの構造が変わりにくい傾向があるので、基本的にはメリットの方が多いと考えています。

まれにチャートなど画像形式で出力されているデータを処理する必要もあり、その場合は画像に合わせて解析プログラムを作り込む必要があるので厄介です。ただほとんどのプログラミング言語は画像の読み取りを行うAPIを提供しているので、技術的に可能か不可能かといえば「可能」だといえます。

HTTP

ウェブを理解する上でHTMLやJavaScriptと同じくらいに重要なのがHTTPというプロトコルです。

HTTPは「ハイパーテキスト転送プロトコル」というなんともエキゾチックな名前がついていますが、基本的にはブラウザとウェブサーバーからHTML、CSS、JavaScriptや画像ファイルなどのデータを受け取ったり、逆にデータやファイルをサーバー側に送信するのに使われます。

ブラウザのアドレスバーに何かURLを入れると、ブラウザの内部ではサーバーに接続して、HTTPリクエスト(要求)を送ってデータを受け取り、そのデータを解析してウェブページを表示させているのです。

スクレイピングをするということは、ブラウザと同じ挙動を再現する必要があるので、HTTPの知識が頻繁に要求されます。

HTTP自体は軽量なプロトコルながらも膨大な仕様や慣習があるので、すべてを把握しようとすると逆につまづいてしまいます。スクレイピングの文脈では、なるべくブラウザが行っているのと同じ挙動を再現することを意識して、そのためにCookie(セッションIDなど)を含む一般的なヘッダを操作する方法を学べば十分だといえます。

スクレイピングの開発言語

ここまで、データを取得するための標準技術について紹介してきました。

スクレイピングツールがどんなものか、APIとは何か、どういう時にスクレイピングを使うべきか、どういった技術が関係するのか、この辺りをお伝えしました。次回以降では「スクレイピングツールの開発の流れや言語やフレームワークの選定」などについて紹介したいと思います。

-Computer