API:Continue/de
MediaWiki Version: | ≥ 1.26 |
Sehr oft erhältst du nicht alle gewünschten Daten in einer einzigen API-Abfrage.
In diesem Fall fügt die API ein zusätzliches Element (mit der Bezeichnung continue
) an die Ergebnisse an, um anzuzeigen, dass weitere Daten existieren.
Das Element, das zurückgegeben wird, besteht aus zwei Teilen: Der eine Teil ist ein Unterelement, das zudem den Namen continue
trägt.
In der Regel ist damit ein Wert verbunden, der die Symbole ||
enthält, wenn Daten zum Fortfahren existieren.
Der zweite Teil ist ein Subelement (oder mehrere Subelemente), dessen Titel die Abkürzung des in der Abfrage verwendeten Liste ist, dem das Wort continue
vorangestellt ist.
(So wäre zum Beispiel das Unterelement für eine Abfrage mit categorymembers cmcontinue
, das Unterelement für eine Abfrage mit allcategories accontinue
, das Unterelement für eine Abfrage mit protectedtitles ptcontinue
usw.)
Um weitere Daten abzurufen, wenn das Element continue
vorhanden ist, musst du das zweite Unterelement als Parameter zur nächsten API-Anfrage hinzufügen.
Wenn zum Beispiel eine Abfrage mit der Liste allcategories zusätzliche Ergebnisse enthält, sollte die nächste API-Abfrage accontinue=
als Parameter enthalten, zusammen mit dem Wert von accontinue
in den Ergebnissen der ersten Abfrage.
Um alle Ergebnisse zu erhalten, kann dies so lange wiederholt werden, bis ein API-Ergebnis kein continue
Element in den Ergebnissen hat, was bedeutet, dass keine Daten mehr existieren, die der Abfrage entsprechen.
batchcomplete
Wenn du eine API-Anfrage mit einem Generator zusammen mit Eigenschaften stellst, kann das API-Ergebnis signalisieren, dass du fortfahren sollst, weil noch mehr Eigenschaften für die bisherigen Seiten abgerufen werden müssen (in diesem Fall wird derselbe Satz von Seiten zurückgegeben, jedoch mit dem nächsten Satz von Eigenschaften), weil mehr Seiten aus dem Generator vorhanden sind, oder beides.
Ab Version 1.25 gibt die API ein batchcomplete
Element zurück, um anzuzeigen, dass alle Daten für den aktuellen "Stapel" von Seiten zurückgegeben wurden, und das Element continue
enthält keine Fortsetzungsdaten für Eigenschaften, sondern kann stattdessen Fortsetzungsdaten für den Generator enthalten.
Dies kann nützlich sein, um zu vermeiden, dass eine kombinierte Ergebnismenge für Tausende von Seiten festgelegt wird, wenn ein Generator zusammen mit Prop-Modulen verwendet wird, die ihrerseits eine Fortsetzung benötigen können.
Abwärtskompatibilität von continue
MediaWiki Version: | ≥ 1.9 |
Von MediaWiki 1.21 bis 1.25 war es erforderlich, continue=
(d.h. mit einem leeren String als Wert) in der ersten Anfrage anzugeben, um Fortsetzungsdaten in dem oben beschriebenen Format zu erhalten.
Ohne dies zu tun, würden die API-Ergebnisse anzeigen, dass zusätzliche Daten existieren, indem sie ein Element query-continue
zurückgeben, wie in Raw query continue erklärt.
Vor 1.21 war diese rohe Fortsetzung die einzige Option.
Wenn deine Anwendung die Raw-Fortsetzung in MediaWiki 1.26 oder später verwenden muss, musst du rawcontinue=
angeben, um sie anzufordern.
Beispiele
Beispiel 1: Fortsetzung von allcategories
allcategories
Liste , um Ergebnisse anzufordern, die das vorgegebene Limit überschreiten und daher fortgesetzt werden müssen, um weitere Ergebnisse zu liefern. Da die Liste allcategories
verwendet wird, heißt das zweite Unterelement von continue
accontinue
.Ergebnis |
---|
"continue": {
"accontinue": "List_of_19th_century_baseball_players",
"continue": "-||"
},
"batchcomplete": "",
"query": {
"allcategories": [
{
"*": "List of"
},
{
"*": "List of Palestinians"
},
{
"*": "List of \"M\" series military vehicles"
},
{
"*": "List of ''The Fast and the Furious'' characters"
},
{
"*": "List of 100 Deeds for Eddie McDowd"
},
{
"*": "List of 1919 Actors"
},
{
"*": "List of 1972 births"
},
{
"*": "List of 1999 ballet premieres"
},
{
"*": "List of 19th-century Russian artists"
},
{
"*": "List of 19th century Russian artists"
}
]
}
}
|
Beispiel 2: Fortsetzung von categorymembers
categorymembers
Liste , um Ergebnisse anzufordern, die die Grenze (cmlimit
) überschreiten und daher fortgesetzt werden müssen, um weitere Ergebnisse zu liefern. Beachte, dass durch die Verwendung der Liste categorymembers
das zweite Unterelement von continue
den Namen cmcontinue
trägt.Ergebnis |
---|
{
"batchcomplete": true,
"continue": {
"cmcontinue": "page|2a2a4c4e2a402a443e382a403a30011201dc11|21583092",
"continue": "-||"
},
"query": {
"categorymembers": [
{
"pageid": 3801230,
"ns": 10,
"title": "Template:User history"
},
{
"pageid": 7769732,
"ns": 10,
"title": "Template:User history2"
},
{
"pageid": 56312624,
"ns": 10,
"title": "Template:User history3"
},
{
"pageid": 8364349,
"ns": 2,
"title": "User:-1348-"
},
{
"pageid": 12553892,
"ns": 2,
"title": "User:(RT)"
},
{
"pageid": 60272884,
"ns": 2,
"title": "User:MPSHeritage"
},
{
"pageid": 42055428,
"ns": 2,
"title": "User:Tyssil"
},
{
"pageid": 10356432,
"ns": 2,
"title": "User:1GoodNight4Life"
},
{
"pageid": 59180278,
"ns": 2,
"title": "User:1I0I1I0I1I0"
},
{
"pageid": 51651783,
"ns": 2,
"title": "User:01iproject09"
},
{
"pageid": 29595961,
"ns": 2,
"title": "User:3family6"
},
{
"pageid": 43181830,
"ns": 2,
"title": "User:3family6/Education and interests"
},
{
"pageid": 17919048,
"ns": 2,
"title": "User:03md"
},
{
"pageid": 44202586,
"ns": 2,
"title": "User:4Sage Wiki"
},
{
"pageid": 64607473,
"ns": 2,
"title": "User:05Pier"
},
{
"pageid": 46626298,
"ns": 2,
"title": "User:16pedia2"
},
{
"pageid": 33371141,
"ns": 2,
"title": "User:17adavis7"
},
{
"pageid": 15797963,
"ns": 2,
"title": "User:21stCenturyGreenstuff"
},
{
"pageid": 61571792,
"ns": 2,
"title": "User:28regiment"
},
{
"pageid": 17053340,
"ns": 2,
"title": "User:37ophiuchi"
},
{
"pageid": 9781448,
"ns": 2,
"title": "User:88wolfmaster"
},
{
"pageid": 17120424,
"ns": 2,
"title": "User:88wolfmaster/Userboxes"
},
{
"pageid": 16369371,
"ns": 2,
"title": "User:123w456t"
},
{
"pageid": 69413683,
"ns": 2,
"title": "User:296cherry"
},
{
"pageid": 41449363,
"ns": 2,
"title": "User:636Buster"
},
{
"pageid": 8451054,
"ns": 2,
"title": "User:1549bcp"
},
{
"pageid": 26153484,
"ns": 2,
"title": "User:1951bfrj"
},
{
"pageid": 28820985,
"ns": 2,
"title": "User:11614soup"
},
{
"pageid": 69602489,
"ns": 2,
"title": "User:16272js"
},
{
"pageid": 9578722,
"ns": 2,
"title": "User:A Geographer"
},
{
"pageid": 36155511,
"ns": 2,
"title": "User:A knyght ther was"
},
{
"pageid": 6637293,
"ns": 2,
"title": "User:A student of history"
},
{
"pageid": 22308356,
"ns": 2,
"title": "User:A Werewolf"
},
{
"pageid": 39893010,
"ns": 2,
"title": "User:A. Pseudonym"
},
{
"pageid": 36267514,
"ns": 2,
"title": "User:A.Aboumrad"
},
{
"pageid": 8475873,
"ns": 2,
"title": "User:A.Arc"
},
{
"pageid": 5283037,
"ns": 2,
"title": "User:A.J.Chesswas"
},
{
"pageid": 26516505,
"ns": 2,
"title": "User:A.kamburov"
},
{
"pageid": 40306753,
"ns": 2,
"title": "User:A.sky245"
},
{
"pageid": 6320018,
"ns": 2,
"title": "User:A.Zhubrovsky"
},
{
"pageid": 68777172,
"ns": 2,
"title": "User:A2Bros"
},
{
"pageid": 26764821,
"ns": 2,
"title": "User:A2soup"
},
{
"pageid": 68203375,
"ns": 2,
"title": "User:A0231050705"
},
{
"pageid": 26356724,
"ns": 2,
"title": "User:Aaa8841"
},
{
"pageid": 61127272,
"ns": 2,
"title": "User:Aaghi"
},
{
"pageid": 5410981,
"ns": 2,
"title": "User:Aak044"
},
{
"pageid": 23936323,
"ns": 2,
"title": "User:Aardvarkzz"
},
{
"pageid": 2934321,
"ns": 2,
"title": "User:Aaron of Mpls"
},
{
"pageid": 40974272,
"ns": 2,
"title": "User:Aaron-Kocourek"
},
{
"pageid": 13618776,
"ns": 2,
"title": "User:Aaroncorey"
}
]
}
}
|
Beispiel 3: Python-Code zum Iterieren durch alle Ergebnisse
Hier ist ein Python-Code, der zeigt, wie man über Abfrageergebnisse iteriert (unter Verwendung der Python requests Bibliothek).
Beachte, dass du die Werte, die im Element continue
zurückgegeben werden, nicht manipulieren oder von ihnen abhängig machen solltest, da sie sich ändern können.
for result in query({'generator': 'allpages', 'prop': 'links'}):
# process result data
...
def query(request):
request['action'] = 'query'
request['format'] = 'json'
last_continue = {}
while True:
# Clone original request
req = request.copy()
# Modify it with the values returned in the 'continue' section of the last result.
req.update(last_continue)
# Call API
result = requests.get('https://en.wikipedia.org/w/api.php', params=req).json()
if 'error' in result:
raise Exception(result['error'])
if 'warnings' in result:
print(result['warnings'])
if 'query' in result:
yield result['query']
if 'continue' not in result:
break
last_continue = result['continue']