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

Mysql 如何下载维基百科中一个类别内的所有页面?,mysql,mediawiki,wiki,wikipedia,wikipedia-api,Mysql,Mediawiki,Wiki,Wikipedia,Wikipedia Api,我想检索维基百科类别中的所有文章URL(我不需要整个文本) 例如,如果我想从以下类别获取所有文章URL:,那么最好的方法是什么 有必要下载整个mysql转储并进行手动查询吗?不必是mysql。有更简单的方法。 您只需编写一段简短的代码即可。 只需使用regex或查找关键字,就像链接具有特定模式来定位它们一样: in this case it's "< a href="/wiki/ " or so as the starter "</a>" to the end 在这种情况下

我想检索维基百科类别中的所有文章URL(我不需要整个文本)

例如,如果我想从以下类别获取所有文章URL:,那么最好的方法是什么


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

不必是mysql。有更简单的方法。 您只需编写一段简短的代码即可。 只需使用regex或查找关键字,就像链接具有特定模式来定位它们一样:

in this case it's
"< a href="/wiki/ " or so as the starter
"</a>" to the end
在这种情况下
“
使用维基百科API

列表上的操作就是此处所需的操作。在类别中列出页面的查询示例可能是:

请注意:

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

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

  • 类别中的许多“页面”实际上是其他类别。无法递归列出类别及其包含的所有类别的内容,因为维基百科的类别不是层次结构。某些类别将包含包含这些类别的类别,或者包含其他非严格子集的类别。(维基百科的“类别”实际上更多的是标签,而不是类别,但是这个名字已经很老了,现在无法更改。)


  • 如果您不介意使用PHP来帮助实现这一点,那么该库有一个系统,可以递归地检索给定类别中的所有页面

    $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();
    }
    

    不管是什么语言,但这就像“爬行”,这是我想要避免的。尝试模仿网络爬虫几乎总是最糟糕的方法。api/dumps/etc的提供完全是为了让您不必经历它。我不想使用api,因为我也想获得子类别页面(递归深度为8或更多)。正如我所解释的,不要这样做。维基百科的分类是不分等级的;你最终会得到比你预期的多得多的文章,而且其中许多文章与原始分类无关。即使你决定——反对我的建议——递归,API将是实现这一点的最简单方法。我理解,我认为我会深入使用这些days continuation的工作原理是获取结果集的
    continue
    属性中的键值对,并将它们添加到查询中。