我想在Wikipedia类别中检索所有文章网址(我不需要整篇文章)。
例如,如果我想从以下类别获取所有文章网址:https://en.wikipedia.org/wiki/Category:History,最好的方法是什么?
是否有必要下载整个mysql转储并进行手动查询?
答案 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"操作就是您想要的。列出类别中页面的查询示例可能是:
请注意:
默认情况下,结果以格式化的HTML格式返回,显示JSON数据。这纯粹用于调试,不用于生产用途。传递format=json
参数以从API获取未格式化的JSON。 (还有许多其他格式可供使用;请阅读文档以获取详细信息。)
此查询的结果已分页。您可以使用cmlimit
参数增加页面大小,但最终您可能需要通过从结果中提取cmcontinue
值并将其传递到同名参数中来分页结果。
许多"页面"在该类别中实际上是其他类别。由于维基百科的类别不是层次结构,因此无法递归列出类别的内容及其包含的所有类别。某些类别将包含包含它们的类别,或者包含不是严格子集的其他类别。 (维基百科"类别"标签实际上比类别更多,但名称已经足够大,以至于现在无法改变它。)
答案 2 :(得分:-2)
不必是MySQL。有更简单的方法。 你可以写一个简短的代码来做到这一点。 只需使用正则表达式或找到关键字,例如链接具有特定模式即可找到它们:
in this case it's
"< a href="/wiki/ " or so as the starter
"</a>" to the end