为什么WWW :: Mechanize获取某些页面而不是其他页面?

Z.Z*_*Zen 3 perl www-mechanize

我是Perl/HTML的新手.我正在尝试使用http://en.wikipedia.org/wiki/Periodic_table$mech->get($url)上的元素周期表来获取某些内容,但它仍然会返回如下错误消息:

错误获取 http://en.wikipedia.org/wiki/Periodic_table:在PeriodicTable.pl第13行被禁止

$mech->get($url)如果$urlhttp://search.cpan.org/,则可以正常工作.

任何帮助都感激不尽!


这是我的代码:

#!/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 );
Run Code Online (Sandbox Code Playgroud)

mar*_*ton 10

这是因为维基百科根据请求中提供的用户代理拒绝访问某些程序.

通过在实例化之后和之前设置代理,您可以将自己别名显示为"普通"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' );
Run Code Online (Sandbox Code Playgroud)

这对我来说很有用,你的帖子中有URL.较短的字符串可能也会起作用.

(我认为你也应该从URL中删除尾部斜杠.)

WWW :: Mechanize是LWP :: UserAgent的子类- 请参阅那里的文档以获取更多信息,包括agent()方法.

您应该限制使用此访问方法.维基百科明确拒绝在robots.txt文件中访问某些蜘蛛.LWP :: UserAgent(以libwww开头)的默认用户代理位于列表中.

  • 您还应该查看[agent_alias](http://search.cpan.org/perldoc?WWW::Mechanize#$mech-%243Eagent_alias%28_%24alias_%29)方法,该方法可让您轻松模拟常见浏览器要记住那个大版本的字符串. (4认同)