维基数据禁止访问

Wikidata Forbidden Access

我试图 运行 使用 Python 请求和多处理 (number_workers = 8) 进行一些维基数据查询,现在我收到代码 403(禁止访问)。有什么限制吗?我已经看到 我应该将自己限制为 5 个并发查询,但即使有一个查询我现在也没有通过 Python 获得任何结果。它曾经有效。

这个访问禁止是暂时的还是我永远被列入黑名单? :(

我在他们的文档中没有看到任何限制,所以我不知道我正在做一些会被禁止的事情。

有谁知道是什么情况吗?

wikidata_url = 'https://query.wikidata.org/sparql'
headers = {'User-Agent': 'Chrome/77.0.3865.90'}
r = requests.get(wikidata_url, params={'format': 'json', 'query': query, 'headers': headers})

修复后编辑: 原来我是暂时被禁服了。我已经更改了我的用户代理以遵循 recommended template 并等待我的错误被删除。问题是我忽略了错误 429,它告诉我我已经超出了允许的限制,我必须在一段时间(几秒钟)后重试。这导致了我的错误 403.

我试图通过编写以下考虑到这一点的代码来纠正由于缺乏经验而导致的错误。我添加此编辑是因为它可能对其他人有用。

def get_delay(date):
    try:
        date = datetime.datetime.strptime(date, '%a, %d %b %Y %H:%M:%S GMT')
        timeout = int((date - datetime.datetime.now()).total_seconds())
    except ValueError:
        timeout = int(date)
    return timeout


def make_request(params):
    r = requests.get(wikidata_url, params)
    print(r.status_code)
    if r.status_code == 200:
        if r.json()['results']['bindings']:
            return r.json()
        else:
            return None
    if r.status_code == 500:
        return None
    if r.status_code == 403:
        return None
    if r.status_code == 429:
        timeout = get_delay(r.headers['retry-after'])
        print('Timeout {} m {} s'.format(timeout // 60, timeout % 60))
        time.sleep(timeout)
        make_request(params)

访问限制是 tightened up in 2019 to try and cope with overloading of the query servers. The generic python-request user agent was blocked 作为其中的一部分(我不知道 if/when 这已恢复)。

根据 the Query Service manual,当前规则似乎是:

  • 一个客户端(用户代理 + IP)每 60 秒允许 60 秒的处理时间
  • 一个客户端每分钟允许 30 个错误查询
  • 不遵守the User-Agent policy的客户可能会被完全阻止
  • 对服务的访问限制为每个 IP 5 个并行查询[这可能会改变]

我建议再试一次,运行 使用更详细的用户代理进行单个查询,看看是否可行。