带有 HTML::TreeBuilder 的用户代理字符串

User agent string with HTML::TreeBuilder

我正在使用 HTML::TreeBuilder->new_from_url($url),但由于 user agent 字符串不兼容,服务器阻止了我。我如何才能将带有 HTML::TreeBuilder 的用户代理字符串更改为直接使用 new_from_url($url),而无需通过传统方式获取 Web 内容的变通方法?

无法在 new_from_url() 中进行设置。您必须自己加载 LWP::UserAgent 并设置用户代理字符串。然后就可以用new_from_content().

解析内容了

但是,这里是直接 link 到 new_from_url 代码。您可以将其用作您自己的 new() 方法的基础,以便您的程序流程以相同的方式读取。

所以像这样:

sub HTML::TreeBuilder::my_new_from_url {
  # copy and augment new_from_url
  ...
}

my $tree = HTML::TreeBuilder->my_new_from_url($url, { useragent => "foo" });

现在尽管有所有这些正确的方法,但您可以通过覆盖其存储默认用户代理字符串的私有 _agent 方法来对 LWP::UserAgent 玩一个肮脏的把戏。但请注意,您已使保修失效,所有损坏的模块行为都由您承担。

#the original 
sub _agent { "libwww-perl/$VERSION" }

在您的代码中定义:

use LWP::UserAgent ();
sub LWP::UserAgent::_agent { "Mozilla forever" }

或者,更迂回地说:

use LWP::UserAgent ();

my $tree = do {
  local *LWP::UserAgent::_agent = sub { "Mozilla forever" };
  HTML::TreeBuilder->new_from_url($url);

};