维基百科 All-Pages API 30 次请求后 returns 相同页面标题

Wikipedia All-Pages API after 30 requests returns same pages titles

我想通过 API.Each 响应包含 continue 键提取所有维基百科标题,该键用于获取下一个逻辑批次,但在 30 次请求后 continue 键开始重复这意味着我收到相同的页面。

我已经尝试了上面的以下代码和维基百科文档 https://www.mediawiki.org/wiki/API:Allpages


def get_response(self, url):
        resp = requests.get(url=url)
        return resp.json()

appcontinue = []

url = 'https://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&aplimit=500'
json_resp = self.get_response(url)
next_batch = json_resp["continue"]["apcontinue"]
url +='&apcontinue=' + next_batch
appcontinue.append(next_batch)

while True:
    json_resp = self.get_response(url)
    url = url.replace(next_batch, json_resp["continue"]["apcontinue"])
    next_batch = json_resp["continue"]["apcontinue"]
    appcontinue.append(next_batch)

我预计会收到超过 10000 个唯一的 continue 密钥,因为一个响应最多可以包含 500 个标题。 维基百科有 5,673,237 篇英文文章。

实际响应。我做了 600 多个请求,但只有 30 个唯一的 continue 键。

json_resp["continue"]包含两对值,一对是apcontinue,一对是continue。您应该将它们都添加到您的查询中。有关详细信息,请参阅 https://www.mediawiki.org/wiki/API:Query#Continuing_queries

此外,我认为使用 request.getparams 参数比手动替换连续值更容易。也许是这样的:

import requests

def get_response(url, params):
    resp = requests.get(url, params)
    return resp.json()


url = 'https://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&aplimit=500'

params = {}
while True:
    json_resp = get_response(url, params)
    params = json_resp["continue"]
    ...