写了几行平平无奇的代码,想要获取json数据
import requests
url=‘https://image.baidu.com/search/acjson?tn=resultjson_com&logid=10924524703716171320&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E9%87%91%E5%9F%8E%E6%AD%A6&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=©right=&word=%E9%87%91%E5%9F%8E%E6%AD%A6&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&cg=star&pn=60&rn=30&gsm=3c&1635587116468=’
resp=requests.get(url)
json_data=resp.json()
然后就报错了:requests.exceptions.TooManyRedirects: Exceeded 30 redirects.
根据网友的解答加上了allow_redirects=False
因为错误显示重定向超过三十个,因此allow_redirects=False,关闭重定向
此时代码变成了:
import requests
url=‘https://image.baidu.com/search/acjson?tn=resultjson_com&logid=10924524703716171320&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E9%87%91%E5%9F%8E%E6%AD%A6&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=©right=&word=%E9%87%91%E5%9F%8E%E6%AD%A6&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&cg=star&pn=60&rn=30&gsm=3c&1635587116468=’
resp=requests.get(url,allow_redirects=False)
json_data=resp.json()
然而还是报错了:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
看来得解码,于是:
resp=requests.get(url,allow_redirects=False).content.decode('utf-8')
又报错:因为解码后不再是response了,所以不具有json()方法
因此问题不是出在解码上,而是get()并没有成功运行得到response。
真正的问题在关闭了重定向以后,页面不再跳转。
简单来说就是没有与服务器建立会话,页面重定向成了环形的死循环。即你的原始URL重定向一个没有新的URL B,其重定向到C,它重定向到B,等等。
文章的结尾提到加请求头来保持会话的持久性。
http头部没有编码方式,requests默认使用自己的编码方式。也是很任性,具体关于requests的乱码行为的出现原因及解决方案,在这篇博客有详细介绍,可以看一下。
https://www.cnblogs.com/billyzh/p/6148066.html。
正确的代码:
import requests
url=‘https://image.baidu.com/search/acjson?tn=resultjson_com&logid=10924524703716171320&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E9%87%91%E5%9F%8E%E6%AD%A6&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=©right=&word=%E9%87%91%E5%9F%8E%E6%AD%A6&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&cg=star&pn=60&rn=30&gsm=3c&1635587116468=’
resp=requests.get(url,allow_redirects=False,headers=headers)
json_data=resp.json()