RSSが公開されていれば、その内容から今何が話題になっているのかを把握することができる。このスクリプトが“まとめサイト”を作るピースの1つだ。
このコンテンツは、オンライン・ムックPlus「まとめサイト2.0」の一部です。関連する記事は、こちらでご覧になれます。
前回までは、スクレイピングの基礎を説明した。今回からは、実際にどのようにスクレイピングのプログラムを作っていけばよいのか、実践的な解説行っていこう。
今回の目的は、「RSSで配信されているブログ投稿を、コメント数が多いもの順に並べて表示する」という処理のスクリプト作成だ。
このようなスクリプトを作っておけば、数ある記事の中から、「盛り上がっている記事(炎上しているかもしれない)」を容易に把握することができる。そして、このスクリプトを以降の記事で紹介する自動化設定に組み合わせることで、“まとめサイト”を作り上げていくのだ。
スクレイピングするためには、まず、相手のWebサーバに接続してコンテンツを取得しなければならない。そこで、Perlを使ってWebサーバに配置されたコンテンツを取得する方法から説明しよう。
Perlにおいて、Webサーバにアクセスしてコンテンツを取得するには、「LWP(libwww-perl)」というモジュールを用いる。ほとんどのサーバ環境には、LWPがインストールされていると思われるが、もし使えない状態であれば、cpanコマンドを用いてインストールしよう(管理者でない場合には、その権限について要確認だ)。
cpanコマンドについては、この記事を参考にしてほしい。LWPは、「cpan install LWP」としてインストールすることができる。本連載では、以下、幾つかのモジュールを用いるが、それらについても同様の手順となる。
LWPモジュールを使ってコンテンツを取得するには、1)LWP::Simpleを使う方法、2)LWP::UserAgentを使う方法、などが挙げられる。ここでは、より柔軟な設定ができる、2)の方法を採用しよう。
なお、LWPモジュールを使ってコンテンツを取得する方法は、ほかにもある。例えば認証が必要だったり、Cookieがないとアクセスできない接続が当てはまるだろう。
すぐ後にリストを示すが、LWP::UserAgentを使ってWebサーバからコンテンツデータを取得することは、比較的容易だ。しかし、スクレイピングを目的とする場合には、次の点を考慮しなければならない。これがポイントだ。
1)文字コードの問題
HTMLコンテンツの文字コードは、コンテンツによってまちまちだ。コンテンツを取得した後、何らかの文字コードに統一しておかなければ、後でスクレイピングする時に文字コードの違いから、うまく条件に合致しない可能性がある。
どのコードに統一してもよいが、本連載では、「UTF-8」に統一しよう。その理由は、a)最近のWebコンテンツは「UTF-8」で書かれるものが多くなってきた、b)RSSは「UTF-8」の場合が多い、c)Perlは5.8.0以降で「UTF-8」をサポートした、という情勢からだ。
Perlスクリプト自身を「UTF-8」で記述して、入力/出力とも、「UTF-8」にするのであれば、スクリプトファイルへ次のように記述する。
use utf8;
use encoding 'utf8',
STDIN=>'utf8', STDOUT=>'utf8';
LWPモジュールを使って取得したコンテンツをUTF-8に変換するには、Encode::GuessライブラリとEncodeライブラリを使う。その方法については、後述する。
2)何度も同じコンテンツを処理したくない
Webサーバに接続してコンテンツを取得するのには処理時間がかかるし、ネットワークに負荷もかかるだろう。そしてスクレイピングするとなれば、そのスクレイピング処理にもある程度の時間がかかる。そう考えると、手元にデータをキャッシュしておき、Webサーバ側のコンテンツが更新されていなければ、処理をスキップしたいと考えるのは自然だ。
このような「更新されているか否かを知る」という仕組みは、HTTPプロトコルレベルでサポートされている。Webサーバがコンテンツの最終更新を知っているのであれば、その最終更新日時がLast-Modifiedヘッダで返される。
この最終更新日時以降に、コンテンツが更新されている時に限りコンテンツを取得したいのであれば、次のようにする(図1)。
Copyright © ITmedia, Inc. All Rights Reserved.