urllib2 загрузить часть сжатой страницы - PullRequest
2 голосов
/ 31 октября 2011

Мне нужен аналог:

urllib2.urlopen(url).read(100)

Но для сжатых страниц, таких как:

request = urllib2.Request(url)
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
buf = StringIO(response.read(100))
gzip.GzipFile(fileobj=buf, mode='r').read()

IOError: CRC check failed 0xd71b7369L != 0x0L

Ответы [ 3 ]

0 голосов
/ 31 октября 2011

Я не думаю, что это возможно сделать, так как вам нужен полный файл GZIP (10+ байт, тело, 8 байт нижний колонтитул) для его извлечения. Если у вас нет этого полностью, вы не можете извлечь его. И, как объясняется в вашем сообщении об ошибке, проверка CRC завершается неудачно, поскольку CRC находится в нижнем колонтитуле.

0 голосов
/ 31 октября 2011

Вы можете попросить сервер отправить вам только первые 100 байтов (используя заголовок Range):

import urllib2

req=urllib2.Request('http://www.python.org/')
#
# Here we request that bytes 0--100 be downloaded.
# The range is inclusive, and starts at 0.
#
req.add_header('Accept-encoding','gzip')
req.add_header('Range','bytes={}-{}'.format(0, 99))
f=urllib2.urlopen(req)
# This shows you the actual bytes that have been downloaded.
content_range=f.headers.get('Content-Range')
print(content_range)
# bytes 0-99/18716
print(repr(f.read()))
# '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm'
0 голосов
/ 31 октября 2011

Попробуйте использовать библиотеку zlib . Gzip использует zlib, но вводит концепцию сжатия на уровне файлов вместе с проверкой CRC, и кажется, что это не то, что вам нужно.

См. Эту хорошую статью HTTP Compression в python (хотя в статье упоминается, что не следует использовать zlib напрямую, вы должны попробовать оба варианта и основать свое решение на том, что использовать на основе того, что вы конкретно пытаетесь сделать, и что лучше всего подходит для you ), а также этих фрагментов кода из Dough Hellman , которые показывают, как сжимать или распаковывать с zlib .


Хороший материал для чтения:

...