Wikipedia All-Pages API после 30 запросов возвращает одинаковые заголовки страниц - PullRequest
0 голосов
/ 12 мая 2019

Я хочу извлечь все заголовки Википедии через API. Каждый ответ содержит ключ 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 уникальных продолжить ключи, так как один ответ может содержать не более 500 заголовков.В Википедии есть 5 673 237 статей на английском языке.

Фактический ответ.Я сделал более 600 запросов, и есть только 30 уникальных continue ключей.

1 Ответ

0 голосов
/ 12 мая 2019

json_resp["continue"] содержит две пары значений, одна из которых apcontinue, а другая - continue. Вы должны добавить их обоих к вашему запросу. Подробнее см. https://www.mediawiki.org/wiki/API:Query#Continuing_queries.

Кроме того, я думаю, что будет проще использовать параметр params request.get вместо ручной замены значений продолжения. Возможно, что-то вроде этого:

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"]
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...