如何使用SPARQLWrapper处理Wikidata上的 "太多请求"?

问题描述 投票:0回答:1

我正在迭代一个列表 users 的约1000条,像这样。

def wikidata_user_lookup(id_str):
    q = f'''
        SELECT ?item ?itemLabel ?kind ?kindLabel
        WHERE 
        {{
            ?item p:P2002 ?twitter .
            ?item wdt:P31 ?kind .
            ?twitter pq:P6552 "{id_str}" .
            SERVICE wikibase:label {{ bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }}
        }}
    '''
    sparql.setQuery(q)
    sparql.setReturnFormat(JSON)
    results = sparql.query().convert()
    results_df = pd.io.json.json_normalize(results['results']['bindings'])
    return results_df

for user in users:
    res = wikidata_user_lookup(user)

所以我提交了大约1000个查询,一个接一个。据我所知,我并没有并行运行多个查询,所以这不应该被允许吗?我得到的是 HTTPError: HTTP Error 429: Too Many Requests. 处理这种情况的正确方法是什么?

python sparql wikidata sparqlwrapper
1个回答
1
投票

我建议阅读 查询限制 官方文件。

上面写着你可以运行。

  • 一个客户端(用户代理+IP)每60秒允许处理时间为60秒
  • 一个客户机每分钟可进行30次错误查询

因此你的1000个查询必须在一分钟内最多查询30个才能避开限制,并且使用不到60秒的处理时间。

由于你收到了429错误,根据上面链接的文档,你应该检查一下 Retry-After 头,并在进行更多查询之前等待指定的时间。

© www.soinside.com 2019 - 2024. All rights reserved.