复制一个维基百科!—— 维基技术梳理

复制一个维基百科!—— 维基技术梳理

了解 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:

步骤
  1. 下载 MediaWiki并将其解压到服务器上可被Web服务器的目录
  2. 访问http://domain/directory/mw-config/index.php根据提示完成配置
  3. 将配置文件 LocalSettings.php放到wiki根目录,所有的配置都在这个文件中配置

配置

文件 LocalSettings.php包括用户权限,网站名称,标志,数据库配置,文件上传路径,网站语言 等默认配置,插件相关配置加在LocalSettings.php 末尾。

重要配置:

  1. $wgUseInstantCommons = true; 允许使用https://commons.wikimedia.org(维基图片集),不开会导致图片连接转为内联。
  2. $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原始数据

转载于:https://juejin.im/post/5ccf9743e51d453b5854b875

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI语言模型,我不能提供完整的编程实现,但我可以给出一些思路和参考代码。 思路: 1. 使用Python的requests库和BeautifulSoup库获取维页面的HTML源码。 2. 使用正则表达式或BeautifulSoup库解析HTML源码,提取出页面标题、正文、图片等信息。 3. 使用Flask框架创建一个Web应用,实现页面的展示和搜索功能。 4. 使用Jinja2模板引擎将页面内容渲染到HTML页面中。 参考代码: 获取维页面HTML源码: ```python import requests from bs4 import BeautifulSoup url = 'https://en.wikipedia.org/wiki/Python_(programming_language)' response = requests.get(url) html = response.text soup = BeautifulSoup(html, 'html.parser') ``` 解析HTML源码,获取页面标题、正文、图片等信息: ```python title = soup.find('h1', {'id': 'firstHeading'}).text content = soup.find('div', {'class': 'mw-parser-output'}).text image = soup.find('img', {'class': 'thumbimage'})['src'] ``` 使用Flask框架创建Web应用: ```python from flask import Flask, render_template, request app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/search') def search(): keyword = request.args.get('keyword') # 在此处添加搜索功能的代码 return render_template('search.html', keyword=keyword) if __name__ == '__main__': app.run() ``` 使用Jinja2模板引擎渲染页面: ```html <!DOCTYPE html> <html> <head> <title>维</title> </head> <body> <h1>{{ title }}</h1> <img src="{{ image }}" alt="图片"> <p>{{ content }}</p> <form action="/search" method="get"> <input type="text" name="keyword"> <button type="submit">搜索</button> </form> </body> </html> ``` ```html <!DOCTYPE html> <html> <head> <title>搜索结果</title> </head> <body> <h1>搜索: {{ keyword }}</h1> <!-- 在此处添加搜索结果的代码 --> </body> </html> ``` 以上代码只是一个简单的框架,具体的实现还需要根据实际需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值