复制一个维基百科!—— 维基技术梳理
了解 WikiMedia
说到维基百科 不得谈到一个组织 — 维基媒体wikimedia。
企业家吉米·威尔士和软件设计师拉里·桑格创立了维基百科(wikipedia),于2001年1月15日发布,目标是向全人类提供自由的百科全书。最初资助的维基百科是由企业家威尔士的一家个人公司提供资助,随着维基百科的人气直线上升,需要消耗的资金越来越多,已经无法提供足够的钱维持维基百科的发展。创始人们决定以慈善模式运营维基百科。于是 维基媒体基金会(wikimedia foundation)应运而生。时间点-2003年6月20日。
维基媒体基金会托管了维基百科,并发布了维基媒体运动(wikimedia movement)即:一系列组织和活动基于共享价值观围绕维基媒体的网站和项目进行运转。获得了众多有情怀的公司以及个人的资助,包括,谷歌,亚马逊,巴菲特等等。
wikimedia拥有众多项目,包括维基百科,维基新闻,维基图书馆,维基物种等等。其中一个是维基百科所使用的基础软件 mediawiki。
MediaWiki
介绍
MediaWiki采用PHP编程语言写成,使用MySQL、MariaDB等关系数据库管理系统。MediaWiki软件最初是为维基百科开发的,目前维基媒体基金会的所有项目乃至众多wiki网站皆采用了这一软件。我们复制维基百科的关键。
安装
最好采用最新1.31 否则扩展插件安装比较麻烦
www.mediawiki.org/wiki/Manual…
记得勾选上扩展程序和图像和文件上传-启用即时共享资源
要求
web server:apache or iis
PHP version 7.0.0 or later
Database Server, one of the following:
- MySQL 5.5.8+
- MariaDB
- PostgreSQL 9.2+
- SQLite 3.3.7+
步骤
- 下载 MediaWiki并将其解压到服务器上可被Web服务器的目录
- 访问http://domain/directory/mw-config/index.php根据提示完成配置
- 将配置文件 LocalSettings.php放到wiki根目录,所有的配置都在这个文件中配置
配置
文件 LocalSettings.php包括用户权限,网站名称,标志,数据库配置,文件上传路径,网站语言 等默认配置,插件相关配置加在LocalSettings.php 末尾。
重要配置:
- $wgUseInstantCommons = true; 允许使用https://commons.wikimedia.org(维基图片集),不开会导致图片连接转为内联。
- $wgLanguageCode = "ja";ja为对应wiki语言,如果英语(en)wgLanguageCode为日语(ja),会导致脚本出错。
导入导出
/maintenance/exportDump.php
/maintenance/importDump.php
插件
查看已经安装插件:https://yourwiki/wiki/Special:Version
个别插件需要使用到数据库创建表,运行update.php 会读取配置问文件,更新表结构
Wiki Family
维基百科各个语言是单独的一个mediawiki实例,为了能协同工作,提出了wiki family 的概念。
Multiple wikis sharing common resources
可以共享插件
www.mediawiki.org/wiki/Manual…
WikiText
介绍
WikiText是一种轻量级标记语言,类似于markdown,用于撰写Wiki网页,它在HTML基础上进行简化,使不会使用html的人也能写出格式清晰好看的页面,最终是由mediawiki转换成HTML,由浏览器进行渲染。
基本语法
meta.wikimedia.org/wiki/Help:W…
数据结构
mediawiki提供管理组织公共内容的基本结构,为了区分词条,用命名空间加冒号:来区分。
查看方式Help:Namespaces
(Main/Article) namespaces 编号为0,搜索的时候不必输入任何命名空间,也就是我们正常所说的词条
Template:{{templateName|arguments}}www.mediawiki.org/wiki/Help:T…
Category:类别 是一个集合(类似于月份)commons.wikimedia.org/wiki/Catego…
Module:lua脚本,增强Template 实现更复杂的功能
Project: 不是百科全书的一部分,记录政策和指南
Special:mediawiki特殊功能,比如导入导出等工具,报告等等
复制维基百科
dumps
维基会经常会发布一些备份文件的转储提供给需要的人。网址:dumps.wikimedia.org/
提供内容包括:
- 部分数据库表备份
- mediawiki exportDump 备份
- 静态页面 (2008年之前)
- 图片服务器(151T)
- 等...
根据需要下载指定语言的备份文件,有时候经常出现Template或者Mudule等数据不全。所以最好也下载commons的备份文件。
数据库配置修改
默认单个插入语句不能超过1M,英文词条比较大,修改为64M
SET GLOBAL max_allowed_packet = 64M;
修改最大连接数,提高插入效率
SET GLOBAL max_connections = 500;
在my.cnf中
修改数据库最大核心数和innodb缓冲池大小
thread_concurrency = 32 innodb_buffer_pool_size = 1024M
php函数嵌套层数修改
默认100 ,部分插件会栈溢出
/etc/php.ini文件
在最后加上xdebug.max_nesting_level = 600
导入
下好备份文件后,使用mediawiki自带的导入工具导入。
php /var/www/html/wiki/maintenance/importDump.php < /home/yuwenhao/wikidumps/data/Category.xml
单个进程速度很慢,将大文件拆分,然后批量插入
将文件按照namespace拆分
_1_extract_namespaces_from_wikitext.py
包裹插入必须要的标签
_2_wrap_mediawiki_for_page.py
按照将xml拆分成指定个数,并包裹插入必须要的标签
_3_split_big_xml_for_import_dump.py
批量执行插入,日志为相同目录相同名称 *.log
_4_run_all_mediawiki_dump_file.py
坑
确保磁盘空间足够,在导入过程中如果空间不够,wikitext会清空一些表,以保证插入。
wikitext--->html
既然可以复制维基百科,为何用要wikitext转html:
- 空间问题
- 数据库压力
- 导入时间问题
- 方便清洗
可能遇到的坑:
- 多语言问题:下载langlinks
- 注意别忘了对内容进行url解码
parsoid
介绍
mediawiki官方团队推出的html<-->wikitext互转应用,基于nodejs。
安装&配置
www.mediawiki.org/wiki/Parsoi…
注意在配置文件中配置mediawiki的api URL
使用
压力测试:
115.231.226.254
32个逻辑CPU 64G内存
200个线程 20次循环
8.2个每秒
需要注意
清洗parsoid原始数据