파이썬 urllib2는 웹 페이지에서 가져온 gzip 데이터를 자동으로 압축 해제합니까?
나는 사용하고있다
data=urllib2.urlopen(url).read()
나는 알고 싶다:
URL의 데이터가 gzip으로 압축되었는지 어떻게 알 수 있습니까?
urllib2는 데이터가 gzip으로 압축되면 자동으로 압축을 풉니까? 데이터는 항상 문자열입니까?
- 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()
- 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()
'Programing' 카테고리의 다른 글
라이선스 페이지없이 최소 WiX 설치 프로그램 UI를 구축하는 방법은 무엇입니까? (0) | 2020.11.04 |
---|---|
C malloc 어설 션 실패가 발생하는 이유는 무엇입니까? (0) | 2020.11.04 |
UILabel UITextField UITextView (0) | 2020.11.04 |
Git에서 오래된 원격 분기 제거 (0) | 2020.11.04 |
bash 스크립트를 실행할 때 줄 번호를 표시하는 방법 (0) | 2020.11.04 |