【问题标题】:Wikipedia revision history using pywikibot使用 pywikibot 的维基百科修订历史
【发布时间】:2020-08-02 07:52:34
【问题描述】:

我想一次收集所有的修订历史数据。 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},也可以在上面的历史截图中看到。

【问题讨论】:

    标签: web-scraping mediawiki wikipedia-api pywikibot


    【解决方案1】:

    Pywikibot 使用MW's API to fetch revisions

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

    API 为rvprop 参数提供了size 选项,而不是大小更改。使用它可以轻松计算尺寸变化。

    不幸的是 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}
    

    旧答案:如 cmets 中所述,此方法不处理 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}
    

    【讨论】:

    • 挑战在于我们一次只能获取 500 个条目。
    【解决方案2】:

    https://phabricator.wikimedia.org/T259428

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

    【讨论】:

    • 谢谢xqt。我是把它作为要添加的功能的人。我一直在关注您所做的更新。
    【解决方案3】:

    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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      相关资源
      最近更新 更多