読者です 読者をやめる 読者になる 読者になる

perlでスクレイピング「HTTPでページを取ってくる」

perl スクレイピング

perlでのスクレイピング関連をメモしていきたいと思います。


まずスクレイピングするときに行なう処理は、ページを取ってくることです。
普段は、URLをブラウザのURL欄に入力し、ブラウザがHTTPでサーバにアクセスしてページを取得しています。
この処理をperlで行なうようにします。


使用するモジュールは、次の二つがあります。

  • LWP::Simple
  • LWP::UserAgent


これらのモジュールは、ブラウザと同様にHTTPでサーバにアクセスしてページを取得する機能があります。
それぞれの使用例は下記のようになります。

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

my $url = 'http://yahoo.co.jp/';

# LWP::Simpleの「get」関数を使用                                                
my $html = get($url) or die "Couldn't get it!";
#!/usr/bin/env perl                                                             
use strict;
use warnings;
use LWP::UserAgent;

my $url = 'http://yahoo.co.jp/';

# LWP::UserAgentのインスタンスを生成                                            
my $ua = LWP::UserAgent->new;

# LWP::UserAgentの「get」メソッドを使用                                         
# 返り値はHTTP::Response                                                        
my $response = $ua->get($url);

if ($response->is_success) {
    my $html = $response->content;
} else {
    die $response->status_line;
}


ともに変数「$html」にHTMLが入ります。
このHTMLを解析して、欲しい情報を取得します。


LWP::Simpleの方が、記述はシンプルです。単純にページを取って来れるような状況ではこれで十分ですね。


一方で、色々と制限がかかっているページもあります。
例えば

  • 特定のページのリンクからのアクセスのみ許可しているページ
  • ブラウザからのアクセスのみ許可しているページ

などです。
そういうときにはLWP::UserAgentで設定することで対応します。


各制限ページに対応する処理は次のようになります。

特定のページのリンクからのアクセスのみ許可しているページ

この場合は、HTTP_REFERERを設定することで対応します。
HTTP_REFERERは前のページのURLを示すものです。
サーバ側では、これを見て判断している場合があるので、
適切な値にセットした状態でアクセスするようにします。

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

# 制限ページ                                                                     
my $url = "http://yahoo.co.jp/";

# アクセス元                                                                     
my $http_referer = "http://referer.co.jp/";


my $ua = LWP::UserAgent->new;

# リファラの設定                                                                 
my $request = HTTP::Request->new(GET => $url);
$request->referer($http_referer);

my $response = $ua->request($request);

if ($response->is_success) {
    my $html = $response->content;
} else {
    die $response->status_line;
}


HTTP::Requestモジュールを使用して、サーバに送るリクエストを生成しています。このモジュールをLWP::UserAgentのrequestメソッドに渡して、サーバに生成したリクエストを送ります。
レスポンスの部分は先ほどを同じです。

ブラウザからのアクセスのみ許可しているページ

どのブラウザでアクセスしているのかは、UserAgentというところで判断されています。
各ブラウザのUserAgentは下記のページに記載されています。
http://www.openspc2.org/userAgent/


例えばGoogle Chromeのバージョン5のUserAgentは次のようなものになります。

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.55 Safari/533.4


UserAgentを設定してアクセスする処理は次のようになります。

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


my $url = 'http://hogehoge.co.jp/';
my $user_agent = 'Mozilla/5.0';

my $ua = LWP::UserAgent->new;

# UserAgentの設定                                                                
$ua->agent($user_agent);


my $response = $ua->get($url);


if ($response->is_success) {
    my $html = $response->content;
} else {
    die $response->status_line;
}

LWP::UserAgentのagentメソッドで設定しています。




LWP::UserAgentはこのように、HTTPリクエストの設定を細かく指定できます。
さっと軽くスクリプトを書くときはLWP::Simpleを、
色々な設定が必要な場合はLWP::UserAgentを使用するようにします。


スクレイピングの次の段階では、こうして取ってきたHTMLを解析します。