大規模で定常的にクローリングするための手法
――『クローリングハック あらゆるWebサイトをクロールするための実践テクニック』は一見するとWebクローラーを開発・運営している人向けですが、クローリングされる側のWeb開発者にも役立つ内容だとのこと。そこで、本書の狙いについて教えてください。
竹添:実は最初、クロールする側とされる側、どちらの視点で書いていくかは迷いました。ただ、いずれにせよ、Webを構成している技術を正しく理解してもらいたいというのが本書の一番の狙いです。基本的には必要な際にどちらかの視点に寄せて解説しています。
クローラーを運用していると、作りが雑でおかしなステータスを返していたり、HTMLがきちんとしていなかったりするサイトを見かけます。自分たちはそれを反面教師にしてHTTPやHTMLのきちんとした書き方を意識するようになりました。
ユーザー目線になりすぎてクローラーに意識が向いていないWeb開発者も少なくないでしょう。クローラーの技術について解説していますが、ぜひサイトやサービスを開発する方にも読んでもらいたいと思っています。
――本書の企画はどういうところから生まれたんですか?
竹添:クローラーの本自体はけっこうたくさん出版されています。ただ、ちょっとデータを取得するためにカジュアルにスクレイピングする方法を解説した本が多いんです。機械学習のデータソースとしてWeb上のデータを使いたいという需要が増えてきたのが背景にあるんでしょう。
萩野:この2年くらいで急激に増えましたよね。特徴的なのは、ほとんどがPythonで説明されていることです。これは、データサイエンティストなどちょっとしたデータが必要な人にとって使いやすいからでしょう。
多くの本がライトなフレームワークでスクレイピングするテクニックを紹介しています。が、その手法はフレームワークにかなり依存するので、1年もすると使いものにならなくなる場合が多いと思います。
スクレイピングやクローリングをするとき、Webの仕組みを理解しないままテクニックだけでやってしまうとすぐに行き詰まります。なので、本書はそこを埋めるような内容に作り上げていきました。
――クローリング自体はどういうサービスや用途に使えるものなんでしょうか。
田所:たとえば、Web上で公開された入札情報を定期的にクロールするなどがあります。日々の業務に必要なデータを人が毎回取ってくるのは手間なので、自動化するためにクローリングを行うという例ですね。
萩野:それと、コンテンツ・アグリゲーションもあります。ビズリーチが展開している「スタンバイ」は、様々な求人情報サイトから情報を集めてきて、バーティカル型の検索サービスを提供しています。同様のものに、旅行系や不動産系の検索サービスもありますよね。
アプリの中で使うデータをユーザーの代わりに集めるためにクローリングを利用する場合もあります。たとえば、ファッションの領域では、ユーザーがアプリ内で自由に服を組み合わせてコーディネートできるよう、様々なブランドのECサイトから画像をクロールしているサービスもあります。
さらに、アカウント・アグリゲーションもあります。クラウド型の家計簿アプリや会計ソフトのように、ユーザーが利用している様々なサービスからユーザーに代わって情報を収集し、アプリなどで1ヵ所で管理するサービスですね。
田所:そうしたサービスにも応用できる手法を解説しているので、テクニック本を最初に読んだあと、2冊目として本書を読んでもらうといいかもしれません。ライブラリやフレームワークの中で実際に何が起きているのか、分かるようになるはずです。
竹添:そうですね。その時々でカジュアルにデータを取得するというよりは、もっと大規模で定常的にクローリングするための手法を解説しています。
サイトを見ているのは人間だけではない
――ターゲットとして想定されている、クローラーの開発・運用に携わっている方には本書はどう役立つんでしょうか。
島本:継続的にデータを取得するクローラーを運用するとなると、サイトの情報更新に対応する、クローリングの対象を増やす、といったことも必要になります。それを限られたリソースの中でどう実現していくかについては、既存の本だとあまり解説されていないように感じます。
自分たちがそういう問題にぶつかったので、それをいかに解決してきたかというノウハウをまとめました。今クローラー運用をしていて、まだ大規模にはやっていない方でも、今後その必要が生じたときには同じような問題にぶつかるはずです。なので、今のところは本格的な運用をしていない方でも本書を読んで備えておいてもらうといいですね。
田所:効率的なクローリングと対象サイトに迷惑をかけないことはバランスを取らないといけません。定常的に行うのであれば、「クローリングをさせていただく」という姿勢が必要です。
――具体的にどういうことに気をつけないといけないですか?
竹添:アクセスしすぎないことが第一です。
田所:最低限のアクセス回数で正しい情報を取得することですね。リクエストを投げる間隔にも注意しないといけません。
竹添:サイトによってサーバーのキャパシティも異なるので、サイト毎に対応を変える必要がある場合もありますね。
田所:観察は非常に大事です。
――一方で、現状クローリングにあまり関心がないWeb開発者も対象とされています。具体的にはどういったことが学べますか?
島本:そういう方でもSEOは大事だと考えていると思います。SEOの狙いは、検索エンジンにサイトをクロールしてもらって検索上位に表示されることですよね。たとえばGoogleの場合、まずGoogleのクローラーにデータを取得してもらわなくてはなりません。ところが、作りがまずく、クローラーに正しい情報を伝えられていないサイトもあります。せっかくクローラーが来ても正しく情報を伝えられないと、大きな機会損失をしていることになります。
検索サービスはGoogle以外にもありますが、データを取得してもらうことがユーザーに気づいてもらいやすくなる早道ですから、そのためにどうすればいいのか、どうやってサイトを作るのがいいのかというノウハウを紹介しています。
田所:Web開発者は的確な方法でより多くのユーザーに情報を届けたいと考えているでしょう。そのとき重要になるのがクローラー目線でのサイト制作です。Googleには検索結果をカード形式で表示させるリッチカードがありますが、これも適切に構造化されたサイトでないときちんと表示してもらえないんです。
クローラーに見られることを踏まえてサイトを作っておくと、リッチカードのような方法でユーザーに対してより効果的に情報を届けられる可能性があります。SEOでも優位になるでしょう。ブラウザやその先にいるユーザーのためにサイトを作るのは大切です。そのうえでクローラーからどう見えているかも考慮することで、実はより広くユーザーに情報を届けられるようになるわけです。
――Web開発者にはまだそうした考え方が浸透していないとお考えですか?
萩野:クローリングでもテクニック本が中心になっているように、SEOでもテクニックをまとめたものが多く、クローラーの視点に立って最適化を考えるといった本は少ないですよね。
田所:SEOがGoogle最適化と同義で使われることもあります。もちろんGoogleにとって最適なサイトであるなら我々もクローリングしやすいんですが、表面的なテクニックで誤魔化していると、なかなかそうはいきません。古いサイトだと改修が難しいかもしれませんので、クローラーからどう見えるかということも意識していただくとよいのではないかと思います。
川上:SEOは検索順位を上げることだと思われがちですが、どちらかといえばクローラー最適化なんですよね。
島本:サイトを見ているのは人間だけではない、ということですね。
クローラーから見たダメなサイト
――皆さんは業務でクローラーを運用されていますが、変なサイトを見かけることもありますか?
竹添:クローリングしていると「世の中にはこんなサイトがあるんだ」というびっくりすることは多いです。
川上:たとえば、SQL文がURLのパラメータにそのまま書いてあるサイトがありました。
島本:書き換えたらどうなるのかと思いましたが、怖くてさすがに試せませんでした(笑)。
――そういうサイトを見つけたらどうするんですか?
川上:クローリングを依頼されている場合はお伝えして改善していただけることもありますが、そうでない場合はクローリングが難しいサイトとして記録しておきます。
田所:サイトの文字コードに関してもありましたね。とあるサイトで、URLエンコードされているやたら長い文字列があったのでデコードして文字コードを見たら、「charset="文字コード"」と日本語で書いてあったんです。サンプルコードをそのままコピペしたのかな?と(笑)。
ただ、そうした部分はWebやHTTPの仕組みをちゃんと知っていないと、作っている側もミスに気づきにくいんです。「UTF-8」のハイフンがないなど、適切に指定できていない場合もあります。仕組みがわかっているとそういうミスも防ぎやすいので、クローラー目線で見てみることは価値のあることだと思います。
萩野:他には、ページの中身が削除されていて見た目には存在していないページなのに、ステータスコードが200で返ってくる状態のサイトもありました。存在していないのにリクエストが受理されたということで、クローラーからすれば存在していることになるわけです。
逆も然りで、ページがあるのに400番台、つまり存在しないと返してくるサイトもありました。このように、ステータスがいい加減なページはわりと見受けられます。
マナーを守ったうえでクローリングする
――本書の内容についても教えてください。皆さんそれぞれ各章を担当したということで、第1章からお願いできますか?
竹添:「Chapter 1 クローラーを支える技術」では、基本的な事柄を説明して簡単なクローラーを作ってみるという、全体を読み進めるための準備をしました。難しい部分はないと思います。
「Chapter 2 HTTPをより深く理解する」では、クローラーとサイトの実例をもとに、どういうリクエストにどんなステータスコードを返せばいいのかを解説しました。HTTPの正しいステータスについて学べます。HTTPのヘッダの使い方、URLの正しい構造やURLエンコードについても説明しているので、まさにHTTPの基礎を押さえる章ですね。
田所:「Chapter 3 文字化けと戦う」は文字化けの対応についてです。文字コードとは何なのか、から始まり、文字コードがわからないときにどう推定したらいいのかにも触れています。
クローリングするサイトが限定的であれば文字コードは決め打ちでよいのですが、不特定多数の場合は手作業で決め打ちしていくのは辛いです。なので、そんなときに役立つ自動判定の知識なども紹介しました。
川上:「Chapter 4 スクレイピングの極意」は、クローリングのあとのスクレイピングをどうしたらいいのかについて解説しています。クローリングして取得したHTMLから必要なデータを抽出することをスクレイピングと呼ぶのですが、今回はCSSセレクタでスクレイピングする手法について書きました。
特にサイトの仕様変更、HTMLの変更に強い書き方を説明しています。あとHTML以外の、たとえばPDFからデータを抽出する方法についても少し紹介しました。
萩野:「Chapter 5 認証を突破せよ!」は大きく三つに分かれています。そもそも認証が必要なページをクローリングするのはアカウント・アグリゲーションなどユーザーに代わって情報を収集するケースです。取得したデータを世の中に公開するような検索サービス的な使い方はNGで、データ自体もセンシティブなため、データの取り扱いについて注意点をまとめました。
そのうえで、認証が必要なページのクローリング方法を解説しています。また、サイトによってはデータ連携用のWeb APIを提供している場合もありますので、このようなWeb APIにおける認証方法についても紹介しました。Web APIで連携できるなら原則そうすべきですね。
島本:「Chapter 6 クローリングの応用テクニック」は、応用編として大規模にクローリングするときにどうするかを解説しました。
対象サイト自体に大量のコンテンツ、例えば30万件のコンテンツがあるとき、サイトに負荷をかけないようにクロールするのであれば1日で全件を取得することはできません。そこから本当に取得すべきデータを探すために、robots.txtやサイトマップ、RSS、Atomを活用します。
しかし、それらが更新されていないサイトもあるので、そのときどうするかについても紹介しています。また、対象サイトの数が多いときの管理方法にも触れています。あくまでマナーを守ったうえでクローリングする方法ですね。
竹添:「Chapter 7 JavaScriptと戯れる」では、ここまであえて言及しなかったAjaxやSPAという、JavaScriptを使ったサイトをクローリングする手法について解説しました。
部分的にAjaxを使っていたり、完全にSPAになっていてサイトがJavaScriptだけで動いていたりするサイトが増えています。クローラーを運用するなら、そういったサイトにも対処せざるをえないでしょう。本章はそんなときの処方箋です。
WebDriverという、実際にWebブラウザを操作するライブラリを使用してクローリングする方法を紹介していますが、必要なリソースや安定性などの面で問題があるので、使わずに済むのであればそれに越したことはありません。たとえばPCサイトでAjaxが使われていても、モバイルサイトはプレーンなHTMLな場合もあるのでそちらをクロールするという方法があります。
どうしようもないときはWebDriverを使ってクロールするしかありませんが、Ajaxを使った大規模なサイトを定常的にクローリングするのはやはり難しい部分が多いですね。ただ、今後そういうサイトが増えていくことは間違いないので、無視することもできないのが悩ましいところです。
サイトはできるだけ「普通に」作ったほうがいい
――では最後に、本書が気になる方に、アドバイスやメッセージをお願いします。
田所:繰り返しになりますが、とにかくサイトを観察することが大事です。
萩野:社内外のデータサイエンティストの方々と話しているとちょっと分析するためにデータが欲しいという話を聞くことが多々あります。自前でクローラーを作る人もいますが、Pythonのフレームワークで簡易にクローリングする方がほとんどです。
ですが、そこからより高度なことをしようとすると、必ずつまずくんですね。そしてそこで諦めてしまう。でも、Webの仕組みがわかったうえでクローリングに取り組むと、できなかったことができるようになり、取得できるデータの幅も広がります。だからこそ、2冊目のクローリング本として本書を選んでもらえるといいなと改めて思います。
川上:本書はサイトはできるだけ「普通に」作ったほうがいいということが分かる本です。基本を押さえてルールを正しく守って、クローリングしやすいサイトを作ってほしいですね。そうすると、Web開発者としても目的に沿ったサイトになると思います。
島本:仕事柄、2017年にもなってまだこんなサイトがあるのか、と驚くことが少なくなかったように思います。そういったサイトに対応するためのノウハウも詰め込んでいますので、私たちと同じく驚きつつも楽しく読めるかもしれません(笑)。
竹添:クローラーの開発・運用を通して、インターネットはすごいなと改めて思いました。作りの微妙なサイトもたくさんありますが、それでも成立する柔軟性によってこれまで多くの情報が蓄積されてきました。
現在はこういったコンテンツをクローラーが収集してデータ化しています。より多くのサイトが正しく作られるようになれば、SEOやクローリングのテクニックではなく、より本質的なことに集中できるようになります。それによってインターネットがよりよいものになっていくのではないか、という思いが皆さんにも伝わればいいなと思います。