
本文详解因请求参数误用导致循环中所有 api 响应都返回最后一个查询结果的常见错误,并提供修复方案、代码优化建议及最佳实践。
在使用 Wikimedia API 批量搜索词条时,一个典型陷阱是:循环中未将当前迭代变量传入请求参数,却错误地复用了整个列表(如 search_query)作为查询关键词。这会导致每次请求实际发送的都是相同的完整列表(例如 ['Esteghlal FC','Liverpool FC']),而 API 通常会以该字符串整体作为搜索词进行匹配——最终因语义模糊或默认行为,所有请求意外命中同一个高相关度条目(如 “Liverpool FC”),造成“所有结果都相同”的假象。
根本问题出现在这行代码中:
parameters = {'q': search_query, 'limit': number_of_results} # ❌ 错误:传入了整个列表应改为动态使用当前迭代项:
parameters = {'q': team, 'limit': number_of_results} # ✅ 正确:每次传入当前 team 字符串此外,还有两项关键优化可提升代码健壮性与可读性:
- URL 预构建:base_url + language_code + endpoint 在循环内重复拼接毫无必要,既低效又易出错。应提取到循环外一次性生成;
- 使用 f-string 替代字符串拼接:更清晰、安全,避免遗漏斜杠或拼接顺序错误。
✅ 优化后的完整示例:
import requests
# ✅ 提前构建固定 URL(仅含语言和端点)
base_url = "https://api.wikimedia.org/core/v1/wikipedia/"
language_code = "es"
endpoint = "/search/page"
url = f"{base_url}{language_code}{endpoint}" # 如:https://api.wikimedia.org/core/v1/wikipedia/es/search/page
# 请求配置
headers = {"User-Agent": "MyWikiApp (contact@example.com)"}
number_of_results = 1
# 查询列表与结果容器
teams = ["Esteghlal FC", "Liverpool FC"]
articles = []
# ✅ 循环中正确使用当前 team
for team in teams:
params = {"q": team, "limit": number_of_results}
response = requests.get(url, headers=headers, params=params)
# ⚠️ 生产环境务必添加基础错误处理
response.raise_for_status() # 抛出 HTTPError(如 404/500)
articles.append(response.json())
# 验证结果多样性
print(f"共获取 {len(articles)} 条响应")
for i, article in enumerate(articles):
page = article.get("pages", [{}])[0]
title = page.get("title", "N/A")
key = page.get("key", "N/A")
print(f"[{i+1}] 标题: '{title}' | Key: {key}")? 注意事项总结:
- 永远检查参数来源:循环中必须确保 params、data 或 json 负载使用的是当前迭代变量(team),而非外部列表(search_query);
- 启用错误处理:response.raise_for_status() 可及时捕获网络或 API 错误,避免静默失败;
- 遵守 User-Agent 规范:Wikimedia 强制要求真实、可联系的 User-Agent,否则请求可能被拒绝;
- 考虑速率限制:高频请求需添加 time.sleep() 或使用异步(如 aiohttp),避免触发 API 限流;
- 验证响应结构:API 返回可能为空("pages": []),解析前建议用 .get("pages", []) 防止 KeyError。
通过修正参数绑定逻辑并采纳上述工程实践,即可稳定获取每个查询词对应的独立搜索结果,彻底解决“Iterable 返回最后值”的问题。










