使用pywikibot的Wikipedia修订历史

我想一次收集所有修订历史记录数据。 Pywikibot page.revisions()没有获取更改的字节数的参数。 它为我提供了所需的所有数据,但字节数已更改。

如何获得更改的字节数?

例如: 对于文章主页,修订历史为herehistory screenshot

我当前的代码:

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},也可以在上面的历史记录屏幕快照中看到。

iCMS 回答:使用pywikibot的Wikipedia修订历史

Pywikibot使用MW's API to fetch revisions

API不提供修订版本的大小。

API提供了size参数的rvprop选项,而不是大小更改。这样便可以轻松计算出尺寸变化。

不幸的是,pywikibot并未获取size的修订版本。

您可以file a bug report for pywikibot team

一个人可以直接使用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','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': 3501}
,

请参见https://phabricator.wikimedia.org/T259428

该修补程序已合并到master分支,并将通过pypi部署在5.2.0版中。

,

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}
本文链接:https://www.f2er.com/1820176.html

大家都在问