首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在维基百科中下载一个类别中的所有页面?

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

Stack Overflow用户
提问于 2016-10-19 06:47:24
回答 3查看 1.6K关注 0票数 1

我想检索维基百科分类内的所有文章网址(我不需要整个文本)。

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

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

EN

回答 3

Stack Overflow用户

发布于 2016-10-19 13:10:19

如果您不介意使用PHP来帮助实现这一点,addwiki/mediawiki-api库有一个系统可以递归地检索给定类别中的所有页面。类似于以下内容:

代码语言:javascript
复制
$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();
}
票数 2
EN

Stack Overflow用户

发布于 2016-10-19 07:27:31

使用Wikipedia API。

"categorymembers"列表上的"query"操作就是您在这里需要的。在一个类别中列出页面的查询示例可能是:

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

请注意:

默认情况下,结果以显示数据的格式化

  1. 形式返回。这纯粹是为了调试,而不是为了生产使用。传递format=json参数以从API中获取未格式化的JSON。(还有许多其他格式可用;有关详细信息,请阅读文档。)
  2. 此查询的结果将分页。您可以使用cmlimit参数增加页面大小,但最终可能需要通过从结果中提取cmcontinue值并将其传递到同名的参数中来对结果进行分页。
  3. 类别中的许多“页面”实际上是其他类别。没有办法递归地列出一个类别的内容和它包含的所有类别,因为维基百科的类别不是一个层次结构。一些类别将包含包含它们的类别,或者包含不是严格子集的其他类别。(维基百科的“类别”实际上更多的是标签,而不是类别,但是这个名称太老了,现在没有办法改变它。)
票数 1
EN

Stack Overflow用户

发布于 2016-10-19 07:13:15

不一定是MySQL。有更简单的方法。您只需编写一段简短的代码即可完成此操作。只需使用正则表达式或查找关键字,例如链接具有特定的模式来定位它们:

代码语言:javascript
复制
in this case it's
"< a href="/wiki/ " or so as the starter
"</a>" to the end
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40119322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档