如何在自建Ubuntu服务器的MediaWiki(MySQL库)导入英文纯文本文章?
导入英文维基百科纯文本到自建MediaWiki的详细步骤
我之前帮朋友处理过类似的需求,把英文维基的纯文本文章导入自建MediaWiki,步骤其实挺清晰的,给你详细拆解一下:
一、先搞定服务器和环境准备
- 确认MediaWiki版本:登录你的MediaWiki后台,打开
Special:Version页面,尽量用较新的稳定版,避免后续工具兼容性问题。 - 检查服务器资源:英文维基的文章dump真的很大,解压后处理完至少要几十GB,所以磁盘得留100GB以上空间;内存建议8GB+,多核心CPU能大幅缩短处理时间。
- 安装必备工具:在Ubuntu终端里运行这些命令:
sudo apt update && sudo apt install bzip2 python3 python3-pip
二、下载英文维基百科的文章Dump包
你需要去维基媒体的官方dump站点,找到最新的pages-articles压缩包,文件名格式为enwiki-latest-pages-articles.xml.bz2。这个包只包含主命名空间的所有文章,完全不含图片和多媒体内容,正好符合你的需求。下载时建议用wget后台运行,避免断开连接中断,命令格式类似:
nohup wget [官方dump包地址] &
三、提取纯文本内容
直接用原始的XML dump导入会带很多维基标记(比如模板、链接格式),所以得先提取纯文本。推荐用wikiextractor这个工具,专门用来处理维基dump的纯文本提取:
- 安装工具:
pip install wikiextractor - 运行提取命令:
解释下参数:python -m wikiextractor enwiki-latest-pages-articles.xml.bz2 --output extracted_text --bytes 1M --sections --no-templates--output extracted_text:指定提取后的文本存到extracted_text目录--bytes 1M:把大文件分割成1MB左右的小文件,方便后续处理--sections:保留文章的章节结构--no-templates:去掉维基的模板内容,只留纯文本
- 提取完成后,
extracted_text目录下会生成很多分块文件,每个文件里是多篇文章,格式是# 文章标题加换行后的纯文本内容。
四、导入到你的MediaWiki数据库
这里有两种靠谱的方法,你可以选适合自己的:
方法一:用MediaWiki自带的维护脚本导入
这种方法适合批量导入,效率较高:
- 先把提取的纯文本转换成MediaWiki支持的XML导入格式。你可以写个简单的Python脚本,遍历所有提取的文件,把每篇文章转换成
<page><title>标题</title><text>纯文本内容</text></page>的格式,然后合并成一个大的XML文件。 - 调整MediaWiki的内存限制:打开
LocalSettings.php,添加或修改一行:$wgMemoryLimit = '2048M'; - 运行导入脚本:
nohup php maintenance/importDump.php --conf LocalSettings.php your_converted_dump.xml &
方法二:用Pywikibot批量创建页面
这种方法更灵活,适合需要自定义导入逻辑的场景:
- 安装Pywikibot:
pip install pywikibot - 配置Pywikibot:先在你的MediaWiki后台创建一个bot账号(给它编辑权限),然后运行:
按照提示输入你的MediaWiki站点URL、bot账号和密码,生成配置文件。pwb generate_user_files - 写一个批量导入的Python脚本(示例):
import pywikibot import os # 连接到你的MediaWiki站点 site = pywikibot.Site('en', 'yourwiki') # 替换成你的站点语言和名称 site.login() # 遍历提取的文本目录 extracted_dir = 'extracted_text' for root, dirs, files in os.walk(extracted_dir): for file in files: file_path = os.path.join(root, file) with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 分割每篇文章 articles = content.split('\n\n') for article in articles: if not article.strip(): continue # 提取标题和内容 parts = article.split('\n', 1) if len(parts) < 2: continue title = parts[0].strip().lstrip('#').strip() text = parts[1].strip() # 创建或编辑页面 page = pywikibot.Page(site, title) page.text = text # 保存页面,备注导入来源 page.save('Imported from English Wikipedia (plain text)') - 运行脚本前,建议临时关闭MediaWiki的编辑速率限制(导入完成后改回来):在
LocalSettings.php里添加:
然后运行脚本:$wgRateLimits['edit']['user'] = [0, 0];nohup python import_script.py &
五、导入后的收尾优化
- 更新MediaWiki的索引和缓存:
php maintenance/update.php --conf LocalSettings.php - 重建搜索索引,这样才能搜索到导入的文章:
php maintenance/rebuildSearchIndex.php --conf LocalSettings.php - 清理临时文件:删除下载的dump包和
extracted_text目录,释放磁盘空间。
一些注意事项
- 整个过程耗时很长(下载、提取、导入可能要几天),一定要用
nohup或者screen后台运行,避免终端断开导致进程中断。 - 如果服务器资源不够,可以分批次处理:比如先下载一个历史版本的小dump测试流程,再处理最新的完整dump。
- 导入时如果遇到重复标题,MediaWiki会自动跳过或者覆盖,具体取决于脚本参数,你可以根据需求调整。
内容的提问来源于stack exchange,提问作者coding-jewelry




