diedatenlaube.github.io

Blog of #DieDatenlaube

View My GitHub Profile

Get all the Gartenlaube Text in Wikisource

Mehr als 15.000 Artikel der Gartenlaube sind Ende 2021 in Wikisource erschlossen, ein vielfaches an Seiten der Illustrierten stehen hinter diesen Artikeln.

Frage

Wie kommt man zum Texttranskript aller Gartenlaube-Artikel in Wikisource? (vgl. https://de.wikisource.org/wiki/Benutzer_Diskussion:Jeb#Gartenlaube_runterladen)

Let’s hack

Die MediaWiki-API bietet eine Vielzahl an Methoden um Daten aus MediaWikis - wie Wikisource - maschinell und im großen Stil zu extrahieren. Für große Projekte wie die Gartenlaube, die letztlich auch so strukturiert sind wie sie strukturiert sind, geht es aber nicht ganz ohne Code.

Was muss vorab beachtet werden?

1. Schritt - Alle Jahrgangskategorien parsen

import requests

S = requests.Session()

URL = "https://de.wikisource.org/w/api.php"

PARAMS = {
    "action": "query",
    "cmtitle": "Kategorie:Die Gartenlaube",
    "cmlimit":500,
    "cmtype": "subcat",
    "list": "categorymembers",
    "format": "json"
}

R = S.get(url=URL, params=PARAMS)
DATA = R.json()

Gartenlaube_SubCat = DATA["query"]["categorymembers"]

#for SubCat in Gartenlaube_SubCat:
#    print(SubCat["title"])

2. Für jede Subkategorie der Gartenlaube, Seiten des “Seite:”-Namespaces abrufen

pages = []
retDict = {}
for SubCat in Gartenlaube_SubCat:
    catPages = []
    PARAMS = {
    "action": "query",
    "cmtitle": SubCat["title"],
    "cmlimit":500,
    "cmtype": "page",
    "cmnamespace":102,
    "list": "categorymembers",
    "format": "json"
    }

    R = S.get(url=URL, params=PARAMS)
    DATA = R.json()

    Gartenlaube_Seiten = DATA["query"]["categorymembers"]

    for Pages in Gartenlaube_Seiten:
        pagedet = {}
        pagedet["pageid"] = Pages["pageid"]
        pagedet["title"] = Pages["title"]
        catPages.append(pagedet)
        #print(Pages["title"])

    try:
        PARAMS["cmcontinue"] = DATA["continue"]["cmcontinue"]
        R = S.get(url=URL, params=PARAMS)
        DATA = R.json()
        Gartenlaube_Seiten = DATA["query"]["categorymembers"]
        for Pages in Gartenlaube_Seiten:
            pagedet = {}
            pagedet["pageid"] = Pages["pageid"]
            pagedet["title"] = Pages["title"]
            catPages.append(pagedet)
            #print(Pages["title"])
    except KeyError:
        pass
    
    retDict[SubCat["title"]]=catPages
    
pages.append(retDict)
#print(pages)

3. Für jede Seite die zugehörigen Text auslesen

import mwparserfromhell
import time
import json

#print(pages[0]["Kategorie:Die Gartenlaube (1853)"])

for page in pages[0]:
    SeitenText = []
    for wikisourcePage in pages[0][page]:
        print(wikisourcePage)
    
        PARAMS = {
        "action": "parse",
        "pageid": wikisourcePage["pageid"],
        "pageid": 197745,
        "prop":"text|wikitext",
        "format": "json"
        }
        R = S.get(url=URL, params=PARAMS)
        DATA = R.json()
        SeitenTextDet = {}
        SeitenTextDet["pageid"] = wikisourcePage["pageid"]
        SeitenTextDet["title"] = wikisourcePage["title"]
        SeitenTextDet["html"] = DATA["parse"]["text"]["*"]
        SeitenTextDet["wikitext"] = DATA["parse"]["wikitext"]["*"]
        wikicode = mwparserfromhell.parse(SeitenTextDet["wikitext"] )
        SeitenTextDet["plaintxt"] = wikicode.strip_code()
        SeitenText.append(SeitenTextDet)

    f = open("output/GartenlaubeSeitenText_"+page+"_"+str(time.time())[0:10]+".json", "w")
    print(json.dumps(SeitenText),file=f)
    f.close()      
        
{'pageid': 180682, 'title': 'Seite:Die Gartenlaube (1853) 001.jpg'}
{'pageid': 197740, 'title': 'Seite:Die Gartenlaube (1853) 002.jpg'}
{'pageid': 197741, 'title': 'Seite:Die Gartenlaube (1853) 003.jpg'}
{'pageid': 197742, 'title': 'Seite:Die Gartenlaube (1853) 004.jpg'}
{'pageid': 197743, 'title': 'Seite:Die Gartenlaube (1853) 005.jpg'}
{'pageid': 197744, 'title': 'Seite:Die Gartenlaube (1853) 006.jpg'}
{'pageid': 197745, 'title': 'Seite:Die Gartenlaube (1853) 007.jpg'}
{'pageid': 197746, 'title': 'Seite:Die Gartenlaube (1853) 008.jpg'}
{'pageid': 197747, 'title': 'Seite:Die Gartenlaube (1853) 009.jpg'}
{'pageid': 197748, 'title': 'Seite:Die Gartenlaube (1853) 010.jpg'}
{...}

4. Merge der Jahrgangs-Files

import glob
import time

read_files = glob.glob("/home/paws/Gartenlaube/output/*.json")
print(read_files)

with open("/home/paws/Gartenlaube/output/GartenlaubeSeiten_Text_"+str(time.time())[0:10]+".json", "wb") as outfile:
    outfile.write(b",".join([open(f, "rb").read() for f in read_files]))

 

Christian Erlinger, 9. Dezember 2021

Creative Commons Lizenzvertrag   Creative Commons Namensnennung 4.0 International Lizenz

Item dieses Artikels: (Q110039103)