
本文详解为何循环请求 wikipedia api 时所有响应都返回最后一个查询的结果,并提供修复方案:关键在于将循环变量 `team` 正确传入请求参数,而非错误地重复使用整个列表 `search_query`。
在使用 Wikimedia API 批量搜索时,一个常见但隐蔽的错误是:在循环中未将当前迭代项(如 team)作为查询参数传入,而是误用了原始列表(如 search_query)本身。这会导致每次请求实际发送的都是相同的完整列表(例如 ['Esteghlal FC','Liverpool FC']),而 Wikipedia 搜索接口会将其视为一个复合关键词进行匹配——通常仅返回与最后一个词(或最匹配项)相关的结果,且因 URL 参数编码后语义模糊,极易造成多次响应内容完全一致。
原始代码中的核心错误如下:
parameters = {'q': search_query, 'limit': number_of_results} # ❌ 错误:传入整个列表应修正为:
parameters = {'q': team, 'limit': number_of_results} # ✅ 正确:传入当前迭代字符串此外,还有两项重要优化建议可提升代码健壮性与可读性:
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}"
# ✅ 请求头与参数配置
headers = {"User-Agent": "MyWikiApp (contact@example.com)"}
number_of_results = 1
# ✅ 待搜索的球队列表
teams = ["Esteghlal FC", "Liverpool FC"]
# ✅ 批量请求并收集结果
articles = []
for team in teams:
params = {"q": team, "limit": number_of_results} # ? 关键修复:用 team 而非 search_query
response = requests.get(url, headers=headers, params=params)
response.raise_for_status() # ✅ 建议添加异常检查,防止静默失败
articles.append(response.json())
# ✅ 验证结果多样性
print(f"共获取 {len(articles)} 条响应")
for i, article in enumerate(articles, 1):
page = article.get("pages", [{}])[0]
title = page.get("title", "N/A")
key = page.get("key", "N/A")
print(f"[{i}] 标题: {title!r} | Key: {key!r}")? 注意事项:
- 始终校验 response.status_code == 200 或使用 response.raise_for_status(),避免因限流、认证失败等导致空/错误响应被误存;
- Wikipedia 搜索对大小写和空格较敏感,必要时可对 team 进行标准化(如 .strip()、.replace(' ', '_'));
- 若需高并发,应添加合理延迟(如 time.sleep(0.1))并遵守 Wikimedia User-Agent policy;
- params 中的 q 值必须为字符串,传入列表会触发 TypeError 或被意外序列化(取决于 requests 版本),务必确保类型安全。
通过以上修正,即可确保每次请求精准对应目标关键词,彻底解决“所有元素返回相同结果”的问题,实现稳定、可预期的批量 API 调用。










