如何获得完整的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
如果您需要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 ListGetRevisions(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来匹配所有内容
rev
,continue
elements。因此,我的想法是我提出一个主要要求,从该要求我将所有修订版本(最大为500个)放入
revisions
数组中。另外,我检查continue
xml元素以了解是否有更多修订版本,获取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编辑器采用的自动编辑方法。