Я извлекаю некоторые страницы через Интернет, используя Perl's LWP::UserAgent
и хотел бы быть максимально вежливым. По умолчанию LWP::UserAgent
без проблем обрабатывает сжатый контент через gzip. Есть ли простой способ сделать так, чтобы сохранить все полосы пропускания?Как я могу принять gzip-сжатый контент с помощью LWP :: UserAgent?
ответ
LWP имеет эту возможность, благодаря HTTP::Message
. Но это немного спрятано.
Сначала убедитесь, что у вас есть Compress::Zlib
, чтобы вы могли обрабатывать gzip
. HTTP::Message::decodable()
выведет список разрешенных кодировок на основе установленных вами модулей; в скалярном контексте этот вывод принимает форму строки с разделителями-запятыми, которую вы можете использовать с HTTP-заголовком 'Accept-Encoding
', который LWP
требует, чтобы вы сами добавили свой номер HTTP::Request
. (На моей системе с установленным 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. Если вы только хотите LWP
распаковывать ответ, а не возиться с текстом, сделайте так:
print $response->decoded_content(charset => 'none');
Примечание: Это работает с LWP 5,814 (с 08 июля) или более поздней версии. –
Из моего тестирования с LWP 6.03 все, что требовалось, это использовать 'decoded_content', а не' content'. – Cas