如何从自有MediaWiki加载数据?全量与增量获取实操指引
全量+增量获取MediaWiki带附件页面及附件实操指南
一、MediaWiki实例前置配置
先确认你的wiki开启了必要的API支持,修改LocalSettings.php(按需调整):
- 确保API功能开启:
$wgEnableAPI = true;(默认已开启,若被手动关闭需恢复) - 若为私有wiki,允许API读访问:
$wgGroupPermissions['*']['api-read'] = true;(匿名用户可访问API;若仅允许登录用户,把*换成user) - 无需额外插件,原生API即可完成所有操作
二、全量获取流程
1. 获取所有带附件的页面
通过MediaWiki API的query模块,结合generator=allpages和prop=filelinks,批量抓取包含附件链接的页面及关联附件:
- 核心参数:
action=query:指定API操作类型generator=allpages:遍历所有页面gapprop=filelinks:返回页面关联的附件列表gaplimit=500:每次请求返回的页面数量(最大可设为5000,依wiki配置而定)format=json:返回JSON格式数据
- 分页处理:若页面数量超过单次请求上限,API会返回
continue参数,需携带该参数发起下一次请求,直到无continue为止
2. 获取附件的详细信息(下载地址、修改时间等)
拿到附件的标题(格式为File:XXX.jpg)后,用prop=imageinfo获取附件的元数据:
- 核心参数:
action=querytitles=File:XXX.jpg:指定要查询的附件(多个用|分隔)prop=imageinfoiiprop=url|timestamp|size|user:返回附件的下载URL、最后修改时间、大小、上传者format=json
全量示例
CURL 命令示例
# 获取第一批带附件的页面 curl "https://your-wiki-domain/w/api.php?action=query&generator=allpages&gapprop=filelinks&gaplimit=500&format=json" # 获取指定附件的详细信息 curl "https://your-wiki-domain/w/api.php?action=query&titles=File:Sample.png|File:Doc.pdf&prop=imageinfo&iiprop=url|timestamp|size&format=json"
Python 脚本示例(基础版)
import requests import json WIKI_API_URL = "https://your-wiki-domain/w/api.php" def get_all_attachment_pages(): all_pages = [] continue_params = {} while True: params = { "action": "query", "generator": "allpages", "gapprop": "filelinks", "gaplimit": 500, "format": "json", **continue_params } response = requests.get(WIKI_API_URL, params=params) data = response.json() if "query" in data and "pages" in data["query"]: all_pages.extend(data["query"]["pages"].values()) # 处理分页 if "continue" in data: continue_params = data["continue"] else: break return all_pages def get_attachment_details(file_titles): params = { "action": "query", "titles": "|".join(file_titles), "prop": "imageinfo", "iiprop": "url|timestamp|size", "format": "json" } response = requests.get(WIKI_API_URL, params=params) return response.json() # 执行全量获取 pages_with_attachments = get_all_attachment_pages() # 提取所有附件标题 all_file_titles = [] for page in pages_with_attachments: if "filelinks" in page: all_file_titles.extend([fl["title"] for fl in page["filelinks"]]) # 去重 all_file_titles = list(set(all_file_titles)) # 获取附件详情 attachment_details = get_attachment_details(all_file_titles) # 保存结果(示例) with open("mediawiki_attachments.json", "w", encoding="utf-8") as f: json.dump(attachment_details, f, ensure_ascii=False, indent=2)
三、增量获取流程
核心思路是基于时间戳过滤,只抓取上次同步后新增/修改的页面及附件,需提前记录上次同步的最大时间戳(首次全量后保存所有页面和附件的timestamp最大值)。
1. 增量获取变更的页面
用apstart参数指定上次同步的时间戳,apdir=newer只返回该时间之后修改的页面,再检查这些页面是否包含附件:
- 核心参数:
action=querylist=allpagesapstart=2024-01-01T00:00:00Z(替换为上次同步的最大时间戳)apdir=neweraplimit=500format=json
2. 增量获取变更的附件
用aistart参数指定时间戳,aidir=newer返回新增/修改的附件:
- 核心参数:
action=querylist=allimagesaistart=2024-01-01T00:00:00Zaidir=newerailimit=500format=json
增量示例(Python 片段)
def get_updated_pages(last_sync_timestamp): params = { "action": "query", "list": "allpages", "apstart": last_sync_timestamp, "apdir": "newer", "aplimit": 500, "format": "json" } response = requests.get(WIKI_API_URL, params=params) return response.json() def get_updated_attachments(last_sync_timestamp): params = { "action": "query", "list": "allimages", "aistart": last_sync_timestamp, "aidir": "newer", "ailimit": 500, "format": "json" } response = requests.get(WIKI_API_URL, params=params) return response.json() # 假设上次同步的时间戳是 "2024-05-01T12:00:00Z" last_sync_ts = "2024-05-01T12:00:00Z" updated_pages = get_updated_pages(last_sync_ts) updated_attachments = get_updated_attachments(last_sync_ts) # 处理更新数据(对比原有数据,新增/替换变更项)
四、关键注意事项
- API请求频率:避免短时间内发起大量请求,可添加1-2秒的间隔,防止触发wiki的速率限制
- 分页处理:所有批量请求必须处理
continue参数,否则会遗漏数据 - 时间戳格式:必须使用ISO 8601格式(如
2024-05-01T12:00:00Z),与MediaWiki返回的timestamp格式一致
内容的提问来源于stack exchange,提问作者mamamiapapamia
相关产品推荐
相关产品推荐

