メメメモモ

プログラミング、筋トレ、ゲーム、etc

perlでスクレイピング「URL操作」

URLに規則性がある場合

対象とするサイトのURLを見てみると規則性がある場合があります。


例えば、なにかを一覧しているページでは、URLに「page=002」といったパラメータが付いている場合があります。
この一覧ページはページングされていて、「page=002」は2ページ目を表示していることを表しています。
ですので、「page=003」「page=004」と続いていくことが予想できます。


このときにpageの値をperlで作って、順次アクセスしていく事を考えます。
URLを操作する時に便利なものが「URIモジュール」です。
このモジュールを使用すると次のようになります。

#!/usr/bin/env perl                                                             
use strict;
use warnings;
use LWP::Simple;
use URI;

my $uri = URI->new('http://hogehoge.com/list');

for my $page (1..10) {
    $uri->query_form( page => sprintf("%03d", $page ) );
    print $uri->as_string, "\n";
    my $content = get($uri->as_string);
}

「$uri->query_form( page => sprintf("%03d", $page) );」のようにパラメータの値を指定すると、
http://hogehoge.com/list?page=001」のようにURLを作成してくれます。
pageの値はforループで順次インクリメントしていって作成しています。

WebAPIにアクセスする場合

WebAPIにアクセスする場合にもURL操作が必要になります。
WebAPIとは、HTML以外の形式でサイトのデータを返してくれるものです。
普通のWebページではニュースやユーザー情報等がHTML形式で表されているのですが、
WebAPIではXMLやJSONなど、データの種類が見分けやすい形式で表されます。
また、APIですのでパラメータを設定すれば、データをある程度柔軟に取って来れます。
WebAPIへのアクセスは制限がかかっている事もありますが、普通のWebページにアクセスするようにアクセスできるWebAPIもあります。


次のWebAPIは、ATNDのWebAPIへのURLです。
http://api.atnd.org/events/?keyword=perl&format=json
アクセスすると「perl」というキーワードを含んだイベント情報がJSON形式で返ってきます。


上記のURLの「?keyword=perl&format=json」は、WebAPIへパラメータを渡している部分です。
ATNDのWebAPIに渡せるパラメータは、下記のページに記述されています。
ATND API リファレンス


このWebAPIへのURLを、URIモジュールを用いて構築します。

#!/usr/bin/env perl                                                             
use strict;
use warnings;
use utf8;
use LWP::Simple;
use URI;

my $keyword = 'perl';

my $atnd_api = URI->new('http://api.atnd.org/events/');
$atnd_api->query_form( keyword => uri_escape_utf8($keyword), format => 'json' )\
;
my $json = get($atnd_api->as_string);

パラメータが多くなってくると、ハッシュの形で指定できるのが楽ですね。
$jsonにJSON形式のデータが入ります。