Python爬取TaskerNet数据触发KeyError: 'shares'的问题求助
问题分析与解决方案
错误原因
- URL格式化错误:带pageToken的请求中,你写了
{page_token}但未做字符串格式化处理,导致实际请求的URL里是字面量{page_token}而非传入的token值,API返回不符合预期的响应,自然没有shares字段。 - 递归无终止条件:当API返回最后一页数据后,可能不再包含
pageToken字段,此时继续递归调用会引发后续请求异常,进一步触发KeyError。 - 缺乏请求异常处理:未检查请求是否成功(比如状态码是否为200),如果请求失败,解析响应内容会得到无效JSON,同样会引发错误。
修正后的代码
import requests import json def taskernet(page_token=None): base_url = "https://taskernet.com/_ah/api/datashare/v1/shares/public" # 用字典管理URL参数,避免字符串拼接错误 params = {"a": 0, "tags": ""} if page_token: params["pageToken"] = page_token # 发送请求并处理异常 try: response = requests.get(base_url, params=params) response.raise_for_status() # 捕获HTTP状态码错误 data = response.json() # 直接解析JSON,替代json.loads(response.content) except requests.exceptions.RequestException as e: print(f"请求失败: {e}") return except json.JSONDecodeError: print("响应内容不是有效JSON") return # 安全检查shares字段 if "shares" not in data: print("响应中未找到shares字段") return shares = data["shares"] for share in shares: # 用get方法避免url字段缺失引发的KeyError print(share.get("url", "该条目无URL")) # 检查是否存在下一页token,有则继续递归 next_page_token = data.get("pageToken") if next_page_token: taskernet(next_page_token) taskernet()
修改说明
- 参数传递优化:用
params字典管理URL参数,彻底避免字符串拼接导致的格式错误,代码可读性更强。 - 异常捕获机制:覆盖请求失败、JSON解析失败的场景,避免程序直接崩溃,同时给出明确错误提示。
- 安全字段访问:用
data.get()和share.get()替代直接索引,避免因字段缺失触发KeyError;提前检查shares字段是否存在。 - 递归终止逻辑:仅当存在
pageToken时才发起下一页请求,避免无限递归。
内容的提问来源于stack exchange,提问作者SHDDSFFDSDSAF
相关产品推荐
相关产品推荐

