我有一个大型(50K+ 页)Mediawiki wiki,我需要有效地获取所有页面的列表,按上次更新时间排序。我正在使用 pywikibot 在 Python 中工作。文档暗示这是可能的,但我还没有解码如何做到这一点。(我可以轻松下载多达 500 页。)有没有一种相当有效的方法来做到这一点,它比按字母顺序下载 500 个批次、逐页获取更新时间并合并批次更好?
问问题
425 次
2 回答
1
MediaWiki 不直接公开按上次编辑时间排序的页面列表。您可以下载所有页面并在本地对它们进行排序(在 Python 或某种数据库中,取决于有多少页面):
site = pywikibot.Site()
for namespace in site.namespaces():
for page in site.allpages(namespace = namespace):
// process page.title() and page.editTime()
或使用allrevisions API,它可以按时间排序,但返回所有页面的所有修订,可能依赖于类似action=query&generator=allrevisions&prop=revisions
(with pywikibot.data.api.QueryGenerator
) 的查询,该查询也将返回每个页面的当前修订,因此您可以丢弃旧修订;或在 Pywikibot中使用 SQL 支持和类似查询SELECT page_ns, page_title FROM page JOIN revision ON page_latest = rev_id ORDER BY rev_timestamp
(这将导致基于文件排序的查询效率低下,但对于可能无关紧要的小型 wiki)。
于 2020-01-20T06:14:09.513 回答
-1
经过一番挖掘和大量试验,我找到了一个使用 pywikibot 的解决方案,它生成按上次更新时间排序的所有页面列表:
wiki=pywikibot.Site()
current_time = wiki.server_time()
iterator=wiki.recentchanges(start = current_time, end=current_time - timedelta(hours=600000)) # Not for all time, just for the last 60 years...
listOfAllWikiPages=[]
for v in iterator:
listOfAllWikiPages.append(v)
# This has an entry for each revision.
# Get rid of the older instances of each page by creating a dictionary which
# only contains the latest version.
temp={}
for p in listOfAllWikiPages:
if p["title"] in temp.keys():
if p["timestamp"] > temp[p["title"]]["timestamp"]:
temp[p["title"]]=p
else:
temp[p["title"]]=p
# Recreate the listOfAllWikiPages from the de-duped dictionary
listOfAllWikiPages=list(temp.values())
于 2020-01-10T19:18:11.163 回答