首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pywikibot的维基百科修订历史

使用pywikibot的维基百科修订历史
EN

Stack Overflow用户
提问于 2020-08-02 15:52:34
回答 3查看 264关注 0票数 1

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

如何获取更改后的字节数?

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

我当前的代码:

代码语言:javascript
复制
import pywikibot

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

仅显示1个输出:

代码语言:javascript
复制
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},这也可以在上面的历史截图中看到。

EN

回答 3

Stack Overflow用户

发布于 2020-08-02 17:02:37

Pywikibot使用MW's API to fetch revisions

API不提供用于修订的更改大小。

该接口为rvprop参数提供了一个size选项,而不是更改大小。使用它可以很容易地计算出大小的变化。

不幸的是,pywikibot不能获取size进行修改。

你可以使用file a bug report for pywikibot team

您可以直接使用PropertyGenerator类来获得具有所需属性的修订:

代码语言:javascript
复制
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)

上面的代码将打印:

代码语言:javascript
复制
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 :正如评论中所指出的,此方法不处理延续,因此,如果您需要页面的所有修订,则不推荐使用此方法。

代码语言:javascript
复制
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)

上面的代码将打印:

代码语言:javascript
复制
{'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}
票数 0
EN

Stack Overflow用户

发布于 2020-11-03 01:35:51

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

该补丁已合并到主分支,并将通过pypi在版本5.2.0中部署。

票数 0
EN

Stack Overflow用户

发布于 2021-02-03 22:39:21

对于AXO的提议,有一个更好的方法:

代码语言:javascript
复制
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))

代码将按预期打印:

代码语言:javascript
复制
{'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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63213660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档