循环中调用LinkedIn API报'dict对象不可调用'错误如何解决
问题排查与解决
错误根因
- 你遇到的
TypeError: 'dict' object is not callable属于典型的变量名重复覆盖问题,和是否放入循环没有直接关系:- 初始状态下
headers是一个用于生成请求头的函数,因此第一次执行headers(access_token)可以正常调用,返回字典格式的请求头 - 你将函数返回的字典结果直接赋值给了同名变量
headers,执行完这一步后,原本的headers函数就被覆盖成了字典对象 - 进入循环后第二次执行
headers(access_token)时,实际是尝试将字典当成函数调用,自然抛出类型错误
- 初始状态下
- 你后续修改的
headers.get(access_token)、headers[access_token]都不符合逻辑:你的需求是用access_token生成请求头,不是从请求头字典中读取access_token,自然无法解决问题 - 你贴出的调整后代码还存在另一个变量名错误:你将生成的请求头存储在
headers变量中,但发请求时传入的是未定义的auth_headers,运行会触发NameError
修正方案
方案1:单ID遍历请求(适配你现有写法,改动最小)
请求头只需要生成一次,无需放入循环,同时注意不要用函数名作为存储结果的变量名,避免覆盖:
import requests import json shlink = "https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn%3Ali%3Aorganization%3A77487&shares=List(urn%3Ali%3Ashare%3A{})" shares = [] token = auth(credentials) # 用不同名的变量存储生成的请求头,避免覆盖原函数 auth_headers = fheaders(token) for shid in shids: r = shlink.format(shid) res = requests.get(r, headers=auth_headers) # 增加响应状态判断,避免接口报错导致逻辑中断 if res.status_code == 200: share_stats = res.json() shares.extend(share_stats["elements"]) else: print(f"ID {shid} 请求失败,状态码:{res.status_code}") # 导出为JSON文件 with open("linkedin_share_stats.json", "w", encoding="utf-8") as f: json.dump(shares, f, ensure_ascii=False, indent=2)
方案2:批量ID请求(更高效,降低触发接口限流概率)
LinkedIn接口支持传入多个ID批量查询,可将ID拆分批次请求,大幅减少请求次数:
import requests import json base_url = "https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn%3Ali%3Aorganization%3A77487&ugcPosts=List({})" shares = [] token = auth(credentials) auth_headers = fheaders(token) # 可根据接口规则调整批次大小,避免URL过长 batch_size = 20 for i in range(0, len(shids), batch_size): batch = shids[i:i+batch_size] id_str = ",".join([f"urn%3Ali%3AugcPost%3A{shid}" for shid in batch]) r = base_url.format(id_str) res = requests.get(r, headers=auth_headers) if res.status_code == 200: share_stats = res.json() shares.extend(share_stats["elements"]) else: print(f"批次{i//batch_size + 1} 请求失败,状态码:{res.status_code}") # 导出为JSON文件 with open("linkedin_share_stats.json", "w", encoding="utf-8") as f: json.dump(shares, f, ensure_ascii=False, indent=2)
内容的提问来源于stack exchange,提问作者Piotr Chmurzynski
相关产品推荐
相关产品推荐

