2009-08-16 3 views
20

Я извлекаю некоторые страницы через Интернет, используя Perl's LWP::UserAgent и хотел бы быть максимально вежливым. По умолчанию LWP::UserAgent без проблем обрабатывает сжатый контент через gzip. Есть ли простой способ сделать так, чтобы сохранить все полосы пропускания?Как я могу принять gzip-сжатый контент с помощью LWP :: UserAgent?

ответ

34

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'); 
+0

Примечание: Это работает с LWP 5,814 (с 08 июля) или более поздней версии. –

+3

Из моего тестирования с LWP 6.03 все, что требовалось, это использовать 'decoded_content', а не' content'. – Cas