Подтвердить что ты не робот

Как я могу принять gzip-сжатый контент с помощью LWP:: UserAgent?

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

4b9b3361

Ответ 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');