You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取TaskerNet数据触发KeyError: 'shares'的问题求助

问题分析与解决方案

错误原因

  1. URL格式化错误:带pageToken的请求中,你写了{page_token}但未做字符串格式化处理,导致实际请求的URL里是字面量{page_token}而非传入的token值,API返回不符合预期的响应,自然没有shares字段。
  2. 递归无终止条件:当API返回最后一页数据后,可能不再包含pageToken字段,此时继续递归调用会引发后续请求异常,进一步触发KeyError。
  3. 缺乏请求异常处理:未检查请求是否成功(比如状态码是否为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:54:57