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を解析します。