История изменений Википедии с использованием pywikibot - PullRequest
1 голос
/ 02 августа 2020

Я хочу собрать все данные истории ревизий сразу. Pywikibot page.revisions () не имеет параметра для получения измененного количества байтов. Он дает мне все данные, которые мне нужны, за исключением количества измененных байтов.

Как мне изменить количество байтов?

например: для главной страницы статьи история изменений здесь : скриншот истории

Мой текущий код:

import pywikibot

site = pywikibot.Site("en", "wikipedia")
page = pywikibot.Page(site, "Main_Page")
revs = page.revisions()

Отображается только 1 вывод:

first entry:  {'revid': 969106986, '_text': None, 'timestamp': Timestamp(2020, 7, 23, 12, 44, 21), 'user': 'The Blade of the Northern Lights', 'anon': False, 'comment': 'OK, there we go.', 'minor': False, 'rollbacktoken': None, '_parent_id': 969106918, '_content_model': None, '_sha1': 'eb9e0167aabe4145be44305b3775837a37683119', 'slots': {'main': {'contentmodel': 'wikitext'}}}

I необходимо изменить количество байтов, которое отображается как {+1, -1, +1, -2} в ссылке на историю изменений, которую также можно увидеть на скриншоте истории выше.

1 Ответ

0 голосов
/ 02 августа 2020

Pywikibot использует API MW для получения ревизий .

API не предоставляет измененный размер для ревизий.

Вместо изменения размера API предоставляет * Опция 1007 * для параметра rvprop. Используя это, можно было бы легко рассчитать изменения размера.

К сожалению, pywikibot не извлекает size для изменений.

Вы можете отправить отчет об ошибке для команды pywikibot .

Можно напрямую использовать класс PropertyGenerator для получения ревизий с желаемыми свойствами:

from pywikibot import Site, Page
from pywikibot.data.api import PropertyGenerator
site = Site("en", "wikipedia")
revs = next(iter(PropertyGenerator('revisions', site=site, parameters={
    'titles': 'Main Page',
    'rvprop': 'timestamp|size',
})))['revisions']

print(len(revs))
for rev in revs[:5]:
    print(rev)

Приведенный выше код напечатает:

4239
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}

Старый ответ : как отмечалось в комментариях, этот метод не обрабатывает продолжения API и, следовательно, не рекомендуется , если вам нужны все версии страницы.

import pywikibot
from pywikibot.data.api import Request
site = pywikibot.Site("en", "wikipedia")
r = Request(site, parameters={
    'action': 'query',
    'titles': 'Main Page',
    'prop': 'revisions',
    'rvprop': 'timestamp|size',
    'rvlimit': 5,
}).submit()
pages = r['query']['pages']
for page_id, page_info in pages.items():
    for rev in page_info['revisions']:
        print(rev)

Будет напечатан приведенный выше код:

{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
...