调用API时出现requests.exceptions.ChunkedEncodingError问题求助
解决调用法国OpenFoodFacts API时出现的ChunkedEncodingError问题
嘿,这个错误确实大概率和网络有关,但也有其他可能,咱们一步步捋:
首先,先看你代码里的URL——https://fr.openfoodfacts.org/categories&json=1,这里参数分隔符用错了,应该是?而不是&,正确的URL应该是https://fr.openfoodfacts.org/categories?json=1。虽然你说昨天能运行,但服务器端可能对参数格式的兼容性有调整,这个小问题先修正试试。
接下来回到你问的网络问题:requests.exceptions.ChunkedEncodingError本质是请求过程中连接断开了,服务器发送的分块数据没传完就中断了,常见原因包括:
- 你的网络不稳定:从路径看你用的是树莓派,WiFi信号弱、ISP临时波动都可能导致中途丢包,昨天能正常运行不代表今天网络没问题;
- 服务器端临时故障/限流:OpenFoodFacts是公益项目,服务器可能偶尔负载过高,或者对你的请求频率做了限制,导致中途断开连接;
- 缺少超时设置:你的请求没有设置超时,如果服务器响应慢,连接可能在等待过程中被中断。
给你几个解决办法:
- 修复URL参数:把
&json=1改成?json=1,确保请求格式正确; - 添加重试机制:用requests的重试适配器,自动重试失败的请求,避免单次网络波动导致失败;
- 设置超时时间:给
requests.get加上timeout参数,比如timeout=10,避免无限等待; - 测试网络连通性:用
ping fr.openfoodfacts.org或者curl https://fr.openfoodfacts.org/categories?json=1测试一下,看看能不能正常获取数据。
这里是修改后的代码示例,加了重试和超时:
import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def categories_list(): categories = [] # 创建带重试的session session = requests.Session() retry = Retry( total=3, # 总重试次数 backoff_factor=1, # 重试间隔时间(1s, 2s, 4s...) status_forcelist=[429, 500, 502, 503, 504] # 遇到这些状态码重试 ) adapter = HTTPAdapter(max_retries=retry) session.mount("https://", adapter) try: # 修复URL,添加超时 response = session.get("https://fr.openfoodfacts.org/categories?json=1", timeout=10) response.raise_for_status() # 抛出HTTP错误状态码的异常 data = response.json() i = 0 for category in data["tags"]: if category["products"] >= 1200: name = category["name"] categories.append(name) i += 1 print(f"It's ok, imported {i}") except requests.exceptions.RequestException as e: print(f"请求出错: {e}") categories_list()
你可以先试试修复URL,如果还是不行,再用带重试的版本,同时检查一下你的树莓派网络连接是否稳定。
内容的提问来源于stack exchange,提问作者HomeAlone
相关产品推荐
相关产品推荐

