当前位置:  开发笔记 > 编程语言 > 正文

如何从某些文章中获取完整的Wikipedia修订历史列表?

如何解决《如何从某些文章中获取完整的Wikipedia修订历史列表?》经验,为你挑选了2个好方法。

如何获得完整的Wikipedia修订历史列表?(不想刮)

import wapiti
import pdb
import pylab as plt  
client = wapiti.WapitiClient('mahmoudrhashemi@gmail.com')
get_revs = client.get_page_revision_infos( 'Coffee', 1000000)
print len(gen_revs)

500

包链接:https : //github.com/mahmoud/wapiti



1> Termininja..:

如果您需要500多个修订条目,则必须将MediaWiki API与动作query,属性修订和参数rvcontinue结合使用,该参数取自上一个请求,因此您不能仅通过一个请求获得整个列表:

https://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Coffee&rvcontinue=...

为了获得您所选择的更多特定信息,您还必须使用rvprop参数:

&rvprop=ids|flags|timestamp|user|userid|size|sha1|contentmodel|comment|parsedcomment|content|tags|parsetree|flagged

您可以在此处找到所有可用参数的摘要。

这是在C#中获取完整的Wikipedia页面修订历史的方法:

private static List GetRevisions(string pageTitle)
{
    var url = "https://en.wikipedia.org/w/api.php?action=query&format=xml&prop=revisions&rvlimit=500&titles=" + pageTitle;
    var revisions = new List();
    var next = string.Empty;
    while (true)
    {
        using (var webResponse = (HttpWebResponse)WebRequest.Create(url + next).GetResponse())
        {
            using (var reader = new StreamReader(webResponse.GetResponseStream()))
            {
                var xElement = XElement.Parse(reader.ReadToEnd());
                revisions.AddRange(xElement.Descendants("rev"));

                var cont = xElement.Element("continue");
                if (cont == null) break;

                next = "&rvcontinue=" + cont.Attribute("rvcontinue").Value;
            }
        }
    }

    return revisions;
}

当前,对于“咖啡”,这将返回10414个修订版本。


编辑:这是Python版本:

import urllib2
import re

def GetRevisions(pageTitle):
    url = "https://en.wikipedia.org/w/api.php?action=query&format=xml&prop=revisions&rvlimit=500&titles=" + pageTitle
    revisions = []                                        #list of all accumulated revisions
    next = ''                                             #information for the next request
    while True:
        response = urllib2.urlopen(url + next).read()     #web request
        revisions += re.findall(']*>', response)  #adds all revisions from the current request to the list

        cont = re.search('

您如何看待逻辑完全相同。与C#的区别在于,在C#中,我解析了XML响应,在这里我使用regex来匹配所有内容revcontinue elements。

因此,我的想法是我提出一个主要要求,从该要求我将所有修订版本(最大为500个)放入revisions数组中。另外,我检查continuexml元素以了解是否有更多修订版本,获取rvcontinue属性的值并将其用于next变量中(对于本示例而言,第一个请求为20150127211200|644458070)发出另一个请求以获取下500个修订版本。我重复所有这些操作,直到该continue元素可用为止。如果缺少它,这意味着响应的修订列表中的最后一个修订之后将不再保留任何修订,因此我退出循环。

revisions = GetRevisions("Coffee")

print(len(revisions))
#10418

这是“ Coffee”文章的最新10个修订(它们以相反的顺序从API返回),并且不要忘记,如果您需要更具体的修订信息,则可以rvprop在请求中使用参数。

for i in revisions[0:10]:
    print(i)

#
#
#
#
#
#
#
#
#
#



2> user108569..:

如果使用pywikibot,则可以拉取将在您的完整修订历史记录中运行的生成器。例如,要获得一个生成器,它将逐步浏览英语维基百科中“页面名称”页面的所有修订(包括其内容),请使用:

site = pywikibot.Site("en", "wikipedia")
page = pywikibot.Page(site, "pagename")
revs = page.revisions(content=True)

您可以将更多参数应用于查询。您可以在此处找到API文档

值得注意的是:

修订(反向= False,总计=无,内容= False,回滚= False,开始时间=无,结束时间=无)

生成器,将版本历史记录作为修订实例加载。

pywikibot似乎是许多Wikipedia编辑器采用的自动编辑方法。

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有