如何下载维基百科中某个类别中的所有页面?

时间:2016-10-18 22:47:24

标签: mysql mediawiki wiki wikipedia wikipedia-api

我想在Wikipedia类别中检索所有文章网址(我不需要整篇文章)。

例如,如果我想从以下类别获取所有文章网址:https://en.wikipedia.org/wiki/Category:History,最好的方法是什么?

是否有必要下载整个mysql转储并进行手动查询?

3 个答案:

答案 0 :(得分:2)

如果您不介意使用PHP来帮助解决这个问题,addwiki/mediawiki-api库有一个系统来递归检索给定类别中的所有页面。如下所示:

$api = new \Mediawiki\Api\MediawikiApi( 'http://en.wikipedia.org/w/api.php' );
$services = new \Mediawiki\Api\MediawikiFactory( $api );
$categoryTraverser = $services->newCategoryTraverser();

// Get the root category.
$rootCatIdent = new PageIdentifier( new Title( 'Category:History' ) );
$rootCat = $this->factory->newPageGetter()->getFromPageIdentifier( $pageIdentifier );

// Get all page URLs:
$allPages = $categoryTraverser->descend( $rootCat );
foreach ($allPages->toArray() as $page) {
    echo 'https://en.wkipedia.org/wiki/'.$page->getPageIdentifier()->getTitle()->getText();
}

答案 1 :(得分:1)

使用维基百科API。

"query"列表中的"categorymembers"操作就是您想要的。列出类别中页面的查询示例可能是:

https://en.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:History&cmprop=title

请注意:

  1. 默认情况下,结果以格式化的HTML格式返回,显示JSON数据。这纯粹用于调试,不用于生产用途。传递format=json参数以从API获取未格式化的JSON。 (还有许多其他格式可供使用;请阅读文档以获取详细信息。)

  2. 此查询的结果已分页。您可以使用cmlimit参数增加页面大小,但最终您可能需要通过从结果中提取cmcontinue值并将其传递到同名参数中来分页结果。

  3. 许多"页面"在该类别中实际上是其他类别。由于维基百科的类别不是层次结构,因此无法递归列出类别的内容及其包含的所有类别。某些类别将包含包含它们的类别,或者包含不是严格子集的其他类别。 (维基百科"类别"标签实际上比类别更多,但名称已经足够大,以至于现在无法改变它。)

答案 2 :(得分:-2)

不必是MySQL。有更简单的方法。 你可以写一个简短的代码来做到这一点。 只需使用正则表达式或找到关键字,例如链接具有特定模式即可找到它们:

in this case it's
"< a href="/wiki/ " or so as the starter
"</a>" to the end