История изменений Википедии с использованием pywikibot

Я хочу собрать все данные истории изменений сразу. 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'}}}

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


person faceless_fool    schedule 02.08.2020    source источник


Ответы (3)


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

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

Вместо изменения размера API предоставляет параметр size для параметра 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}
person AXO    schedule 02.08.2020
comment
Проблема в том, что мы можем получить только 500 записей за раз. - person faceless_fool; 02.08.2020

См. https://phabricator.wikimedia.org/T259428.

Патч был объединен с основной веткой и будет развернут в версии 5.2.0 через pypi.

person xqt    schedule 02.11.2020
comment
Спасибо xqt. Я был тем, кто выложил это как функцию для добавления. Я следил за обновлениями, которые вы сделали. - person faceless_fool; 03.11.2020

Есть лучший способ для предложения AXO:

import pywikibot
site = pywikibot.Site('wikipedia:en')
page = pywikibot.Page(site, 'Main Page')
for rev in page.revisions(total=5):
    # do whatever you want with Revision Collection rev
    print(dict(timestamp=str(rev.timestamp), size=rev.size))

Код будет напечатан, как и ожидалось:

{'timestamp': '2021-02-03T11:11:30Z', 'size': 3508}
{'timestamp': '2021-02-03T11:03:39Z', 'size': 3480}
{'timestamp': '2020-11-10T08:18:07Z', 'size': 3508}
{'timestamp': '2020-11-10T02:32:23Z', 'size': 4890}
{'timestamp': '2020-11-10T00:46:58Z', 'size': 4880}
person xqt    schedule 03.02.2021