Как декодировать исходный код, сжатый с помощью gzip в python

Я пытаюсь получить исходный код веб-страницы php с прокси, но он показывает непечатаемые символы. Вывод, который я получил, выглядит следующим образом:

 «Дата: вторник, 09 февраля 2016 г., 10:29:14 мск
Сервер: Apache / 2.4.9 (Unix) OpenSSL / 1.0.1g PHP / 5.5.11 mod_perl / 2.0.8-dev Perl / v5.16.3
X-Powered-By: PHP / 5.5.11
Набор cookie: PHPSESSID = jmqasueos33vqoe6dbm3iscvg0; Путь = /
Истекает: четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу
Cache-Control: нет хранилища, нет кэша, необходимо повторно проверить, пост-проверка = 0, предварительная проверка = 0
Прагма: без кеша
Контент-кодировка: gzip
Варьируется: Accept-Encoding
Длина контента: 577
Keep-Alive: тайм-аут = 5, максимум = 99
Подключение: Keep-Alive
Тип контента: текст / HTML

ТМО @ G7) PHHDS = U = U] ˻_YclT *> например,
Z
VNF: 6ԫIkZ77AnGWɗRGYOc`-οƜO ~ V $
l4 + п] .WTLJSx / | п #> г; lH4f \ SYy7" 

как декодировать этот код с помощью Python, я пытался использовать

decd = zlib.decompress (данные, 16 + zlib.MAX_WBITS) 

но не дает декодированных данных

Прокси, который я использую, отлично работает для нескольких других веб-приложений. Это показывает непечатаемые символы для некоторых веб-приложений, как декодировать это?

Поскольку я использую прокси, я не хочу использовать get () и urlopen () или любые другие запросы из программы на python.

1

Решение

Один из очевидных способов сделать это — извлечь сжатые данные из ответа и распаковать их, используя GzipFile().read(), Этот метод разделения ответа может быть склонен к сбою, но здесь он идет:

from gzip import GzipFile
from StringIO import StringIO

http = 'HTTP/1.1 200 OK\r\nServer: nginx\r\nDate: Tue, 09 Feb 2016 12:02:25 GMT\r\nContent-Type: application/json\r\nContent-Length: 115\r\nConnection: close\r\nContent-Encoding: gzip\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Credentials: true\r\n\r\n\x1f\x8b\x08\x00\xa0\xda\xb9V\x02\xff\xab\xe6RPPJ\xaf\xca,(HMQ\xb2R()*M\xd5Q\x00\x89e\xa4&\xa6\xa4\x16\x15\x03\xc5\xaa\x81\\\xa0\x80G~q\t\x90\xa7\x94QRR\x90\x94\x99\xa7\x97_\x94\xae\x04\x94\xa9\x85(\xcfM-\xc9\xc8\x07\x99\xa0\xe4\xee\x1a\xa2\x04\x11\xcb/\xcaL\xcf\xcc\x03\x89\x19Z\x1a\xe9\x19\x9aY\xe8\x19\xea\x19*q\xd5r\x01\x00\r(\xafRu\x00\x00\x00'

body = http.split('\r\n\r\n', 1)[1]
print GzipFile(fileobj=StringIO(body)).read()

Выход

{
"gzipped": правда,
"заголовки": {
"Host": "httpbin.org"},
"method": "GET",
"origin": "192.168.1.1"}

Если вы чувствуете необходимость проанализировать полное ответное сообщение HTTP, тогда, как вдохновлено этот ответ, вот довольно окольный способ сделать это, который включает в себя создание httplib.HTTPResponse непосредственно из необработанного HTTP-ответа, используя его для создания urllib3.response.HTTPResponseи затем доступ к распакованным данным:

import httplib
from cStringIO import StringIO
from urllib3.response import HTTPResponse

http = 'HTTP/1.1 200 OK\r\nServer: nginx\r\nDate: Tue, 09 Feb 2016 12:02:25 GMT\r\nContent-Type: application/json\r\nContent-Length: 115\r\nConnection: close\r\nContent-Encoding: gzip\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Credentials: true\r\n\r\n\x1f\x8b\x08\x00\xa0\xda\xb9V\x02\xff\xab\xe6RPPJ\xaf\xca,(HMQ\xb2R()*M\xd5Q\x00\x89e\xa4&\xa6\xa4\x16\x15\x03\xc5\xaa\x81\\\xa0\x80G~q\t\x90\xa7\x94QRR\x90\x94\x99\xa7\x97_\x94\xae\x04\x94\xa9\x85(\xcfM-\xc9\xc8\x07\x99\xa0\xe4\xee\x1a\xa2\x04\x11\xcb/\xcaL\xcf\xcc\x03\x89\x19Z\x1a\xe9\x19\x9aY\xe8\x19\xea\x19*q\xd5r\x01\x00\r(\xafRu\x00\x00\x00'

class DummySocket(object):
def __init__(self, data):
self._data = StringIO(data)
def makefile(self, *args, **kwargs):
return self._data

response = httplib.HTTPResponse(DummySocket(http))
response.begin()
response = HTTPResponse.from_httplib(response)
print(response.data)

Выход

{
"gzipped": правда,
"заголовки": {
"Host": "httpbin.org"},
"method": "GET",
"origin": "192.168.1.1"}
1

Другие решения

Хотя gzip использования zlib, когда Content-Encoding установлен в gzipперед сжатым потоком имеется дополнительный заголовок, который неправильно интерпретируется zlib.decompress вызов.

Поместите ваши данные в file-like возразить и передать его через gzip модуль. Например что-то вроде:

mydatafile = cStringIO.StringIO(data)
gzipper = gzip.GzipFile(fileobj=mydatafile)
decdata = gzipper.read()

Из моей уже старой http-библиотеки для Python 2.x

0

По вопросам рекламы [email protected]