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

如何用srsearch向Wikidata API批量提交多搜索词(Python实现)

在Wikidata批量搜索术语的优化方案

问题描述

我尝试在Wikidata上搜索多个术语,再通过Python本地解析结果。目前采用遍历术语列表的方式,运行以下代码:

import requests 

term_list = ["term a", "term b"]

for search_term in term_list:
    base_url = "https://www.wikidata.org/w/api.php"
    payload = {
        "action": "query",
        "list": "search",
        "srsearch": search_term,
        "language": "en",
        "format": "json",
        "origin": "*",
    }
    res = requests.get(base_url, params=payload)

但每次迭代都会发起新请求,耗时较长。请问是否可以同时向Wikidata API发送一批术语,以节省时间并减少API资源消耗?

编辑
经研究发现,Wikidata API目前不支持直接批量提交搜索术语的功能,相关需求曾被提交但尚未实现。若有更多相关信息,将十分有用。

可行优化方案

虽然Wikidata API不支持直接批量提交搜索术语,但可以通过以下方式减少请求耗时和资源消耗:

  • 并行请求:使用Python的concurrent.futures模块同时发起多个请求,避免串行等待。示例代码:
import requests
from concurrent.futures import ThreadPoolExecutor

term_list = ["term a", "term b"]
base_url = "https://www.wikidata.org/w/api.php"

def search_term(term):
    payload = {
        "action": "query",
        "list": "search",
        "srsearch": term,
        "language": "en",
        "format": "json",
        "origin": "*",
    }
    return requests.get(base_url, params=payload).json()

with ThreadPoolExecutor(max_workers=5) as executor:
    results = list(executor.map(search_term, term_list))

# 处理返回的结果列表
for term, result in zip(term_list, results):
    print(f"搜索结果({term}):", result)

注意:max_workers不要设置过大,避免触发API限流。

  • 利用Wikidata的SPARQL端点:如果搜索需求可以转化为SPARQL查询,可通过一次SPARQL请求匹配多个术语。比如按标签搜索多个术语:
import requests

term_list = ["term a", "term b"]
sparql_query = f"""
SELECT ?item ?itemLabel WHERE {{
  VALUES ?label {{ {' '.join([f'"{t}"@en' for t in term_list])} }}
  ?item rdfs:label ?label.
  SERVICE wikibase:label {{ bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }}
}}
"""

payload = {
    "query": sparql_query,
    "format": "json"
}
res = requests.get("https://query.wikidata.org/sparql", params=payload)
results = res.json()

这种方式适合精准匹配标签的场景,返回结果结构和搜索API略有不同,但能一次性获取多个术语的匹配项。

  • 遵守API限流规则:Wikidata API默认有请求频率限制,并行请求时需控制速率,避免被封禁。可以添加简单的延迟,或使用requests.adapters.HTTPAdapter设置重试机制。

内容的提问来源于stack exchange,提问作者Tiago Lubiana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:25:20