Programing

파이썬 urllib2는 웹 페이지에서 가져온 gzip 데이터를 자동으로 압축 해제합니까?

lottogame 2020. 11. 4. 07:36
반응형

파이썬 urllib2는 웹 페이지에서 가져온 gzip 데이터를 자동으로 압축 해제합니까?


나는 사용하고있다

 data=urllib2.urlopen(url).read()

나는 알고 싶다:

  1. URL의 데이터가 gzip으로 압축되었는지 어떻게 알 수 있습니까?

  2. urllib2는 데이터가 gzip으로 압축되면 자동으로 압축을 풉니까? 데이터는 항상 문자열입니까?


  1. URL의 데이터가 gzip으로 압축되었는지 어떻게 알 수 있습니까?

콘텐츠가 gzip으로 압축되었는지 확인하고 압축을 풉니 다.

from StringIO import StringIO
import gzip

request = urllib2.Request('http://example.com/')
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
    buf = StringIO(response.read())
    f = gzip.GzipFile(fileobj=buf)
    data = f.read()
  1. urllib2는 데이터가 gzip으로 압축되면 자동으로 압축을 풉니까? 데이터는 항상 문자열입니까?

아니요. urllib2는 'Accept-Encoding'헤더가 urllib2에 의해 설정되지 않고 다음을 사용하여 자동으로 데이터 압축을 풀지 않습니다. request.add_header('Accept-Encoding','gzip, deflate')


간단한 .gz파일 에 대해 이야기하는 경우 아니요, urllib2는 디코딩하지 않고 변경되지 않은 .gz파일을 출력으로 얻습니다 .

당신이 사용하여 자동 HTTP 수준 압축에 대해 얘기하는 경우 Content-Encoding: gzip또는 deflate, 그는 의도적 사용하여 클라이언트가 요청하는 Accept-Encoding헤더를.

urllib2는이 헤더를 설정하지 않으므로 반환되는 응답은 압축되지 않습니다. 압축에 대해 걱정할 필요없이 리소스를 안전하게 가져올 수 있습니다 (압축이 지원되지 않기 때문에 요청이 더 오래 걸릴 수 있음).


귀하의 질문에 대한 답변을 받았지만보다 포괄적 인 구현을 위해 Mark Pilgrim의 this 구현을 살펴보십시오 . 널리 사용되는 RSS 파서에 대한 gzip, deflate, 안전한 URL 파싱 및 훨씬 더 많은 것을 다루지 만 그럼에도 불구하고 유용합니다. 참고.


이제 urllib3이이를 자동으로 처리하는 것으로 보입니다.

참조 헤더 :

HTTPHeaderDict ({ 'ETag': ' "112d13e-574c64196bcd9-gzip"', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'X-Frame-Options': 'sameorigin', ' 서버 ':'Apache ','Last-Modified ':'Sat, 01 Sep 2018 02:42:16 GMT ','X-Content-Type-Options ':'nosniff ','X-XSS-Protection ':' 1; mode = block ','Content-Type ':'text / plain; charset = utf-8 ','Strict-Transport-Security ':'max-age = 315360000; includeSubDomains ','X-UA-Compatible ' : 'IE = edge', 'Date': 'Sat, 2018 년 9 월 1 일 14:20:16 GMT', 'Accept-Ranges': 'bytes', 'Transfer-Encoding': 'chunked'})

참조 코드 :

import gzip
import io
import urllib3

class EDDBMultiDataFetcher():
    def __init__(self):
        self.files_dict = {
            'Populated Systems':'http://eddb.io/archive/v5/systems_populated.jsonl',
            'Stations':'http://eddb.io/archive/v5/stations.jsonl',
            'Minor factions':'http://eddb.io/archive/v5/factions.jsonl',
            'Commodities':'http://eddb.io/archive/v5/commodities.json'
            }
        self.http = urllib3.PoolManager()
    def fetch_all(self):
        for item, url in self.files_dict.items():
            self.fetch(item, url)

    def fetch(self, item, url, save_file = None):
        print("Fetching: " + item)
        request = self.http.request(
            'GET',
            url,
            headers={
                'Accept-encoding': 'gzip, deflate, sdch'
                })
        data = request.data.decode('utf-8')
        print("Fetch complete")
        print(data)
        print(request.headers)
        quit()


if __name__ == '__main__':
    print("Fetching files from eddb.io")
    fetcher = EDDBMultiDataFetcher()
    fetcher.fetch_all()

참고URL : https://stackoverflow.com/questions/3947120/does-python-urllib2-automatically-uncompress-gzip-data-fetched-from-webpage

반응형