首页 > 解决方案 > 带有 HTML::TreeBuilder 的用户代理字符串

问题描述

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

标签: perl

解决方案


没有办法将其设置在new_from_url(). 您必须LWP::UserAgent自己加载并设置用户代理字符串。然后你可以用new_from_content().

但是,这里有一个指向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" });

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

#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);

};


推荐阅读