我正在使用 Perl 在 Web 上获取一些页面,LWP::UserAgent
并希望尽可能有礼貌。默认情况下,LWP::UserAgent
不会通过 gzip 无缝处理压缩内容。有没有一种简单的方法可以做到这一点,为每个人节省一些带宽?
问问题
10459 次
1 回答
39
LWP 内置了此功能,这要归功于HTTP::Message
. 但是有点隐蔽。
首先确保您已经Compress::Zlib
安装,以便您可以处理gzip
. HTTP::Message::decodable()
将根据您安装的模块输出允许的编码列表;在标量上下文中,此输出采用逗号分隔的字符串形式,您可以将其与 ' Accept-Encoding
' HTTP 标头一起使用,这LWP
需要您自己添加到HTTP::Request
-s 中。(在我的系统上,Compress::Zlib
安装后,列表是“ gzip
, x-gzip
, deflate
”。)
当您HTTP::Response
回来时,请务必使用$response->decoded_content
而不是访问内容$response->content
。
在LWP::UserAgent
中,这一切都像这样聚集在一起:
my $ua = LWP::UserAgent->new;
my $can_accept = HTTP::Message::decodable;
my $response = $ua->get('http://stackoverflow.com/feeds',
'Accept-Encoding' => $can_accept,
);
print $response->decoded_content;
这也会将文本解码为 Perl 的 unicode 字符串。如果您只想解压缩响应,而不是LWP
弄乱文本,请这样做:
print $response->decoded_content(charset => 'none');
于 2009-08-16T20:56:54.353 回答