You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从自有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=query
    • titles=File:XXX.jpg:指定要查询的附件(多个用|分隔)
    • prop=imageinfo
    • iiprop=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=query
    • list=allpages
    • apstart=2024-01-01T00:00:00Z(替换为上次同步的最大时间戳)
    • apdir=newer
    • aplimit=500
    • format=json

2. 增量获取变更的附件

用aistart参数指定时间戳,aidir=newer返回新增/修改的附件:

  • 核心参数:
    • action=query
    • list=allimages
    • aistart=2024-01-01T00:00:00Z
    • aidir=newer
    • ailimit=500
    • format=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:27:02