如何在维基百科api上使用eicontinue参数?

时间:2017-08-02 12:59:12

标签: javascript jquery wikipedia wikipedia-api

我试图了解eicontinue参数的工作原理,文档说:

eicontinue: Used to continue a previous request and eicontinue

如果有更多结果,请使用此选项继续。

就是这样。基本上维基百科限制500个电话,或5000个机器人。我希望使用该参数,以便在完成后进行新的调用。为此,我正在检查循环找到的最后一篇文章的last id

newQuery();
function newQuery() {
  console.log(JSON.stringify(JSON.parse(JSON.stringify(spacetime)), null, 4));
  jQuery.getJSON("https://en.wikipedia.org/w/api.php?action=query&list=embeddedin&eicontinue=2|"+myId+"&eilimit=500&noimages=true&mobileformat=true&eititle=Template:Infobox&callback=?", {
    disablelimitreport: true,
    format: "json"
  }, function(data) {
    $.each(data.query.embeddedin, function(i, item) {
      counter++;
      curTitle = item.title;
      if (i===data.query.embeddedin.length-1) {
        myId = item.pageid;
        myTitle = item.title;
      }
      wikiText();
    });
  });
}

The documentation非常差,我可以在网上找到我应该做的事情:

eicontinue=2|"+myId+"

哪个好,但我不明白的是:2参数是什么? eicontinue=2|"

如果我删除了,我得到:

Cannot read property 'embeddedin' of undefined

我继续embeddedin parameter page阅读更多信息,但它没有多大帮助。

在文档页面上,有an example,结果是:

{
    "batchcomplete": "",
    "continue": {
        "eicontinue": "2|4571809",
        "continue": "-||"
    },
    "query": {
        "embeddedin": [
            {
                "pageid": 2428176,
                "ns": 0,
                "title": "Congelation"
            },
            {
                "pageid": 2581310,
                "ns": 2,
                "title": "User:Rpyle731/sandbox/archive1"
            },
            {
                "pageid": 2621895,
                "ns": 0,
                "title": "Battledore and shuttlecock"
            },
            {
                "pageid": 2710517,
                "ns": 1,
                "title": "Talk:Scott Fahlman"
            },
            {
                "pageid": 3954860,
                "ns": 3,
                "title": "User talk:PBS/Archive 6"
            }
        ]
    }
}

从那里我可以看到:

"continue": {
        "eicontinue": "2|4571809",
        "continue": "-||"
    },

哪个更令人困惑,看起来它同时使用了eicontinuecontinue-||,但未在文档中列出,我无法理解。再次,数字2|

2 个答案:

答案 0 :(得分:1)

我对Javascript的了解非常有限,我甚至还没有开始研究使用MediaWiki API的细节。但是,您可能有必要知道我发现了什么,以便我可以使用Python。

由于你提到的那个文档页面说Embeddedin可以用作生成器,你有两个选择:所谓的原始查询延续'或发电机继续。

在第一个选项(' raw continuation')下对Embeddedin进行简单的第一次调用将是:

https://en.wikipedia.org/w/api.php?action=query&list=embeddedin&eititle=Template:Infobox&eilimit=5

检查此调用的结果我可以看到eicontinue的值为"0|324"。然后第二次调用,对于下一批结果将是,

https://en.wikipedia.org/w/api.php?action=query&list=embeddedin&eititle=Template:Infobox&eilimit=5&eicontinue=0|324

IOW,每次只将结果中的eicontinue值作为参数粘贴。

然而,MediaWiki建议反对原始延续。

更好的选择:Embeddedin作为生成器。

在开发这个答案时,我提醒MediaWiki并不像文档所暗示的那样难以理解。如果您可以接近正确的请求,引擎会指出可以帮助您进行更正的错误。

这是第一次调用嵌入式模板。

https://en.wikipedia.org/w/api.php?action=query&geititle=Template:Infobox&format=jsonfm&prop=info&generator=embeddedin&=inprop=url&geilimit=5

我第一次尝试使用gpllimit=5并且引擎抱怨它无法识别此参数。迟早我会记得发电机参数是(或似乎)与前缀为' g'的相应原始参数相同。

检查输出很简单,因为我使用了jsonfm格式,我发现必须在原始网址的末尾粘贴&geicontinue=0|324才能获得下一批结果。

而且,是的,文档是令人费解的。

答案 1 :(得分:0)

做一些像

这样的事情
var query = {
    action: 'query',
    // etc
};
var promise = jQuery.getJSON(url, query);
function processBatch(data) {
    process(data); // process next batch of data
    if (!data.continue) {
        return jQuery.Deferred().resolve();
    }
    jQuery.extend(query, data.continue); // add/replace continue parameters
    return jQuery.getJSON(url, query).then(processBatch); // recurse
});
promise.then(processBatch);