2010-09-11 66 views
3

我是新来的Perl/HTML的东西。我试图用$mech->get($url)获得从元素周期表上的东西http://en.wikipedia.org/wiki/Periodic_table但它一直像返回此错误消息:为什么WWW :: Mechanize获取某些页面而不是其他页面?

错误歌厅 http://en.wikipedia.org/wiki/Periodic_table: 禁止在PeriodicTable.pl线13

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

回答

10

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

您可以自己别名设置实例后,代理和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中斜杠过我的想法。)

WWW ::机械化是LWP::UserAgent一个子类 - 看到文档有更多的信息,包括对agent()方法。

尽管如此,您应该限制使用这种访​​问方法。维基百科明确拒绝访问其文件中的某些蜘蛛。 LWP :: UserAgent(以libwww开头)的默认用户代理位于列表中。

+4

您还应该查看[agent_alias](http://search.cpan.org/perldoc?WWW:Mechanize#$mech-%243Eagent_alias%28_%24alias_%29)方法,该方法可让您轻松模拟常见浏览器而不必记住那个大版本的字符串。 – cjm 2010-09-12 03:11:02

1

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

相关问题