带有HTML::TreeBuilder的用户代理字符串
我正在使用HTML::TreeBuilder->new_from_url($url),但由于用户代理字符串不兼容,服务器阻止了我。如何更改用户代理字符串HTML::TreeBuilder以new_from_url($url)直接使用,而没有通过传统方式获取 Web 内容的解决方法?
回答
没有办法在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);
};