You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在自建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的纯文本提取:

  1. 安装工具:
    pip install wikiextractor
    
  2. 运行提取命令:
    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:去掉维基的模板内容,只留纯文本
  3. 提取完成后,extracted_text目录下会生成很多分块文件,每个文件里是多篇文章,格式是# 文章标题加换行后的纯文本内容。

四、导入到你的MediaWiki数据库

这里有两种靠谱的方法,你可以选适合自己的:

方法一:用MediaWiki自带的维护脚本导入

这种方法适合批量导入,效率较高:

  1. 先把提取的纯文本转换成MediaWiki支持的XML导入格式。你可以写个简单的Python脚本,遍历所有提取的文件,把每篇文章转换成<page><title>标题</title><text>纯文本内容</text></page>的格式,然后合并成一个大的XML文件。
  2. 调整MediaWiki的内存限制:打开LocalSettings.php,添加或修改一行:
    $wgMemoryLimit = '2048M';
    
  3. 运行导入脚本:
    nohup php maintenance/importDump.php --conf LocalSettings.php your_converted_dump.xml &
    

方法二:用Pywikibot批量创建页面

这种方法更灵活,适合需要自定义导入逻辑的场景:

  1. 安装Pywikibot:
    pip install pywikibot
    
  2. 配置Pywikibot:先在你的MediaWiki后台创建一个bot账号(给它编辑权限),然后运行:
    pwb generate_user_files
    
    按照提示输入你的MediaWiki站点URL、bot账号和密码,生成配置文件。
  3. 写一个批量导入的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)')
    
  4. 运行脚本前,建议临时关闭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

火山引擎 最新活动