2017-04-19 79 views
0

我有問題,我想用我的wiki中所有頁面的名稱填充一個列表。我的腳本:list = allpages不能提供所有頁面

$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訪問(「隨機現場」測試)。有誰知道,爲什麼會發生這種情況?

+0

跟蹤這種情況下'如果($ NS [」 id']> = 0)' – diavolic

+0

當連接到'apnamespace =' –

回答

1

MediaWiki API不會一次返回所有結果,但可以批量處理。 默認批次只有10頁;您可以指定aplimit更改該值(用戶最多500個,機器人最多5,000個)。

要獲得下一批,您需要指定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']); 
    } 
    } 
} 
+0

感謝您的幫助時,id的-2(Media)和-1(Special)會返回一個錯誤。當我進行下一次API調用時,出現「badcontinue」錯誤。所以我只是將參數保存在變量'$ continue = result ['continue'] ['apcontinue']'中。在下一個循環中,我將這個變量添加到'&continue = $ continue',這導致錯誤「badcontinue」。當我只傳遞'$ continue = result ['continue']' –

+0

時,它不起作用。因此,你需要做的是平坦化返回的「continue」元素並將其每個密鑰對添加到查詢URL。你可以使用像'http_build_query($ json_b ['continue']);''這樣的方法來實現。我會更新我的答案。 –

+0

謝謝,你的回答對我來說是一個很大的幫助。它終於有效!我非常感謝。 –

相關問題