如何使用 SPARQLWrapper 处理 Wikidata 上的“过多请求”?

the*_*man 1 python sparql wikidata sparqlwrapper

我正在遍历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)
Run Code Online (Sandbox Code Playgroud)

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

Hit*_*bat 5

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

它指出您可以运行:

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

因此,您的 1000 个查询必须在一分钟内最多 30 个,以避免限制,并且使用少于 60 秒的处理时间。

由于您收到 429 错误,根据上面链接的文档,您应该检查Retry-After标题并等待指定的时间,然后再进行更多查询。

  • 您可以考虑使用 VALUES 关键字。将 wikidata_user_lookup 的参数从用户更改为用户列表。然后,将“{id_str}”分配给变量 ?user,然后添加以下行: VALUES ?user {{list_of_users}} 您可能需要先将列表转换为字符串,然后去掉 之间的任何逗号项目。话虽如此,查询可能会很慢,但值得一试。 (2认同)