如何可靠判断网页是否基于MediaWiki并获取原始wikitext?
方案可行性分析与优化建议
现有方案的可行性
你提出的检测特征+action=raw获取wikitext的方案整体可行,但存在一些需要注意的边界情况:
name=generator的meta标签:绝大多数MediaWiki站点会默认生成该标签,但部分私有部署的站点可能通过配置$wgGenerator修改或关闭该标识,不过这种场景占比极低。- 页脚的Powered by图片:不少站点会自定义页脚模板,移除该图片或修改
alt属性,因此这个特征的可靠性不如meta标签。 action=raw接口:默认情况下MediaWiki会开启该功能,但少数站点可能通过权限设置限制未登录用户访问,或是修改了路由规则,导致请求失败。
更可靠的优化方案
针对批量检测与wikitext获取,推荐以下优先级更高的方法:
1. 直接调用MediaWiki API
MediaWiki默认提供标准API接口,通过构造请求/w/api.php?action=query&prop=revisions&rvprop=content&titles=目标页面标题,可以直接获取结构化的wikitext内容。这种方法的优势在于:
- API响应格式规范(JSON/XML),容易判断请求是否成功,以及站点是否为MediaWiki。
- 支持批量请求多个页面,效率更高。
- 不受页面自定义模板的影响,可靠性远高于特征检测。
2. 直接尝试action=raw请求(跳过特征检测)
无需先检测页面特征,直接构造raw接口URL(将页面URL中的/wiki/页面标题替换为/w/index.php?title=页面标题&action=raw),然后通过以下两点验证结果:
- 检查响应的
Content-Type是否为text/plain或包含wikitext标识。 - 检查响应内容是否包含wikitext特有的语法(如
==二级标题==、[[内部链接]]、{{模板调用}}等)。
这种方法省去了前期的HTML解析步骤,适合批量处理场景。
3. 补充特征检测(作为 fallback)
如果API和raw接口都无法访问,可以补充检测以下MediaWiki特有的HTML标识:
- 页面主体是否包含
mw-body、mw-content-text这类默认类名。 - 页面是否存在指向
Special:RecentChanges、Special:EditPage等MediaWiki特殊页面的链接。
批量处理流程建议
- 优先尝试API请求:若返回有效结构化数据,直接提取wikitext。
- API失败则尝试
action=raw请求:验证响应格式与内容,符合则提取。 - 前两者都失败时,再用特征检测判断站点类型,确认是MediaWiki后尝试其他方式(如
Special:Export页面)获取内容。
内容的提问来源于stack exchange,提问作者argosci
相关产品推荐
相关产品推荐

