从请求中获取字节响应

Posted

技术标签:

【中文标题】从请求中获取字节响应【英文标题】:Getting bytes response from request 【发布时间】:2019-05-24 21:11:41 【问题描述】:

我正在尝试在 Python 3 上向应返回 JSON 的 url 执行请求。相反,它返回了我无法转换的字节序列。为什么我会收到这种类型的响应以及如何将其转换为人类可读的数据?

下面是我的代码的 sn-p:

headers = 
headers['Host']= 'XXXXX' # hidden
headers['Connection']= 'keep-alive'
headers['Content-Length']= '122'
headers['Accept']= 'application/json, text/javascript, */*; q=0.01'
headers['Origin']= 'XXXXX' # hidden
headers['X-Requested-With']= 'XMLHttpRequest'
headers['User-Agent']= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
headers['Content-Type']= 'application/json'
headers['Referer']= 'XXXXX' # hidden
headers['Accept-Encoding']= 'gzip, deflate, br'
headers['Accept-Language']= 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7'
headers['Cookie'] = 'XXXXX' # hidden

try:

    req = request.Request(url,post_data,headers)
    x = request.urlopen(req)
    print(x.read())
    print(x.info())

except Exception as e:
    print(e)

收到的回复如下:

    b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03L\x8fAK\x031\x10\x85\xff\xca0\x07Q\x88\x899(\xb2\xd0\x93\xf4\xe2\xa1-z]\x90\xecf\xb6\x1b\xd9d\xca$-H\xe9\x7f7\x91\x8a^\x86\x997\xef\x1b\xde\x9c\xf1D\x92\x03\'\xec\xd0j\x8b\nI\x84\x05\xbb\xf3_\x13)g\xb7\xa7\xea\x88n\x99X"yx\xdfn \x17\ti\xaf Q(3\t8\x11\xf7\xa5\x80\x87O\x1aK\x95\x8fq QW\x1bp5\x14\x8e\xaaV\x18g\'n,\x95\xe1i\xcaT\xe0\x01n\x07\xaa\xb7\t\xfa\xdfD\xab\x9a\xe7&R\x99\xd9\xaf\xd6Z\xeb\x1e\xef\x1aj\x8eYL\xae<\x99\x03\xc9\xf2hN\x94<\xcbG\x1bL\x8b\xa5\x0f\x11\x96\x90\x08\xec\xd3\xb3\xee\x13^\x14&\x17[\xfc\xb6\xdb\xbd\xac\x7f\x1eS\xff\xfe\xda9\xc9\x04t\xd5G\xf6M\xb4\x8d\x0c\x1e\xbb\xf9\x06\x00\x00\xff\xff\x03\x00\xc4\xd9gg\'\x01\x00\x00'
Date: Wed, 26 Dec 2018 16:46:48 GMT
Server: Apache
Strict-Transport-Security: max-age=16070400
X-UA-Compatible: IE=Edge,chrome=1, IE=Edge,chrome=1
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
Content-Encoding: gzip
X-Frame-Options: SAMEORIGIN
Connection: close
Transfer-Encoding: chunked

【问题讨论】:

使用默认编码发送怎么样?数据似乎被压缩了。使用Accept-Encoding:*。参考:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 【参考方案1】:

好像被压缩了:Content-Encoding: gzip.

解压后使用json.decode

例子:

import zlib
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)

另一种选择 - 告诉服务器您对压缩内容感到不满。从 Accept-Encoding 请求标头中删除 gzip 和可能的其他类型的压缩

【讨论】:

【参考方案2】:

试试这样的

import requests

r = requests.post('your URL',data=YourData)
r.json()

【讨论】:

谢谢,普拉卡什。但我只使用以下模块: from urllib import request,parse

以上是关于从请求中获取字节响应的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Axios 获取请求中获取响应头参数?

如何从 fetch javascript 请求的响应中获取数据

如何获取响应头信息

如何从 curl 请求中获取响应时间(通过命令行)

django 获取request请求对象及response响应对象中的各种属性值

如何在 laravel 中使用不记名令牌从 api 请求中获取响应?