17370845950

如何正确批量调用维基百科搜索 API 避免重复返回同一结果

本文详解因请求参数误用导致循环中所有 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 字符串

此外,还有两项关键优化可提升代码健壮性与可读性:

  1. URL 预构建:base_url + language_code + endpoint 在循环内重复拼接毫无必要,既低效又易出错。应提取到循环外一次性生成;
  2. 使用 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 返回最后值”的问题。