Contents
クローラーは意外と簡単?
クローラーとかボットってよく聞きますけど、仕組みは思った以上に簡単なんですね。
そもそもクロウラーとは?
そもそもクロウラーとは何でしょうか?
筆者のゆるい理解で言えば、「Web上から情報を集めるもの」です。
考え方としては、それほど間違っていないはず。
皆さんに馴染みのあるところで言えば、Googleの検索エンジン、あれが立派なクローラーです。
Googleの検索エンジンは、あらかじめWeb上に散らばる情報を収集しています。
そして、検索したキーワードに応じて、取得していたそれらの情報の中から該当するWebページを私達に提示します。
スクレイピング
合わせて覚えておきたいのがスクレイピングです。
スクレイピングは、クローラーの収集した情報を解析して必要な情報だけを抜き出します。
情報を選り分けるという意味では、ひよこ鑑定士みたいなものかもしれません。
具体例を挙げてみれば、ニュースサイトの最新記事をクローリングして、その中から日本のニュースだけを選別することはスクレイピングに当たります。
今回は説明しませんが、スクレイピングはクローリングとセットで勉強しておく必要があります。
クローリングとスクレイピングの流れ
クローリングとスクレイピングの流れを図解すると以下のようになります。
収集→解析→抽出→加工→保存→出力
こうしてみると、なかなか複雑に見えますね。
簡単なクローリングのやり方
簡単なクローリングは、わざわざエディターを引っ張り出してコードを組まなくても、Linux(UNIX)のWget(「ダブリューゲット」あるいは「ダブルゲット」)コマンドを使うことで誰でもできます。
Wgetは、普段はファイルなどを手に入れるために使うコマンドです。
でも、この行為をよくよく考えてみると、立派なクローリングですよね。
ですから、Wgetでクローリングができるのは当然と言えば当然なのです。
さて、肝心のWgetですが、Windowsであればchocolatery、Macであればhomebrewなどのパッケージ管理ツールが入っていれば、コマンド一発でインストールできます。
その他ソースコードをコンパイルする方法もあります(ダウンロードはこちら)。
ただしコンパイルする方法は、筆者の環境ではうまくいきませんでした。
Wgetパッケージは.tar.gzという拡張子のファイルなのですが、どうしてもこれが解凍できなかったんです。
何ででしょう?
ということで、おとなしくbrew installかcinstする方が楽かと。
さっそくクローリングしてみる
さて、実際にクローリングして見ましょう。
と言っても簡単で、ターミナルかコマンドプロンプトを開いて次に紹介するコマンドを入力するだけです。
$ wget [サイトのURL]
これで欲しいページのHTMLファイルを引っ張ってくれます。
ダウンロードされたファイルはカレントディレクトリに保存されるので、lsコマンドかdirコマンドで確認ができます。
ちなみに、ダウンロード先のディレクトリを指定する場合は、
$ wget -O [ファイルを保存したいディレクトリの名前][サイトのURL]
でOKです。
再帰的ダウンロードと階層の指定
さて、上の使い方が「本当にクローラーと言えるか?」と言えば、実際は微妙なところです。
ということで再帰的にダウンロードをします。
「再帰的にダウンロード」というのは、ここでは、ダウンロードファイルにリンクがあった場合、そのリンク先をたどってダウンロードすることを言います。
もし、たどったリンクの先にまたリンクがあれば、そのリンクの先へと潜ります。
この様子を「再帰的にダウンロード」と表現しています。
具体的なwgetコマンドは以下のとおり。
$ wget -r [サイトのURL]
このように-rオプションをつけると、再帰的にサイトをクロールしてくれます。
ところが、ここで1つ問題があります。
上のコマンドでクローリングすると、wgetの設定の都合上、5階層までたどってサイトをクローリングしてしまいます。
つまり「xxx.htmlから始まり、そこにあるリンクから下の階層へ行き、またそこにあるリンクから下の階層へ……」という風に5階層分クローリングしていくので、ダウンロードにも時間がかかってしまいます。
これを防ぐには、-lオプションを使います。
$ wget -r -l1 [サイトのURL]
上の見本のように、-lの後ろに数字をつけることでたどる階層の深さを指定できます。
1とつければ1階層、2とつければ2階層、という感じです。
その他のオプション
その他にも便利なオプションがあるので、いくつか紹介してみます。
-np : 親ディレクトリをクローリングしない
-w [数字] : ダウンロード間隔を指定。「-w5」とすると5秒間隔でダウンロード
-A [拡張子名] :指定した拡張子のファイルのみダウンロード
-R [拡張子名] :特定の拡張子のファイルをダウンロードしない
下2つは「画像のみ引っ張ってきたい」とか、逆に「画像はいらない」というときに使えると思います。
分かりづらいのが-wで、「ダウンロード間隔を指定して何か意味あるの?」と思うかもしれません。
これか意外と重要で、「アクセスを集中させてサーバーに負荷をかけない」という狙いがあります。
クローリングは便利な反面、使い方を間違えると他人に迷惑をかけるので注意が必要なのです。
良くも悪くも使い手のモラル次第といったところです。
本格的にクローリングをしたいなら
さて、今回はクローラーの基礎なので、これ以上突っ込んだことを書かないのですが、本格的なクローラーを作りたいのであれば、Pythonを学ぶことをおすすめします。
なぜPythonかと言うと、Pythonが他の言語よりもクローリングに向いている言語だからです。
・スクリプト言語なのでコンパイルしなくて済む
・クローリング・スクレイピングを実現できる豊富なライブラリ
・コードが簡潔
以上の理由からPythonがクローリングに適しています。
本気でクローリングしたい人はぜひPythonを学びましょう!