2008年、Webは文字列解析で変わっていく:まとめサイト2.0(3/8 ページ)
オルタナティブ・ブログを例に挙げて“まとめサイト”を作るための手法を紹介してきたこの連載。最終回は、文字列解析の自動化からキーワードを抽出するための方法を紹介しよう。
WWW::Mechanizeによるコンテンツの取得
WWW::Mechanizeは、第2週目で説明したLWP::UserAgentモジュールのサブクラスとして構成されている。
そのためLWP::UserAgentモジュールのすべてのメソッドを利用できる。つまり、getメソッドの引数に取得したいURLを設定すると、そのURLのコンテンツを取得できる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
取得が成功したかどうかは、successメソッドで調べることができる。また取得したコンテンツがHTMLであるかどうかは、is_htmlメソッドで調査できる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
実際のHTMLコンテンツは、contentメソッドで取得できる。このcontentメソッドは、どのような文字コードで書かれているのか分からない。
本連載では、ここまでEncode::Guessを使って自動判定をしてきたが、「自動巡回」という面では、さまざまなコンテンツが混じるということから、「Content-Typeヘッダ」を見てエンコードしたほうがよいだろう。そのコード記述は次のようになる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
WWW::Mechanizeでリンクを辿る
コンテンツを取得するだけならば、LWP::UserAgentモジュールを使うのと何ら変わらない。
WWW::Mechanizeの特徴は、コンテンツ中に埋め込まれたリンクやHTMLフィールドを操作して、リンク先をたどったり、フォームをサブミットできたりする点にある。今回は自動巡回が目的なのでフォームのサブミットについては省略し、リンクをたどる方法についてのみ説明する。
リンク先をたどるためのメソッドは、幾つか用意されているが、代表的なのは、find_all_linksメソッドだ。find_all_linksメソッドは括弧内に条件を指定すると、その条件に合致するリンクを示すWWW::Mechanize::Linkオブジェクトを返す。
次のようにforeachでループすれば、コンテンツに含まれる、それぞれのリンクを取り出せる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
条件には、表1のようなオプションが利用できる。例えば、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
とすれば、URLが「http://blogs.itmedia.co.jp/」からはじまるリンクだけを取り出せるのだ。
表1■find_all_linksのオプション
オプション | 意味 |
---|---|
text | リンク文字に特定文字列と合致する |
text_regex | リンク文字が特定の正規表現とマッチする |
url | 記載されているURL(相対リンクと絶対リンクのどちらの場合もありうる)が特定の文字列と合致する |
url_regex | 記載されているURL(相対リンクと絶対リンクのどちらの場合もあり得る)が特定の正規表現とマッチする |
url_abs | 記載されているURLを絶対リンクに変換したものが特定の文字列と合致する |
url_abs_regex | 記載されているURLを絶対リンクに変換したものが特定の文字列と合致する |
name | name属性の値が特定文字列と合致する |
name_regex | name属性の値が特定の正規表現とマッチする |
id | id属性の値が特定文字列と合致する |
id_regex | id属性の値が特定の正規表現とマッチする |
class | class属性の値が特定文字列と合致する |
class_regex | class属性の値が特定の正規表現とマッチする |
tag | リンクのタグ(例えば「a」や「area」「frame」)を指定する |
tag_regex | リンクのタグ(例えば「a」や「area」「frame」)を正規表現で指定する |
WWW::Mechanize::Linkオブジェクトのurlメソッドは、リンクのURLを示す。リンク先をたどるには、このURLに対してgetメソッドを呼び出せばよい。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
リンク先をたどった後には、backメソッドを呼び出すことで、元のコンテンツに戻ることもできる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Webを巡回していくには、再帰呼び出しを使ってそれぞれのリンクをたどって行けばよい。実際に、再帰呼び出しを使って、Webを巡回する例を次ページのリスト1に示す。
なお、リスト1を実際に試すときには、再帰するレベルに注意しよう。再帰的にコンテンツをたどれば、対象となるサイトにかなりの負荷をかけることになるためだ。
Copyright © ITmedia, Inc. All Rights Reserved.