Как правильно обрабатывать сжатую страницу при использовании curl? - PullRequest
115 голосов
/ 03 декабря 2011

Я написал bash-скрипт, который получает выходные данные с веб-сайта, используя curl, и выполняет кучу манипуляций со строками в выводе html.Проблема в том, что когда я запускаю его на сайте, который возвращает данные в сжатом виде.Переход на сайт в браузере работает нормально.

Когда я запускаю curl вручную, я получаю gzipped-вывод:

$ curl "http://example.com"

Вот заголовок с этого конкретного сайта:

HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=utf-8
X-Powered-By: PHP/5.2.17
Last-Modified: Sat, 03 Dec 2011 00:07:57 GMT
ETag: "6c38e1154f32dbd9ba211db8ad189b27"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: must-revalidate
Content-Encoding: gzip
Content-Length: 7796
Date: Sat, 03 Dec 2011 00:46:22 GMT
X-Varnish: 1509870407 1509810501
Age: 504
Via: 1.1 varnish
Connection: keep-alive
X-Cache-Svr: p2137050.pubip.peer1.net
X-Cache: HIT
X-Cache-Hits: 425

Я знаю, что возвращаемые данныеgzipped, потому что это возвращает html, как и ожидалось:

$ curl "http://example.com" | gunzip

Я не хочу передавать вывод через gunzip, потому что скрипт работает как есть на других сайтах, и передача через gzip нарушит эту функциональность.

То, что я пытался

  1. , изменяя user-agent (я пробовал ту же строку, которую посылает мой браузер, "Mozilla / 4.0" и т. Д.)
  2. man curl
  3. поиск в Google
  4. поиск в stackoverflow

Все пусто

Есть идеи?

1 Ответ

226 голосов
/ 03 декабря 2011

curl автоматически распакует ответ, если вы установите флаг --compressed:

curl --compressed "http://example.com"

- сжатый (HTTP) Запросите сжатый ответ, используя один из алгоритмов, поддерживаемых libcurl, и сохраните несжатый документ. Если используется эта опция и сервер отправляет неподдерживаемую кодировку, curl сообщит об ошибке.

gzip, скорее всего, поддерживается, но вы можете проверить это, запустив curl -V и найдя libz где-то в строке «Features»:

$ curl -V
...
Protocols: ...
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

Обратите внимание, что здесь действительно виноват рассматриваемый веб-сайт. Если curl не передал заголовок запроса Accept-Encoding: gzip, сервер не должен был отправлять сжатый ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...