3

Perl/HTML は初めてです。http://en.wikipedia.org/wiki/Periodic_table$mech->get($url)の周期表から何かを取得しようとしていますが、次のようなエラーメッセージを返し続けました:

エラー GET http://en.wikipedia.org/wiki/Periodic_table : PeriodicTable.pl 行 13 で禁止されています

ただし、http://search.cpan.org/$mech->get($url)の場合$urlは正常に動作します。

どんな助けでも大歓迎です!


これが私のコードです:

#!/usr/bin/perl -w

use strict;
use warnings;
use WWW::Mechanize;
use HTML::TreeBuilder;
my $mech = WWW::Mechanize->new( autocheck => 1 );

$mech = WWW::Mechanize->new();

my $table_url = "http://en.wikipedia.org/wiki/Periodic_table/";

$mech->get( $table_url );
4

2 に答える 2

10

これは、リクエストで提供された User-Agent に基づいて、ウィキペディアが一部のプログラムへのアクセスを拒否しているためです。

インスタンス化の後、 の前にエージェントを設定することで、「通常の」Web ブラウザとして表示されるようにエイリアスを設定できますget()。次に例を示します。

$mech->agent( 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8' );

あなたの投稿のURLでうまくいきました。短い文字列もおそらく機能します。

(URL の末尾のスラッシュも削除する必要があると思います。)

WWW::Mechanize はLWP::UserAgentagent()のサブクラスです。メソッドを含む詳細については、ドキュメントを参照してください。

ただし、このアクセス方法の使用を制限する必要があります。ウィキペディアは、robot.txtファイルで一部のスパイダーへのアクセスを明示的に拒否しています。LWP::UserAgent (libwww で始まる) のデフォルトのユーザー エージェントは、リストにあります。

于 2010-09-11T11:00:05.720 に答える
1

このような問題が発生した場合は、HTTP トランザクションを監視して、Web サーバーが何を送信しているかを確認する必要があります。この場合、Mech が接続して応答を受け取ることがわかりますが、Wikipedia はボットへの応答を拒否しています。私は Mac のHTTP Scoopが好きです。

于 2010-09-12T00:16:40.027 に答える