- PR -

Perl(LWP::Simple)によるページ取得について

1
投稿者投稿内容
saitani
会議室デビュー日: 2006/12/11
投稿数: 3
投稿日時: 2006-12-19 19:16
LWP::Simpleでページを取得したいのですが

例えば
ヤフーの場合
$html = get("http://www.yahoo.co.jp/");
で取得することができました。

WiKiの場合
$html = get("http://ja.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E3%83%89%E3%82%A2");
としても取得することができませんでした。

おそらくURLの問題だとは思うのですが、いろいろとやってみたのですが
どうしても取得することができませんでした。

どのような理由で取得できないのでしょうか。

たお
ベテラン
会議室デビュー日: 2006/10/27
投稿数: 90
投稿日時: 2006-12-22 17:10
use LWP::Simple;
getprint("http://ja.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E3%83%89%E3%82%A2");

getprintでレスポンスコードが取れるらしく
やってみました。

403 Forbidden <URL:http://ja.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E3%83%89%E3%82%A2>

アクセス権が無いっていわれちゃいます。

ブラウザでは普通にみえますし、wgetでも取れますね・・・。

LWP::UserAgentつかってみました。

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://ja.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E3%83%89%E3%82%A2');
my $res = $ua->request($req);
if ($res->is_success) {
print "ok";
}else{
print $res->status_line . "\n";
}

問題なくとれました。
saitani
会議室デビュー日: 2006/12/11
投稿数: 3
投稿日時: 2006-12-29 10:29
お返事がおそくなり申し訳ございません。

ありがとうございます! 取得することができました。

ひとまずwgetを使いたいと思います。

wgetを試しておけば簡単なお話でした・・・
Ay
常連さん
会議室デビュー日: 2006/10/29
投稿数: 45
投稿日時: 2006-12-29 14:43
こんにちは

取得に失敗する理由ですが、パケットキャプチャして色々ためした結果、
「User-Agent リクエストヘッダがない、または lwp で始まるエージェント」
を Wikipedia はアクセス拒否しているみたいです。
("lwp" を含んでいても、先頭が lwp でなければよさそうです)

LWP::Simple で HTTP GET する際、User-Agent リクエストヘッダは
自動で "lwp-trivial/xxx" とバージョン番号が付加されるので、
LWP::Simple モジュールのソースを改造しないと難しいかもですね。

LWP/Simple.pm の User-Agent をセットしている箇所を
適当にいじって実行すると、期待する動作になりました。

// LWP で DoS 攻撃でもされた経緯でもあるんでしょうかね……
1

スキルアップ/キャリアアップ(JOB@IT)