我正在尝试从 Python 的 requests 模块调用 API。在邮递员上,返回的响应标头中的 Content-Type 是
application/json; charset=utf-8
,响应 json 数据是我期望的样子。但是,在 python 上的 API 的 get 方法之后运行
response.json()
会抛出错误
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
希望有人能帮助解释为什么会发生这种情况。
Postman 返回的内容的前几行:
{
"Pagination": {
"query": "",
"index": "PRODUCTION_PG_FEATURED_DESC",
"limit": "100",
"page": 1,
"total": 8556,
"lastPage": "/api/v3/browse?_tags=adidas&page=10&productCategory=sneakers&resultsPerPage=100",
"sort": [
"featured"
],
"order": [
"DESC"
],
"currentPage": "/api/v3/browse?_tags=adidas&page=1&productCategory=sneakers&resultsPerPage=100",
"nextPage": "/api/v3/browse?_tags=adidas&page=2&productCategory=sneakers&resultsPerPage=100",
"previousPage": null
},
我的代码块:
import requests
productsAPI = 'https://stockx.com/api/browse?_tags=nike&productCategory=sneakers&page=1&resultsPerPage=100'
headers = {"accept": "*/*", "accept-language": "en-US,en;q=0.9", "accept-encoding" : "gzip, deflate, br","User-Agent" :"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36",
"Connection" : "keep-alive"}
response = requests.get(productsAPI, headers = headers)
print(response.text)
if response.status_code != 200:
print(response.status_code)
try:
data = response.json()
except:
print('fail')
print(data["Facets"]["brand"])
问题出在尝试访问
response.json()
数据的方式上。虽然响应看起来像 JSON,但出现
JSONDecodeError
表明实际返回的可能不是有效的 JSON。
正在遇到错误,因为正在尝试在不存在的字典中访问一个键。
response.json()
提供的 JSON 数据不包含名为
'Facets'
的顶级键。因此,
data["Facets"]["brand"]
会导致错误。
可以通过在
try...except
块中打印
data
来进行调试并检查
response.json()
的结构。
调试步骤:
-
打印
data
: 在try...except
块中,在引发错误的行之前添加print(data)
。这将显示从response.json()
返回的实际 Python 数据结构。python try: data = response.json() print(data) # 打印数据以检查其结构 print(data["Facets"]["brand"]) except: print('fail')
- 检查结构: 根据打印的输出,检查实际键和嵌套结构。查找包含“brand”值的正确路径。
-
更正访问方式:
根据正确的结构更新代码,以访问所需的数据。例如,如果“brand”位于名为
'products'
的列表中的字典中,则可以使用循环访问它:python for product in data['products']: print(product['brand'])
其他提示:
-
状态码检查:
虽然正在检查状态码
200
,但最好处理其他成功代码(如201 Created
)并为不同的错误代码提供更具体的错误消息。 -
错误处理:
考虑使用更具体的异常处理。不要捕获通用的
except
,而是捕获json.JSONDecodeError
以仅处理 JSON 解码错误,并允许其他错误引发。
通过遵循这些步骤,可以调试代码并从
response.json()
中正确提取“brand”数据。