Wikipedia API:如何获取页面的修订次数?

问题描述 投票:0回答:5

有人知道如何使用 mediawiki API 获取维基百科页面的修订数量吗? 我已经阅读了这个API文档,但找不到相关的API:
修订API

wikipedia wikipedia-api mediawiki-api wikimedia
5个回答
9
投票

唯一的可能性是检索所有修订并对其进行计数。您可能需要继续查询

Bug 17993 涉及计数,但仍未解决。


4
投票

这里是获取页面修订数量的代码(在本例中为 JSON wiki 页面):

import requests

BASE_URL = "http://en.wikipedia.org/w/api.php"
TITLE = 'JSON'

parameters = { 'action': 'query',
           'format': 'json',
           'continue': '',
           'titles': TITLE,
           'prop': 'revisions',
           'rvprop': 'ids|userid',
           'rvlimit': 'max'}

wp_call = requests.get(BASE_URL, params=parameters)
response = wp_call.json()

total_revisions = 0

while True:
  wp_call = requests.get(BASE_URL, params=parameters)
  response = wp_call.json()

  for page_id in response['query']['pages']:
    total_revisions += len(response['query']['pages'][page_id]['revisions'])

  if 'continue' in response:
    parameters['continue'] = response['continue']['continue']
    parameters['rvcontinue'] = response['continue']['rvcontinue']

  else:
    break

print parameters['titles'], total_revisions

您可以在此处查看结果:https://en.wikipedia.org/w/index.php?title=JSON&action=info#Edit_history

(可从相应的维基百科页面侧边栏访问:工具 - 页面信息)


2
投票

检索修订并实现一个方法来对它们进行计数(只是 XML)。

MediaWiki 修订:示例

api.php ? action=query & prop=revisions & titles=API|Main%20Page & rvprop=timestamp|user|comment|content

.

<api>
<query>
<pages>
  <page pageid="1191" ns="0" title="API">
    <revisions>
      <rev user="Harryboyles" timestamp="2006-10-31T05:39:01Z" comment="revert unexplained change: see talk ...">
        ...content...
      </rev>
    </revisions>
  </page>
  <page pageid="11105676" ns="0" title="Main Page">
    <revisions>
      <rev user="Ryan Postlethwaite" timestamp="2007-06-26T19:05:06Z" comment="rv - what was that for?">
        ...content...
      </rev>
    </revisions>
  </page>
</pages>


1
投票

借助 较新的 MediaWiki 提供的 REST API,您可以使用 “获取页面历史记录计数”API 来获取页面的修订次数。

例如,

GET https://en.wikipedia.org/w/rest.php/v1/page/Jupiter/history/counts/edits?from=384955912&to=406217369

此请求将返回如下 JSON 响应:

{
    "count": 110,
    "limit": false
}

完全零编码。


0
投票

正如Wint的回答中所述,最好的解决方案可能是使用REST API。

但是,如果您必须使用常用的 Action API,您唯一的解决方案是计算修订次数(这在具有大量历史记录的页面上显然会很慢)。

我刚刚为此编写了一段 JavaScript 代码:

/* jshint esversion: 6 */
/* globals Promise, mw */

function countRevisions( pageTitle ) {
    return new Promise( function ( resolve, reject ) {
        mw.loader.using( 'mediawiki.api', function () {
            const api = new mw.Api();
            const userGroups = mw.config.get( 'wgUserGroups' );
            const APILimit = userGroups.includes( 'sysop' ) || userGroups.includes( 'bot' ) ? 5000 : 500;
            let count = 0;
            function makeRequest( apiContinue ) {
                const params = {
                    action: 'query',
                    prop: 'revisions',
                    titles: pageTitle,
                    rvprop: '', // we don't need any property
                    rvlimit: APILimit,
                    formatversion: 2,
                };
                if ( apiContinue ) {
                    Object.assign( params, apiContinue );
                }
                api.get( params ).done( function ( data ) {
                    if ( !data.query ) {
                        reject();
                        return;
                    }
                    const revisions = data.query.pages[ 0 ].revisions;
                    if ( revisions ) {
                        count += revisions.length;
                    }
                    if ( data[ 'continue' ] ) {
                        makeRequest( data[ 'continue' ] );
                    } else {
                        resolve( count );
                    }
                } );
            }
            makeRequest();
        } );
    } );
}

countRevisions( 'Page title' ).then( function ( count ) {
    /* ... */
} );
© www.soinside.com 2019 - 2024. All rights reserved.