求大佬帮我看看我这个用 urlopen().read()获取的 bytes 串是不是有问题啊

2017-03-23 21:10:19 +08:00
 grimpil

之前偶然发现了这样一个页面,
http://www.angio.net/pi/
可以用来查找任意一串数字在圆周率小数点后两亿位中的具体位置,感觉还挺好玩的
然后我找到了它的请求接口
http://www.angio.net/newpi/piquery?q=666666666

如果在浏览器里直接输入上面的 url ,可以得到下面的 json
{"et":66874,"r":[{"k":"666666666","st":0,"status":"found","p":45681781,"db":"86731050497515079094","da":"71734856294979983444","c":1}],"status":"OK"}
这是正常的

但是如果使用下面代码获取:

url = 'http://www.angio.net/newpi/piquery?q=666666666'
#这里 headers 是完全复制了浏览器里的
req = urllib.request.Request(url, None, headers)
response = urllib.request.urlopen(req).read()

最终 response 的值为:

b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03L\x8c1\x0e\xc20\x10\xc0\xfe\xe29C\x8e\r\xb9\xfb\x02\x03\x0f@\x0c\x85\xc2\x82\x04\x88\xb6S\xc5\xdfQ\x07$\xbcx\xb0\xe4\x95\xebL45)\x897q\\xb9\x13\xb4\x1f$\xa6\x99\xc8\x9b\x86y\x99\x08n\xcf\xe51\x92x\x11Z[\x17\xeb\x92\x18\xcf\x04\xbdY\x91\\xb3\xbaU\xa9\xd9<\xbb\x92\x18\x07\x02\x13+\xdak\xdb\xb9\xba\xb9\xf7\xa2\xba\xb5\x0b!\x9f\xd3\xdf\xfd\xb0\xe7\x0b\x00\x00\xff\xff\xaa\x05\x00\x00\x00\xff\xff\x03\x00B\xb8\x0e\x84\x95\x00\x00\x00'

此时如果对 response 执行 decode('utf-8')会报错。

仔细一看,这个 bytes 串好像不对劲,里面还有特殊符号,正常的 bytes 串不应该这样吧

请教一下各位,这种情况应该怎么处理,怎么样才能获取到正常的结果

2192 次点击
所在节点    Python
3 条回复
weyou
2017-03-23 21:41:44 +08:00
回的 gzip 压缩过的没解压?
grimpil
2017-03-23 22:26:45 +08:00
@weyou 还真是这个原因,非常感谢!

又加了一句解压缩之后就正常了
gzip.decompress(response).decode("utf-8")
weyou
2017-03-23 22:36:38 +08:00
@grimpil 其实你没必要自己解压,可以先试试去掉 header 里 Accept-Encoding 的压缩选项,只保留 identity ,服务器应该就会回明文了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/349851

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX