python 2.7
对requests获取的原始数据,有两种获取形式,一个是r.content一个是r.text。
二者的区别在于content返回的是byte型数据,而text返回的是Unicode数据,也就是说text对原始数据进行的特殊的编码,而这个编码方式是基于对原始数据的猜测(响应头),
text一般用于返回的文本
content的一般用于对返回的其他数据类型
但是对于某些网站的中文用text可能会导致返回乱码,所以最好是使用content然后自己进行重新编码。
requests手册中的描述更加的详细
------------------以下为转载手册内容--------------------------
响应内容
我们能读取服务器响应的内容。再次以 GitHub 时间线为例:
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.text
# u'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。
请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用r.encoding
属性来改变它:
>>> r.encoding'utf-8'
>>> r.encoding = 'ISO-8859-1'
如果你改变了编码,每当你访问 r.text ,Request 都将会使用 r.encoding的新值。你可能希望在使用特殊逻辑计算出文本的编码的情况下来修改编码。比如 HTTP 和 XML 自身可以指定编码。这样的话,你应该使用 r.content来找到编码,然后设置 r.encoding为相应的编码。这样就能使用正确的编码解析 r.text
了。
在你需要的情况下,Requests 也可以使用定制的编码。如果你创建了自己的编码,并使用 codecs
模块进行注册,你就可以轻松地使用这个解码器名称作为 r.encoding
的值, 然后由 Requests 来为你处理编码。
二进制响应内容
你也能以字节的方式访问请求响应体,对于非文本请求:
>>> r.contentb
# u'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requests 会自动为你解码 gzip
和 deflate
传输编码的响应数据。
例如,以请求返回的二进制数据创建一张图片,你可以使用如下代码:
>>> from PIL import Image
>>> from io import BytesIO
>>> i = Image.open(BytesIO(r.content))
JSON 响应内容
Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
# u'[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...
如果 JSON 解码失败, r.json
就会抛出一个异常。例如,相应内容是 401 (Unauthorized),尝试访问 r.json
将会抛出 ValueError: No JSON object could be decoded
异常。
原始响应内容
在罕见的情况下,你可能想获取来自服务器的原始套接字响应,那么你可以访问 r.raw
。 如果你确实想这么干,那请你确保在初始请求中设置了 stream=True
。具体你可以这么做:
>>> r = requests.get('https://github.com/timeline.json', stream=True)
>>> r.raw<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
但一般情况下,你应该以下面的模式将文本流保存到文件:
with open(filename, 'wb') as fd: for chunk in r.iter_content(chunk_size): fd.write(chunk)
使用 Response.iter_content
将会处理大量你直接使用 Response.raw
不得不处理的。 当流下载时,上面是优先推荐的获取内容方式。