Я извлекаю некоторые страницы через Интернет с помощью Perl LWP::UserAgent
и хотел бы быть максимально вежливым. По умолчанию LWP::UserAgent
не без проблем обрабатывает сжатый контент через gzip. Есть ли простой способ сделать это, чтобы сохранить все полосы пропускания?
Как я могу принять gzip-сжатый контент с помощью LWP:: UserAgent?
Ответ 1
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;
Это также расшифрует текст для строк Unicode Perl. Если вы хотите только LWP
, чтобы разогнать ответ, а не испортить текст, выполните следующие действия:
print $response->decoded_content(charset => 'none');