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

时间:2010-09-11 10:45:20

标签: perl www-mechanize

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

  

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

但如果$mech->get($url)http://search.cpan.org/,则$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 );

2 个答案:

答案 0 :(得分:10)

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

您可以通过在实例化之后和get()之前设置代理来将自己显示为“普通”Web浏览器,例如:

$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中删除尾部斜杠。)

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

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

答案 1 :(得分:1)

当您遇到这些问题时,您需要查看HTTP事务,以便查看网络服务器发回给您的内容。在这种情况下,您会看到Mech连接并获得响应,但维基百科拒绝响应您的机器人。我喜欢Mac上的HTTP Scoop