๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์๋ต ๋ด์ฉ์ ์ฝ๋ ๋ฐฉ๋ฒ์๋ .text
, .content
๋ฐ .raw
์์ต๋๋ค. ์ฒ์ ๋ ๊ฐ์ง๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ๋ ์ ์ก ์ธ์ฝ๋ฉ์ ๊ณ ๋ คํ๊ณ ์คํธ๋ฆผ์ ์๋์ผ๋ก ์์ถ ํด์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํนํ ๊ฒฐ๊ณผ๊ฐ ํฐ ๊ฒฝ์ฐ, ์๋ฅผ ๋ค์ด XML ๋๋ Json ํ์์ ์ง์ ์ ๋ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ด ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด์ ํํ๋ก ์์ถ ํด์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ํ์ฌ ์์ต๋๋ค.
HTTP ์์ฒญ์ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด์ ์์ ์ฌ์ฉ์๊ฐ ์น ์๋ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ๋ด๋ถ์ ์ผ๋ก ํ์๋ ์คํธ๋ฆผ์ ์์ถ ์ ํ๊ณผ ๊ฐ์ ๋ฎ์ ์์ค์ ๊ฒ์ ๊ด์ฌ์ ๊ฐ์ ธ์ผ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ๊ฒฐ๊ตญ, ๊ทธ๋ฌํ ์คํธ๋ฆผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฝํ๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ "์ค๋ฅ"์
๋๋ค. ์ด๋ฐ ์ ์์ .raw
์คํธ๋ฆผ์ ๋ด ์ทจํฅ์ ๋๋ฌด ์์ํฉ๋๋ค.
.stream
์ ๊ฐ์ ๋ค ๋ฒ์งธ ์์ฑ์ด ๋ ๋์ ์ถ์ํ ์์ค์ ์ ๊ณตํ ์ ์์๊น์?
Response.iter_content
์, ์๋์, ๊ทธ๊ฒ์ ๋ฐ๋ณต์์ ๋๋ค. ๋๋ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด, ์ฆ ๋ฌธ์ ํ๋ก์ธ์๊ฐ ์ง์ ์ฝ์ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๊ตฌํ์ต๋๋ค.
iter_content
๋ก ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
๋น ๋ฅธ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค, BTW.
๋๋ ๋์ํ๋ค. ๊ทธ๋๋ requests
์์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ์ธ ๊ฒ์
๋๋ค. ๋ด ์์ ์ .raw
๊ฐ ์ ์ก ์์ค ์ธ๋ถ ์ ๋ณด๋ฅผ ๋
ธ์ถํ๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆผ์์ ์ฝ์ผ๋ ค๋ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์๋ชป๋ ์ถ์ํ ์์ค์ด๋ผ๋ ๊ฒ์
๋๋ค.
๊ฐ์ธ์ ์ผ๋ก HTTP ์์ฒญ ๊ฒฐ๊ณผ์ ๋ํด ์ค ๋จ์๋ก ๋ฐ๋ณตํ๊ฑฐ๋ ์ฒญํฌ ๋จ์๋ก ๋ฐ๋ณตํ๋ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ณด์ง ๋ชปํ์ง๋ง ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด, ํนํ ์๋ต ํ์์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ช ๊ฐ์ง ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ด ๋๋ค. HTML, XML, Json ๋ฑ๊ณผ ๊ฐ์ ๋ฌธ์ ํ์๊ฐ ํ์ํ
๋ํ ํ์ผ๋ฅ ๊ฐ์ฒด๋ฅผ ๋ํํ๋ ๋ฐ๋ณต์๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ฐ๋ณต์๋ฅผ ๋ํํ๋ ํ์ผ๋ฅ ๊ฐ์ฒด๋ณด๋ค ์์ฑํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
๋ค์ ์ฝ๋๋ฅผ ์๊ฐํด ๋์ต๋๋ค. ํ์ํ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋ค์ ๋ณต์กํฉ๋๋ค. ๊ทธ๋์ ๋์๊ด์ ์ผ๋ถ๋ก ์ด๋ฐ ๊ฒ์ ๊ฐ๊ณ ์ถ๋ค๊ณ ๋งํ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๋ ์ด๊ฒ์ ์ค์ค๋ก ์์๋ผ ํ์๊ฐ ์์ต๋๋ค.
๋๋ requests' models.py ๋ด๋ถ์ ์ฝ๋๊ฐ ์ฌ๊ธฐ์ ์๋ชป๋ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ณตํ๋ ๋์์ด ์๋๋ผ ๋ฐ๋ณต ๊ธฐ๊ณ๋ก ์์ํ๊ธฐ _์ ์_ ์์ ์คํธ๋ฆผ์ ์์ถ์ ํ์ด์ผ ํฉ๋๋ค. ํ์ผ๋ฅ์์ ๋ฐ๋ณต์๋ก ๋์๊ฐ์ ํ์ผ๋ฅ๋ก ๋์๊ฐ๋ ๊ฒ์ ๊ทธ์ ์ด๋ฆฌ์์ ์ผ์ ๋๋ค. ๋จ์ผ API ๋ณํ์ผ๋ก ์ถฉ๋ถํ๋ฉฐ ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ์ด์จ๋ ์ฝํ ์ธ ๋ฐ๋ณต๊ธฐ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ ๊ฒ์ ๋๋ค.
class FileLikeDecompressor(object):
"""
File-like object that wraps and decompresses an HTTP stream transparently.
"""
def __init__(self, stream, mode='gzip'):
self.stream = stream
zlib_mode = 16 + zlib.MAX_WBITS if mode == 'gzip' else -zlib.MAX_WBITS # magic
self.dec = zlib.decompressobj(zlib_mode)
self.data = ''
def read(self, n=None):
if self.dec is None:
return '' # all done
if n is None:
data = self.data + self.dec.decompress(self.stream.read())
self.data = self.dec = None
return data
while len(self.data) < n:
new_data = self.stream.read(n)
self.data += self.dec.decompress(new_data)
if not new_data:
self.dec = None
break
if self.data:
data, self.data = self.data[:n], self.data[n:]
return data
return ''
def decompressed(response):
"""
Return a file-like object that represents the uncompressed HTTP response data.
For compressed HTTP responses, wraps the stream in a FileLikeDecompressor.
"""
stream = response.raw
mode = response.headers.get('content-encoding')
if mode in ('gzip', 'deflate'):
return FileLikeDecompressor(stream, mode)
return stream
์ ์๋ ๋๋ก content_iter
์์ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋น๋ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
class FileLikeFromIter(object):
def __init__(self, content_iter):
self.iter = content_iter
self.data = ''
def __iter__(self):
return self.iter
def read(self, n=None):
if n is None:
return self.data + '\n'.join(l for l in self.iter)
else:
while len(self.data) < n:
try:
self.data = '\n'.join((self.data, self.iter.next()))
except StopIteration:
break
result, self.data = self.data[:n], self.data[n:]
return result
๋ด ์๊ฒฌ, ํนํ ๋ด๊ฐ ๊ฒ์ํ ์ฝ๋ ์์ ๋จ๋ฝ์ ๋ค์ ์ฝ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
์, ํ์ง๋ง ์ด ์๋ฃจ์ ์ ์ด๋ฏธ ์์ฒญ์ ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฒ์งธ ์์น์์ ์์ถ ํด์ ๋ฅผ ์ํํ๋ ๊ฒ๋ณด๋ค ์ฌ์ ํ ๊นจ๋ํ๊ณ (IMO๊ฐ ๋ ์ฝ์ต๋๋ค).
๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก r.file
(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)์๋ r.raw
๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋์ ์ด๊ฒ๋ ๋ฆฌํ์คํธ์ ํฌํจ๋์์ผ๋ฉด ํ๋ ๋ฐ๋จ์
๋๋ค. @kennethreitz
"response.stream"์ ๋์๊ฒ ์ข์ ์ด๋ฆ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์ด๊ฒ์ด response.raw์ ์ฉ๋์ ๋๋ค :)
์ ๋ ๋ณด๊ณ ์ง๊ฐ์ ์ผ๋ก ๊ทธ๋ ๊ฒ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ ๊ธฐ๋ณธ ์ ์ก ๊ณ์ธต์ ๋ด๋ถ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ ธ์ถํ๊ธฐ ๋๋ฌธ์ response.raw๊ฐ ์์๋์์์ ๊นจ๋ฌ์์ต๋๋ค.
๊ทธ๋ค์ด ํ์๋ก ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ raw.read
์
๋๊น?
์. raw.read()๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ด๋ถ ํ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด ๊ทธ๋ ์ต๋๋ค. ๋๋ก๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ณ ๋๋ก๋ ์์ถ๋์ง ์์ ๋ฐ์ดํธ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก response.raw
๋ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊บผ์ด ๋ฌด์ํ ์ ์๊ณ ์ผ๋ถ ๊ณ ๊ธ ์ฌ์ฉ์๋ ์ ์ฉํ ์ ์๋ ์ ์ฉํ ๊ธฐ๋ฅ์ธ ๋ฐ๋ฉด ์์ถ์ ๋
๋ฆฝ์ ์ธ response.stream
๋ ๋๋ถ๋ถ์ ์คํธ๋ฆฌ๋ฐ ์ฌ์ฉ์๊ฐ ์ํ๋ค.
+1
+1
์ด ๋์์ธ ๋ฒ๊ทธ๊ฐ ์์ ๋ ์์ ์ธ๊ฐ์?
์ด ๋ฐฉ๋ฒ์ด ์ผ๋ง๋ ์ ํํ๊ฑฐ๋ ํจ์จ์ ์ธ์ง ํ์คํ์ง ์์ง๋ง ์ ์๊ฒ๋ ๋ค์์ด ์๋ํฉ๋๋ค .
>>> import lxml # a parser that scorns encoding
>>> unicode_response_string = response.text
>>> lxml.etree.XML(bytes(bytearray(unicode_response_string, encoding='utf-8'))) # provided unicode() means utf-8
<Element html at 0x105364870>
@kernc : ๊ทธ๊ฒ ์ด์ํ ์ผ์
๋๋ค. response.content
๋ ์ด๋ฏธ ๋ฐ์ดํธ ์คํธ๋ง์ด๋ฏ๋ก ์ฌ๊ธฐ์ ํ๋ ์ผ์ ํ์ด์ฌ์ด ์ ํํ ์ง์ฅ ์ฝ๋ฑ์ผ๋ก ๋ด์ฉ์ ๋์ฝ๋ฉํ ๋ค์ utf-8๋ก ๋ค์ ์ธ์ฝ๋ฉํ๋ ๊ฒ์
๋๋ค.
์ด๊ฒ์ ๋ฒ๊ทธ๊ฐ _์๋๋๋ค_, ๋น์ ์ด ์ ์ํ ๋ฒ๊ทธ๋ ํ์คํ ์๋๋๋ค. ํ์ผ๋ฅ ๊ฐ์ฒด๊ฐ ์ ๋ง๋ก ํ์ํ๋ค๋ฉด StringIO์ BytesIO๋ฅผ ์ถ์ฒํฉ๋๋ค.
@๋ฃจ์นด์ฌ ๋ง์ต๋๋ค. content
๋ ํญ์ ๋ฐ์ดํธ์ด์ด์ด์ผ ํฉ๋๋ค(Python 3์์๋ ๋ช
์์ ๋ฐ์ดํธ์ด์ด๊ณ Python 2์์๋ str == bytes). ๋ฐ์ดํธ์ด์ด ์๋ ์ ์ผํ ํญ๋ชฉ์ text
์
๋๋ค.
@kennethreitz ์ด์ ๋ํ ์์์ด ์์ต๋๊น? ์ด๊ฒ์ ๋งค์ฐ ์ฌ๊ฐํ ๋์์ธ ๋ฒ๊ทธ์ด๋ฉฐ ์กฐ๊ธฐ์ ํด๊ฒฐํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๋ง์ ์ฝ๋๊ฐ ์์ฑ๋ ์๋ก ๋ชจ๋์๊ฒ ๋ ๋ง์ ๋น์ฉ์ด ๋ญ๋๋ค.
์ด๊ฒ์ ๋์์ธ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๊ธฐ๋ฅ ์์ฒญ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฒญ์ ๊ธฐ๋ฅ ์ ์ง ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๊ณง ์์ฒญ์ ํฌํจ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค(๋ง์ฝ ์๋ค๋ฉด)...
๋๋ ์ค๋ ์ง์๋๋ ๋์์ธ ๋ฒ๊ทธ๋ฅผ "๋๋ฝ๋ ๊ธฐ๋ฅ"์ผ๋ก ๋ค์ ์ ์ธํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ฌด ์ฝ๊ฒ ์ฌ๋ผ์ง๊ฒ ๋ง๋ญ๋๋ค. ์๊ฐ๊ฐ ๊ณ ๋ฏผํ๊ณ ์๋ค๊ณ ๋ค์๋ค.
"์์ฒญ"์ Python stdlib์ ์ผ๋ถ๋ก ๋ง๋ญ๋๋ค. ๊ทธ๊ฒ ์ข์๊ฑฐ์ผ
์ด๊ฒ์ ๊ณ ์น ๊ธฐํ.
์๊ฐ๊ฐ ๊ณ ๋ฏผํ๊ณ ์๋ค๊ณ ๋ค์๋ค.
"์์ฒญ"์ Python stdlib์ ์ผ๋ถ๋ก ๋ง๋ญ๋๋ค.
์ค์ ๋ก๋ ์๋๋๋ค: http://docs.python-requests.org/en/latest/dev/philosophy/#standard -library
์ด๊ฒ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๊ธฐ๋ฅ ์์ฒญ์ ๋๋ค. ์์ฒญ์ ์๋ฌด ์๋ชป๋ ํ์ง ์๊ณ ๋จ์ํ ์ ํ์ ์ธ ์ผ์ ํ์ง ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก ๊ธฐ๋ฅ์ ์ ์์ ๋๋ค.
๋ํ stdlib๋ฅผ ์ค๋นํ๋ ๊ฒ์ด ๋ฐ๋ก ์์ฒญ์ด ๊ธฐ๋ฅ ์ ์ง ์ํ์ ์๋ ์ด์ ์ ๋๋ค. ์์ฒญ์ด stdlib์ ์์ผ๋ฉด ์ ์์ ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์์ง๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋ฒ๊ทธ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ๋์์ด ํดํํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ง์ด๋ ๋ฆด๋ฆฌ์ค๊น์ง stdlib์ ๋ฒ์ ์ ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋์ ๊ฒ์ ๋๋ค.
๋งํฌ ์๋ผ์ดํ, 19.03.2013 08:41:
์๊ฐ๊ฐ ๊ณ ๋ฏผํ๊ณ ์๋ค๊ณ ๋ค์๋ค.
"์์ฒญ"์ Python stdlib์ ์ผ๋ถ๋ก ๋ง๋ญ๋๋ค.์ค์ ๋ก๋ ์๋๋๋ค: http://docs.python-requests.org/en/latest/dev/philosophy/#standard -library
๋๋ ๊ทธ๊ฒ์ ์ฌ๊ธฐ์์ ์ฝ์๋ค:
์คํ ํ
์ด๊ฒ์ด ๊ธฐ๋ฅ ์์ฒญ์ด ์๋ ๋์์ธ ๋ฒ๊ทธ์ธ ์ด์ ๋ ์ด๋ฏธ ์ค๋ช ํ์ต๋๋ค. ๊ธฐ์กด API๋ ์๋ชป๋ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๊ณ ์ฐ๊ฒฐ์ ํ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์๊ฒฉ ์ฌ์ดํธ์ ๋ฐ๋ผ ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ๋์ถํ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ ๊ฒฝ์จ์ผ ํฉ๋๋ค. ์ด๋ ํ์ฌ ์์ ์คํธ๋ฆผ ์ฝ๊ธฐ ์ง์์ ์ฌ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์ด๊ฒ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ์์ฒญ์ด ์๋๋ผ ์์๋ ๊ธฐ๋ฅ์ ์์ ํ๊ธฐ ์ํ ์์ฒญ์ ๋๋ค.
๊น๋ํ๊ฒ ์ ๋ฆฌํด๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ฒ๊ทธ๋ ์์ ์คํธ๋ฆผ ์ฝ๊ธฐ ๊ธฐ๋ฅ์ ์ค์ ์ฌ์ฉ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ, ํนํ ์ ์ฒด ์กฐ๊ฑด๋ถ ์คํธ๋ฆผ ์์ถ ํด์ ๋ถ๋ถ์ ๋ค์ ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์์ถ์ ํ์ฉํ๋ ์ฆ์ ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ๊ธฐ๋ฅ์ด ์ธ๋ชจ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ "์์ฒญ"์ ์ด๋ฏธ ์๋ ์ฝ๋์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์๋ชป๋ ์์น์์ ์ฌ์ฉ๋์์ ๋ฟ์ ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๊ฐ ์๋ฝ ํค๋๋ฅผ ์กด์คํ๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ฝ๊ธฐ ์์ค๋ณด๋ค ๋ฎ์ ์์ค์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์์ถ์ ์ฐ๊ฒฐ์ ํฌ๋ช ํ ํ์ ์ธ๋ถ ์ฌํญ์ด์ด์ผ ํ๋ฉฐ, ๊ด๋ จ ํค๋๋ฅผ ํ์ฑํํ๋ ์ฌ์ฉ์์๊ฒ ํผํด๋ฅผ ์ฃผ์ง ์์์ผ ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์์ถ๋ ์คํธ๋ฆผ์ ๊ด์ฌ์ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ ์๊ฐํ ์ ์์ต๋๋ค. ํนํ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ํฌ๋ง์ ๊ธฐ์๊ฒ ๋ฌด์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆผ์ด ์ค์ ๋ก ์์ถ๋๋์ง ์ฌ๋ถ๋ฅผ ์์ธกํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์์ํ ํ์ ์ธ๋ถ ์ฌํญ์ ๋๋ค. ์ด๊ฒ์ด ์์ ์คํธ๋ฆผ ์ฝ๊ธฐ๊ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒ๋ณด๋ค ๊ทนํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ํธํ์ฌ ์๋ชป๋ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋๋ค.
์ ํ ์ ์์ด์. ์๋ฅผ ๋ค์ด ๋์ฉ๋ ํ ์คํธ ๊ธฐ๋ฐ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์์ถ๋ ์ํ๋ก ์ ์งํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? No way to save original-compressed data to disk ๋ผ๋ ์ ๋ชฉ์ ์๋ก์ด '๋์์ธ ๋ฒ๊ทธ'๋ก ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ ์ ์์ต๋๋ค.
๊ทธ ์์ด๋์ด๋ ์๋์ ์ผ๋ก ์ง๋ถํ๊ณ ์ด๋ฆฌ์์ ๊ฒ์ด์ง๋ง ์์ ์ ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค. ์ฆ, ์์ฒญ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ๊ทธ๋ค์ด ์ํ๋ ์ํธ ์์ฉ ๋ฉ์ปค๋์ฆ์ ์ ํํ ์ ๊ณตํ ์๋ฌด๋ ์์ต๋๋ค. ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ API์ ๋จ์์ฑ์ธ Requests์ ์ฃผ์ ๋ชฉํ์ ์ง์ ์ ์ผ๋ก ๋ฐ๋๋๋ ์คํ์ด ๋ฉ๋๋ค. ์ ์ฉํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์์๋ ๋ถ๊ตฌํ๊ณ API๋ฅผ ๋ณต์กํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ด์๊ฐ ์ ๊ธฐ๋ ์์ฒญ์ ๋ํ ๊ธธ๊ณ ๊ธด_ ์ ์๋ ๋ณ๊ฒฝ ๋ชฉ๋ก์ด ์์ต๋๋ค. ์์ฒญ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด urllib2๋ฅผ ๋์ฒดํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ง ์์ผ๋ฉฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๋จ์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ Requests๋ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํธ ์์ฉ์ ์ ์ํฉ๋๋ค.
Response.text
๋ฐ Response.content
: ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ํฉ๋๋ค.Response.iter_lines()
๋ฐ Response.iter_content()
: ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ํ๋ ๊ฒ์ ์๋๋๋ค.Response.raw
: ๋ค๋ฅธ ๋ ๊ฐ์ง ์ต์
์ด ๋ง์์ ๋ค์ง ์์ผ๋ ์ง์ ํ์ญ์์ค.์ด๋ค์ Requests์ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ฅผ ์๋์ ์ผ๋ก ๋ํํ๊ธฐ ๋๋ฌธ์ ์ ํ๋์์ต๋๋ค. ๋น์ ์ " ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ์ด์จ๋ ์ฝํ
์ธ ๋ฐ๋ณต์์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ ๊ฒ "์ด๋ผ๊ณ ๋งํ๊ณ " response.stream
๋ ๋๋ถ๋ถ์ ์คํธ๋ฆฌ๋ฐ ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ธฐ๋ฅ์
๋๋ค ". ์ด ํ๋ก์ ํธ์ ๋ํ ๊ฒฝํ์ ๋์ํ์ง ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ฝํ
์ธ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํ๊ณ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ํ ์ํ๋ ์ฌ๋์ ๋ง์ง ์์ต๋๋ค.
๋ง์ง๋ง ์์ : ์์ถ์ด ์ฐ๊ฒฐ์ ํฌ๋ช ํ ํ์ ์ธ๋ถ ์ฌํญ์ด์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ๋ ผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ urllib3์ ๋ํด ์ ์ ํ ๋ฒ๊ทธ๋ฅผ ์ ๊ธฐํด์ผ ํฉ๋๋ค.
์์ฒญ์ด ๊ทํ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ถ์ ์ ํ๋ค๊ณ ๋๋ผ์ จ๋ค๋ ์ ๊ฐ์ ๋๋ค.
ํ์ฌ ๊ตฌํ์์ response.raw
๊ฐ ์์๋์์ผ๋ฉฐ ๋ถ๋ถ์ ์ผ๋ก๋ ์ด์ ๋์ํฉ๋๋ค(์ ์ด๋ ํค๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์๊ณ ์์ถ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ด์ผ ํจ).
๊ทธ๋ฌ๋ ๊ทํ์ ์ ์์ ์ฌ์ ํ โโ๊ธฐ๋ฅ ์์ฒญ์ ๋๋ค ...
@๋ฃจ์นด์ฌ
urllib3์ ๋ํ ๋ฒ๊ทธ ์ ๊ณ ๊ฐ ์์ฒญ์ API๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. ์ ์ด๋ ๊ทธ ์์ฒด๋ ์๋๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทํ์ "์ฌ์ฉ ์ฌ๋ก"๊ฐ ๊ณ ์๋์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ ์ธก์์ ์์ถ์ ์ ๊ทน์ ์ผ๋ก ์ ์ดํ ์ ์๋ ๊ฒฝ์ฐ(๋นํ์ฑํํ์ง๋ง ์์ ์ ์ผ๋ก ํ์ฑํํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ) ์์ถ ํ์ผ์ ๋์คํฌ์ ์ ์ฅํ ์ ์๋๋ก ํด๋ผ์ด์ธํธ์ ์์กดํ๋ ๊ฒ์ ๊ทธ๋ค์ง ํฅ๋ฏธ๋กญ์ง ์์ต๋๋ค. .
@schlamar
๊ทธ๋ ๊ฒ ์ฝ์ ์ ์๋ค๋ ์ ์ ๋์ํฉ๋๋ค. ๋๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ด๋ค ๊ฒ์ด๋ ๊ด์ฐฎ๋ค๊ณ ํ์ ํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ๊ฐ๊ธฐ ์ํด ์ ํฐ์ผ์ ์ฌ๋ ๊ฒ์ด ํ์ํ๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ์ญ์์ค.
๊ฑฐ๊ธฐ์ ๊ฐ๊ธฐ ์ํด ์ ํฐ์ผ์ ์ฌ๋ ๊ฒ์ด ํ์ํ๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ์ญ์์ค.
๋๋ ์ฌ์ ํ Kenneth๊ฐ ๊ธฐ๋ฅ ์ ์ง๋ก ์ธํด ์ด๊ฒ์ ๊ฑฐ๋ถํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ชจ๋ ๊ฒ์ด ์ข๋ค
iter_content
๋ฅผ ํ์ผ๋ฅ ๊ฐ์ฒด๋ก ๊ฐ์ธ๊ฑฐ๋- ํค๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ ์ ํ ๊ฒฝ์ฐ
response.raw
์์ถ์ ํด์ ํฉ๋๋ค.
๋ ๊ฐ์ง ์๋ฃจ์ ๋ชจ๋ ์์ ๋๊ธ์ ์์ผ๋ฉฐ ํ์๋ ๊ทํ๊ฐ ๊ฒ์ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์์ฒญ์ ์ง์ ํฌํจ๋์ง ์๋ ๊ฒ์ด ์ ๊ทธ๋ฌํ ๋ฌธ์ ์ ๋๊น?
์ฌ๊ธฐ์์ 100% ๋ช ํํ ํฉ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ฅ์ด ์ ์ง๋ ๋์ ์์ฒญ์ ๋ค์ด๊ฐ ๊ฐ๋ฅ์ฑ์ ์์ต๋๋ค. ๊ณ ์ฅ๋ ๊ฒ์ ์์ผ๋ฉฐ API๊ฐ ๊ทํ์ ์๊ตฌ์ ์๋ฒฝํ์ง ์์ต๋๋ค. ๊ณ ์ฅ๋ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ค์ํ ๊ฒ์ Kenneth๊ฐ ์ํ๋์ง ์ฌ๋ถ๋ฟ์ ๋๋ค. ์์ฒญ์ ๋ฏผ์ฃผ์ฃผ์๊ฐ ์๋๋ผ 1์ธ 1ํ์ ๋๋ค. Kenneth๋ ๋จ์์ด๊ณ ๊ทธ๋ ํฌํ๊ถ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Kenneth๋ 8๊ฐ์ ์ ์ ์ด ๋ฌธ์ ๋ฅผ ๋ซ์์ผ๋ฏ๋ก ๊ทธ๊ฐ ๊ทธ๊ฒ์ ์ํ์ง ์๋๋ค๋ ๊ฒ์ด ๊ฝค ๋ถ๋ช ํ ๊ฒ ๊ฐ์ต๋๋ค.
urllib3์ ๋ํ ๋ฒ๊ทธ ์ ๊ณ ๊ฐ ์์ฒญ์ API๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. ์ ์ด๋ ๊ทธ ์์ฒด๋ ์๋๋๋ค.
์์ถ๋์ง ์์ ํ์ผ ๊ฐ์ฒด๋ฅผ ํญ์ ๋ฐํํ๋๋ก urllib3์ ํจ์นํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ์ ์ ๋ก ํด๊ฒฐ๋ฉ๋๋ค(์ข์ ์๊ฐ์ ์๋๋๋ค).
์, ์๋ฃจ์ ๋ฒํธ 3(ํ ์คํธ๋์ง ์์)์ด ์์ต๋๋ค.
response.raw.read = functools.partial(response.raw.read, decode_content=True)
https://github.com/shazow/urllib3/blob/master/urllib3/response.py#L112 ์ฐธ์กฐ
ํฅ๋ฏธ๋กญ๋ค - ๋๋ ๊ทธ๊ฒ์ด ์ง๊ธ๊น์ง ์กด์ฌํ๋์ง ๋ชฐ๋์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ธฐ๋ฅ์ ํจ์ฌ ์ฝ๊ฒ ๋ํํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ์๋ํฉ๋๊น? ์ฆ, ์์ถ ํด์ ๊ธฐ๊ฐ ์ํ ์ ์ฅ ๋ฐ ์ฆ๋ถ์ ๋๊น? ์๋ฅผ ๋ค์ด, ๋ ๋ฒ์งธ read(123) ํธ์ถ์ ๋ ์ด์ gzip ํ์ผ์ ์ ํจํ ์์์ ๋ฐํํ์ง ์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ์๋ํฉ๋๊น? ์ฆ, ์์ถ ํด์ ๊ธฐ๊ฐ ์ํ ์ ์ฅ ๋ฐ ์ฆ๋ถ์ ๋๊น?
์ค, ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ ์คํธ๋ง์ ์ฝ์ง ์์๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ ๋ด ์ ์์ด ์์ต๋๋ค.
HTTPResponse.read
๊ฐ amt
๋ฐ decode_content
๋์์ ์๋ํ๋๋ก urllib3์ ํจ์นํฉ๋๋ค.read
๋ฉ์๋๋ฅผ ํจ์นํ๋ ๋์ response.raw.decode_content = True
๋ฅผ ์ํํ ์ ์์).decode_content=True
์์ iter_content
decode_content=True
๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์์ ์์ ํ ์์ถ ํด์ @Lukasa ๊ธฐ๋ฅ ์ ์ง๋ฅผ ์๋ฐํ์ง๋ ์์ ๊ฒ ๊ฐ์๋ฐ์?
@schlamar : ์์น์ ์ผ๋ก
์ด์จ๋ ์์ฒญ์ stream_decompress
๊ฐ ๊นจ์ก์ต๋๋ค: #1249
+1
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ด ๊ธฐ๋ฅ ์์ฒญ์ด ์๋ ๋์์ธ ๋ฒ๊ทธ์ธ ์ด์ ๋ ์ด๋ฏธ ์ค๋ช ํ์ต๋๋ค. ๊ธฐ์กด API๋ ์๋ชป๋ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๊ณ ์ฐ๊ฒฐ์ ํ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์๊ฒฉ ์ฌ์ดํธ์ ๋ฐ๋ผ ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ๋์ถํ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ ๊ฒฝ์จ์ผ ํฉ๋๋ค. ์ด๋ ํ์ฌ ์์ ์คํธ๋ฆผ ์ฝ๊ธฐ ์ง์์ ์ฌ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์ด๊ฒ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ์์ฒญ์ด ์๋๋ผ ์์๋ ๊ธฐ๋ฅ์ ์์ ํ๊ธฐ ์ํ ์์ฒญ์ ๋๋ค.