Python - Requests - JSONDecodeError



我有这个代码:

import requests
r = requests.get('https://www.instagram.com/p/CJDxE7Yp5Oj/?__a=1')
data = r.json()['graphql']['shortcode_media']

为什么我会出现这样的错误?

C:ProgramDataAnaconda3envstestpython.exe C:/Users/Solba/PycharmProjects/test/main.py  
Traceback (most recent call last):  
File "C:/Users/Solba/PycharmProjects/test/main.py", line 4, in <module>  
data = r.json()  
File "C:ProgramDataAnaconda3envstestlibsite-packagesrequestsmodels.py", line 900, in json  
return complexjson.loads(self.text, **kwargs)  
File "C:ProgramDataAnaconda3envstestlibjson__init__.py", line 357, in loads  
return _default_decoder.decode(s)  
File "C:ProgramDataAnaconda3envstestlibjsondecoder.py", line 337, in decode  
obj, end = self.raw_decode(s, idx=_w(s, 0).end())  
File "C:ProgramDataAnaconda3envstestlibjsondecoder.py", line 355, in raw_decode  
raise JSONDecodeError("Expecting value", s, err.value) from None  
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)  

Process finished with exit code 1  

r.json()期望API返回一个JSON字符串。API应该明确表示它通过响应头使用JSON进行响应。

在这种情况下,您请求的URL要么没有使用正确的JSON响应,要么没有明确表示使用JSON响应。

您可以首先通过以下方式检查URL发送的响应:

data = r.text
print(data)

如果响应可以被视为JSON字符串,那么您可以使用处理它

import json
data = json.loads(r.text)

注:您还可以检查content-typeAccept标头,以确保请求和响应是所需的数据类型

原因是响应不是返回JSON,而是返回整个HTML页面。试试r.text而不是r.json()...,然后从那里做你想做的任何事情。

如果您不确定它返回的内容类型:

h = requests.head('https://www.instagram.com/p/CJDxE7Yp5Oj/?__a=1')
header = h.headers
contentType = header.get('content-type')
print(contentType)

根据您的URL,它会返回text/html

或者,您可以尝试在请求中添加User-Agent——这是为了模拟请求,使其看起来像来自浏览器,而不是脚本。

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/46.0.2490.80'
}
r = requests.get('https://www.instagram.com/p/CJDxE7Yp5Oj/?__a=1', headers=headers)
data = r.json()

最新更新