list = allpages不提供所有页面

时间:2017-04-19 07:55:29

标签: php mediawiki

我有问题,我想填写一个列表,其中包含我wiki中所有页面的名称。我的剧本:

$TitleList = [];
$nsList = [];

$nsURL= 'wiki/api.php?action=query&meta=siteinfo&   siprop=namespaces|namespacealiases&format=json';
$nsJson = file_get_contents($nsURL);
$nsJsonD = json_decode($nsJson, true);
foreach ($nsJsonD['query']['namespaces'] as $ns)
{
  if ( $ns['id'] >= 0 )
    array_push ($nsList, $ns['id']);    
}

# populate the list of all pages in each namespace
foreach ($nsList as $n)
{
  $urlGET = 'wiki/api.php?action=query&list=allpages&apnamespace='.$n.'&format=json';
  $json = file_get_contents($urlGET);
  $json_b = json_decode( $json ,true); 

  foreach  ($json_b['query']['allpages'] as $page)
  {    
    echo("\n".$page['title']);
    array_push($TitleList, $page["title"]);
  }
}

但仍有35%的页面缺失,我可以访问我的wiki(使用“随机网站”进行测试)。有谁知道,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

MediaWiki API不会立即返回所有结果,但会批量生成。 默认批次只有10页;您可以指定aplimit来更改它(用户最多500个,机器人最多5,000个)。

要获得下一批,您需要指定continue=参数;在每个批次中,您还将在返回的数据中获得continue属性,您可以使用该属性来请求下一批。要获取所有页面,只要存在continue元素,就必须循环。

例如,在英语维基百科上,这将是第一个API调用: https://en.wikipedia.org/w/api.php?action=query&list=allpages&apnamespace=0&format=json&aplimit=500&continue=

...而continue对象将是这样的: "continue":{ "apcontinue":"\"Cigar\"_Daisey", "continue":"-||" }

(根据OP的评论更新,带有示例代码)

您现在想要将continue数组展平为url参数,例如使用`

请在此处查看更完整的说明: https://www.mediawiki.org/wiki/API:Query#Continuing_queries

您的代码的工作版本应该是(使用维基百科进行测试,代码略有不同):

# populate the list of all pages in each namespace

  $baseUrl = 'wiki/api.php?action=query&list=allpages&apnamespace='.$n.'&format=json&limit=500&'; // Increase limit if you are using a bot, up to 5,000
foreach ($nsList as $n) {
  $next = '';
  while ( isset( $next ) ) {
    $urlGET = $baseUrl . $next;
    $json = file_get_contents($urlGET);
    $json_b = json_decode($json, true);
    foreach  ($json_b['query']['allpages'] as $page)
    {
      echo("\n".$page['title']);
      array_push($TitleList, $page["title"]);
    }

    if (isset($json_b['continue'])) {
      $next = http_build_query($json_b['continue']);
    }
  }
}