perl - 带有 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);
};
推荐阅读
- sql - SQL 选择或连接表的两个单独子集
- c - (bool) 是否可靠地转换为 0 或 1?
- java - 为什么我的标志一直设置为假?
- python - 我如何将一列的值放在 seaborn 点图中
- python - 获取表中所有项目的 Web 链接,然后进行分页
- javascript - 从 xterm js 隐藏帮助器文本框
- word2vec - 尝试运行 Word Embeddings Benchmarks 并获得 UnicodeDecodeError
- c# - c# 将多种类型合二为一
- java - 在没有方法的Java中将二进制转换为十六进制
- ssl - Kubernetes:服务器停止后 Kafka pod 关闭