【问题标题】:Why does WWW::Mechanize GET certain pages but not others?为什么 WWW::Mechanize GET 某些页面而不是其他页面?
【发布时间】:2011-04-11 01:53:50
【问题描述】:

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

获取错误 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 );

【问题讨论】:

    标签: perl www-mechanize


    【解决方案1】:

    这是因为 Wikipedia 根据请求中提供的 User-Agent 拒绝访问某些程序。

    您可以通过在实例化之后和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::UserAgent 的子类 - 请参阅那里的文档了解更多信息,包括有关 agent() 方法的信息。

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

    【讨论】:

    • 您还应该看看agent_alias 方法,它可以让您轻松模拟常见的浏览器,而无需记住大版本字符串。
    【解决方案2】:

    当您遇到此类问题时,您需要观察 HTTP 事务,以便查看网络服务器向您发送的内容。在这种情况下,您会看到 Mech 连接并获得响应,但 Wikipedia 拒绝响应您的机器人。我喜欢 Mac 上的HTTP Scoop

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 2020-10-05
      • 2015-02-18
      • 2023-04-02
      • 1970-01-01
      • 2012-08-28
      • 2011-12-12
      • 1970-01-01
      相关资源
      最近更新 更多