如何用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
相关产品推荐
相关产品推荐

