Es werden alle Artikel und alle Unterkategorien aus einem Namensraum namespace
identifiziert, die in der Kategorie cattitle
eingeordnet sind. namespace=0
entspricht dem Artikelnamensraum, also den “normalen” Wikipedia-Artikeln. namespace=14
entspricht dem Kategoriennamensraum. Eine Dokumentation der Namensräume findet sich hier: http://www.mediawiki.org/wiki/Manual:Namespace. Eine Dokumentation der Parameter für den API Aufruf GET(..., query=list(...))
findet sich hier: https://www.mediawiki.org/wiki/API:Categorymembers.
f_get_cats = function(cattitle, language="de", limit=500, cmnamespace="0|14", verbose=F, output="names") {
domain = paste0("http://", language, ".wikipedia.org/w/api.php") #URL der API einer Wikipedia-Sprachversion
cmtitle = paste0("Category:", cattitle)
dmp = GET(domain, query=list( #Konstruktion des API Aufrufs
format = "json",
action = "query",
list="categorymembers",
cmtitle = cmtitle,
cmprop = "title|ids|timestamp|type",
cmtype = "page|subcat",
cmnamespace = cmnamespace,
cmlimit = limit))
ctr = 1
if (verbose) print(ctr) # verbose: Sichtbarer Count der Loops
dmp = content(dmp, as = "text") #Abruf des Ergebnisses der API Abfrage
dmp = RCurl:::mapUnicodeEscapes(dmp) #Codierung der Unicode Escape Characters
dmp = fromJSON(dmp) #Umwandlen des json Objekts in R kompatible Daten
cat_content = list(pages=subset(dmp$query$categorymembers, type=="page"), subcats=subset(dmp$query$categorymembers, type=="subcat")) #Liste mit Seiten und mit Unterkategorien
# Die API gibt in einem Aufruf "cmlimit" (maximal 500) Seiten/Unterkategorien zurück. Wenn es weitere Seiten/Unterkategorien gibt, wird ein Code geliefert, der angibt, wo ein weiterer Abruf beginnen muss. So lange ein solcher Code zurückgegeben wird, führen wir weitere Abrufe aus, bis alle Seiten gesammelt wurden.
while (!is.null(dmp$"query-continue"$categorymembers$cmcontinue)) {
dmp = GET(domain, query=list(
format = "json",
action = "query",
list="categorymembers",
cmtitle = cmtitle,
cmprop = "title|ids|timestamp|type",
cmtype = "page|subcat",
cmnamespace = cmnamespace,
cmcontinue = dmp$"query-continue"$categorymembers$cmcontinue,
cmlimit = limit))
ctr = ctr+1
if (verbose) print(ctr)
dmp = content(dmp, as = "text")
dmp = RCurl:::mapUnicodeEscapes(dmp)
dmp = fromJSON(dmp)
cat_content = list(pages=rbind(cat_content[[1]], subset(dmp$query$categorymembers, type=="page")), subcats=rbind(cat_content[[2]], subset(dmp$query$categorymembers, type=="subcat"))) # Neu abgerufene Seiten/Unterkategorien zu bisher abgerufenen Seiten/Unterkategorien hinzufügen
}
cat_content[[2]]$title = stri_sub(cat_content[[2]]$title, stri_locate_first_fixed(cat_content[[2]]$title, ":")[,1]+1, stri_length(cat_content[[2]]$title)) #Aufbereiten der Namen der Seiten/Unterkategorien
if (output=="names") cat_content = list(pages=cat_content$pages$title, subcats=cat_content$subcats$title) # Löschen aller anderen Informationen außer Titel der Seiten/Unterkategorien
cat_content
}
Seiten und Unterkatorien in der Kategorie:Krankheit
f_get_cats(cattitle = "Krankheit", language = "de", verbose = F, output = "names")
## $pages
## [1] "Krankheit"
## [2] "Liste der Syndrome"
## [3] "Morbus"
## [4] "Adenitis"
## [5] "Angina"
## [6] "Cannabis-Hyperemesis-Syndrom"
## [7] "Erythromelalgie"
## [8] "Exposom"
## [9] "Golfkriegssyndrom"
## [10] "Hämopyrrollaktamurie"
## [11] "Höhenkrankheit"
## [12] "Insuffizienz"
## [13] "Interkurrente Erkrankung"
## [14] "Katarrh"
## [15] "Krankenabendmahl"
## [16] "Krankheitskonzept"
## [17] "Lipödem"
## [18] "Manifest (Medizin)"
## [19] "Obstruktion (Medizin)"
## [20] "Obturation"
## [21] "Okklusion (Medizin)"
## [22] "Penetration (Medizin)"
## [23] "Phrenitis"
## [24] "Retention (Medizin)"
## [25] "Schizoaffektive Störung"
## [26] "Schwarze Haarzunge"
## [27] "Sick-Building-Syndrom"
## [28] "Simulator Sickness"
## [29] "Skrofulose"
## [30] "Spontanheilung"
## [31] "Vielfache Chemikalienunverträglichkeit"
##
## $subcats
## [1] "Autoimmunerkrankung"
## [2] "Ernährungsbedingte Erkrankung"
## [3] "Genetische Störung"
## [4] "Infektionskrankheit"
## [5] "Stoffwechselkrankheit"
## [6] "Strahlenbedingte Erkrankung"
## [7] "Tumor"
## [8] "Berufskrankheit"
## [9] "Krankheitssymptom"
## [10] "Krankheitsbild oder Komplikation in der Anästhesie"
## [11] "Krankheitsbild in der Augenheilkunde"
## [12] "Krankheitsbild in der Chirurgie"
## [13] "Krankheitsbild in der Dermatologie"
## [14] "Krankheitsbild in Gynäkologie und Geburtshilfe"
## [15] "Krankheitsbild in der Hals-Nasen-Ohren-Heilkunde"
## [16] "Krankheitsbild in der Inneren Medizin"
## [17] "Krankheitsbild in der Intensivmedizin"
## [18] "Krankheitsbild in der Kinderheilkunde"
## [19] "Krankheitsbild in der Proktologie"
## [20] "Krankheitsbild in der Neurologie"
## [21] "Krankheitsbild in der Notfallmedizin"
## [22] "Krankheitsbild in der Nuklearmedizin"
## [23] "Krankheitsbild in Orthopädie und Unfallchirurgie"
## [24] "Pflanzenkrankheit"
## [25] "Krankheitsbild in Phoniatrie und Pädaudiologie"
## [26] "Krankheitsbild in der Psychiatrie"
## [27] "Seltene Krankheit"
## [28] "Sexuelle Dysfunktion"
## [29] "Krankheitsbild in der Sportmedizin"
## [30] "Krankheitsbild in der Urologie"
## [31] "Krankheitsbild in der Veterinärmedizin"
## [32] "Krankheitsbild in der Zahnmedizin"
Ausgehend von einer Startkategorie start_cat
startet ein Loop. Für eine Startkategorie werden von allen Unterkategorien die Seiten und Unterkategorien gesammelt. Das Vorgehen wird für alle neu gefundenen Unterkategorien wiederholt. Da die Kategorien in der Wikipedia sehr tief verschachtelt oder thematisch inkonsisten sein können, kann ein looplimit
gesetzt werden, nach dem das Vorgehen abgebrochen wird. So können übermäßig lange Suchläufe unterbunden werden.
f_loop_subcats = function(start_cat, language="de", limit=500, looplimit=Inf) {
content_dmp = f_get_cats(start_cat, language, limit, verbose, output = "names") #Seiten/Unterkategorien der ersten Kategorie
page_dmp = list(content_dmp$pages) #Sammeln der Seiten in erster Kategorie
names(page_dmp) = start_cat # Benennen der Liste von Seiten nach Kategorie
cat_dmp = content_dmp$subcats # Sammeln der Unterkategorien auf erster Seite
cat_chk = as.character() # Leerer Container als "Checkliste" für bereits behandelte Kategorien
loopcount = 1 # Setzen des Loopcount für Looplimit
while (length(cat_dmp > 0)) { # Wiederhole, solange es noch Unterkategorien gibt
cat_dmp = cat_dmp[!cat_dmp %in% cat_chk] #Aussortieren von Kategorien, die bereits abgefragt wurden (1)
cat_chk = unique(c(cat_chk, cat_dmp)) #Aussortieren von Kategorien, die bereits abgefragt wurden (2)
content_dmp = lapply(cat_dmp, function(i) { #Abrufen für neu gefundene Kategorien
tryCatch(f_get_cats(cattitle = i, language, limit, verbose), error=function(e) NULL)
})
names(content_dmp) = cat_dmp #Bennenen der Listen
page_dmp = c(page_dmp, lapply(content_dmp, function(i) i$pages)) # Neu abgerufene Seiten zu bisher abgerufenen Seiten hinzufügen
cat_dmp = unique(unlist(lapply(content_dmp, function(i) i$subcats))) # Neu gefundene Kategorien für nächste Abfragen sammeln
loopcount = loopcount+1
if(loopcount>=looplimit) break # Abbrechen, falls Looplimit erreicht wurde
}
page_dmp #Ausgabe einer Liste mit allen Seiten
}
Seiten und Unterkatorien in der Kategorie:Krankheit
sample.kat_krnkht = f_loop_subcats(start_cat = "Krankheit", language = "de")
length(sample.kat_krnkht) #Zahl der abgerufenen Kategorien
## [1] 175
length(unique(unlist(sample.kat_krnkht))) #Zahl der Seiten
## [1] 6225
sample.kat_krnkht[1:3]
## $Krankheit
## [1] "Krankheit"
## [2] "Liste der Syndrome"
## [3] "Morbus"
## [4] "Adenitis"
## [5] "Angina"
## [6] "Cannabis-Hyperemesis-Syndrom"
## [7] "Erythromelalgie"
## [8] "Exposom"
## [9] "Golfkriegssyndrom"
## [10] "Hämopyrrollaktamurie"
## [11] "Höhenkrankheit"
## [12] "Insuffizienz"
## [13] "Interkurrente Erkrankung"
## [14] "Katarrh"
## [15] "Krankenabendmahl"
## [16] "Krankheitskonzept"
## [17] "Lipödem"
## [18] "Manifest (Medizin)"
## [19] "Obstruktion (Medizin)"
## [20] "Obturation"
## [21] "Okklusion (Medizin)"
## [22] "Penetration (Medizin)"
## [23] "Phrenitis"
## [24] "Retention (Medizin)"
## [25] "Schizoaffektive Störung"
## [26] "Schwarze Haarzunge"
## [27] "Sick-Building-Syndrom"
## [28] "Simulator Sickness"
## [29] "Skrofulose"
## [30] "Spontanheilung"
## [31] "Vielfache Chemikalienunverträglichkeit"
##
## $Autoimmunerkrankung
## [1] "Autoimmunerkrankung"
## [2] "Antiphospholipid-Syndrom"
## [3] "Autoimmunhämolytische Anämie"
## [4] "Autoimmunthyreopathie"
## [5] "Blasenbildende Autoimmundermatosen"
## [6] "Bullöses Pemphigoid"
## [7] "Chronisch inflammatorische demyelinisierende Polyneuropathie"
## [8] "Chronische Immun-Thrombozytopenie"
## [9] "Churg-Strauss-Syndrom"
## [10] "Colitis ulcerosa"
## [11] "CREST-Syndrom"
## [12] "Degos-Syndrom"
## [13] "Dermatitis herpetiformis Duhring"
## [14] "Diabetes mellitus"
## [15] "Endokrine Orbitopathie"
## [16] "Erworbene isolierte aplastische Anämie"
## [17] "Evans-Syndrom"
## [18] "Experimentelle autoimmune Enzephalomyelitis"
## [19] "Gastritis"
## [20] "Glomerulonephritis"
## [21] "Goodpasture-Syndrom"
## [22] "Granulomatose mit Polyangiitis"
## [23] "Hashimoto-Thyreoiditis"
## [24] "Hughes-Stovin-Syndrom"
## [25] "Idiopathische thrombozytopenische Purpura"
## [26] "Immunkomplexvaskulitis"
## [27] "Insulitis"
## [28] "Kollagenose"
## [29] "Konzentrische Sklerose Baló"
## [30] "Kutane leukozytoklastische Angiitis"
## [31] "LADA"
## [32] "Lambert-Eaton-Rooke-Syndrom"
## [33] "Lichen sclerosus"
## [34] "Limbische Enzephalitis"
## [35] "Lupus erythematodes"
## [36] "Mikroskopische Polyangiitis"
## [37] "Morbus Basedow"
## [38] "Morbus Crohn"
## [39] "Multiple Sklerose"
## [40] "Myasthenia gravis"
## [41] "Nebennierenrindeninsuffizienz"
## [42] "Neuromyelitis optica"
## [43] "PANDAS"
## [44] "Pemphigoides gestationis"
## [45] "Pemphigus foliaceus"
## [46] "Pemphigus vulgaris"
## [47] "Perniziöse Anämie"
## [48] "Pityriasis"
## [49] "Pityriasis lichenoides et varioliformis acuta"
## [50] "Poliosis"
## [51] "Polyarteriitis nodosa"
## [52] "Polychondritis"
## [53] "Polyendokrine Autoimmunerkrankungen"
## [54] "Polymyalgia rheumatica"
## [55] "Primär biliäre Zirrhose"
## [56] "Psoriasisarthritis"
## [57] "Purpura Schönlein-Henoch"
## [58] "Pyoderma gangraenosum"
## [59] "Rasmussen-Enzephalitis"
## [60] "Reaktive Arthritis"
## [61] "Sakroiliitis"
## [62] "Schuppenflechte"
## [63] "Sharp-Syndrom"
## [64] "Sjögren-Syndrom"
## [65] "Sklerodermie"
## [66] "Spondylitis ankylosans"
## [67] "Stiff-man-Syndrom"
## [68] "Sympathische Ophthalmie"
## [69] "Takayasu-Arteriitis"
## [70] "Transverse Myelitis"
## [71] "Vaskulitis"
## [72] "Vitiligo"
## [73] "Vogt-Koyanagi-Harada-Syndrom"
##
## $`Ernährungsbedingte Erkrankung`
## [1] "Liste der endokrinen, Ernährungs- und Stoffwechselkrankheiten nach ICD-10"
## [2] "Adipositas"
## [3] "Balkan-Nephropathie"
## [4] "Eisenmangel"
## [5] "Erdnussallergie"
## [6] "Fehlernährung"
## [7] "Glutamat-Unverträglichkeit"
## [8] "Hypervitaminose"
## [9] "Hypervitaminose D"
## [10] "Inanition"
## [11] "Intestinale Fruktoseintoleranz"
## [12] "Jodmangel"
## [13] "Kachexie"
## [14] "Kaninchenhunger"
## [15] "Kaschin-Beck-Krankheit"
## [16] "Keshan-Krankheit"
## [17] "Kretinismus"
## [18] "Kuhmilchallergie"
## [19] "Kupfermangel"
## [20] "Kwashiorkor"
## [21] "Laktoseintoleranz"
## [22] "Lipomastie"
## [23] "Magnesiummangel"
## [24] "Mangelerkrankung"
## [25] "Mangelernährung"
## [26] "Marasmus"
## [27] "Nahrungsdeprivation"
## [28] "Nahrungsmittelallergie"
## [29] "Plummer-Vinson-Syndrom"
## [30] "Pyridoxinmangel"
## [31] "Sekundäre Nahrungsmittelallergie"
## [32] "Selenmangel"
## [33] "Selenose"
## [34] "Stammfettsucht"
## [35] "Überernährung"
## [36] "Unterernährung"
## [37] "Untergewicht"
## [38] "Zöliakie"