[PYTHON] Lassen Sie uns Wiki-Informationen mithilfe der MediaWiki-API abrufen

Guten Morgen: entspannt: Es gibt Zeiten, in denen Sie Informationen über Wikipedia erhalten möchten. Verwenden wir die MediaWiki-API, die in solchen Fällen verwendet werden kann.

Was ist die MediaWiki-API?

Sie können Wiki-Funktionen wie das Hinzufügen, Aktualisieren und Durchsuchen von Anmeldeseiten zum Wiki verwenden.

Offiziell: MediaWiki API

Grundform der API

API: https://ja.wikipedia.org/w/api.php

Indem Sie der obigen URL einen Verarbeitungstyp als Parameter "Aktion" zuweisen, können Sie verschiedene Funktionen wie Suchen und Aktualisieren verwenden. Dieses Mal lernen wir, wie man die grundlegenden Wiki-Informationen "Erfassung (Aktion = Abfrage)" sucht und erhält.

Setzen Sie title = XXX, um den Seitentitel anzugeben und die Informationen für diese Seite abzurufen

getWikiData


import requests
import json


def getWikiData(url, params):
  res = requests.get( url,
                      params = params)
  return res.json()


url      ="https://ja.wikipedia.org/w/api.php"
params = { "action"  : "query",
           "titles"  : "Python",
           "format"  : "json"
         }

print(getWikiData(url,params))

【Ergebnis】

{
 'batchcomplete': '',
  'query': {
    'pages': {
      '993': {
        'pageid': 993, ##Eindeutige ID
        'ns': 0,## nameSpace 
        'title': 'Python' ##Seitentitel
      }
    }
  }
}

Setzen Sie prop = XXX, wenn Sie den erfassten Inhalt hinzufügen

Zum Beispiel ... Wenn Sie grundlegende Informationen auf einer Seite namens "Python" wünschen

Offiziell: prop = info (in)


params = { "action"  : "query",
           "titles"  : "Python",
           "prop"    : "info",
           "format"  : "json"
         }
[Ergebnis] * Faltet sich, weil es etwas lang ist

{
  'batchcomplete': '',
  'query': {
    'pages': {
      '993': {
        'pageid': 993, 
        'ns': 0,
        'title': 'Python',
        'contentmodel': 'wikitext',
        'pagelanguage': 'ja',
        'pagelanguagehtmlcode': 'ja',
        'pagelanguagedir': 'ltr',
        'touched': '2020-09-21T07:44:48Z',
        'lastrevid': 79623671,
        'length': 50355
      }
    }
  }
}

Für jede Requisite können detailliertere Eigenschaften angegeben werden

Zum Beispiel ... Wenn Sie grundlegende Informationen + die Anzahl der Personen anzeigen möchten, die die Seite besucht haben

(Meistens ist [verkürzte Hauptgegenstandsstütze + Stütze] der Gegenstandsname)


params = { "action"  : "query",
           "titles"  : "Python",
           "prop"    : "info",##Stehende Position des Hauptgegenstands
           "inprop"  : "watchers",##Unterposition stehende Position
           "format"  : "json"
         }
Ergebnis * Faltet sich, weil es etwas lang ist

{
  'batchcomplete': '',
  'query': {
    'pages': {
      '993': {
        'pageid': 993,
        'ns': 0,
        'title': 'Python',
        'contentmodel': 'wikitext',
        'pagelanguage': 'ja',
        'pagelanguagehtmlcode': 'ja',
        'pagelanguagedir': 'ltr',
        'touched': '2020-09-21T07:44:48Z',
        'lastrevid': 79623671,
        'length': 50355,
        'watchers': 157 ##Hier
      }
    }
  }
}

Zum Beispiel ... Wenn Sie die "Kategorie" und "Schlüsselelement zum Sortieren" auf der Seite "Python" erhalten möchten

Offiziell: prop = category (cl)

  • Wenn Sie andere Artikel erhalten möchten, lesen Sie die obige Seite.

params = { "action"  : "query",
           "titles"  : "Python",
           "prop"    : "categories",
           "clprop"  : "sortkey",
           "format"  : "json"
         }

Ergebnis * Faltet sich, weil es etwas lang ist

{
  'batchcomplete': '',
  'query': {
    'pages': {
      '993': {
        'pageid': 993,
        'ns': 0,
        'title': 'Python',
        'categories': [
          {
            'ns': 14,
            'title': 'Category:Python',
            'sortkey': '2a0a505954484f4e',
            'sortkeyprefix': '*'
          },
          {
            'ns': 14,
            'title': 'Category:Objektorientierte Sprache',
            'sortkey': '505954484f4e0a505954484f4e',
            'sortkeyprefix': 'PYTHON'
          },
          {
            'ns': 14,
            'title': 'Category:Quelloffene Software',
            'sortkey': '505954484f4e0a505954484f4e',
            'sortkeyprefix': 'PYTHON'
          },
          {
            'ns': 14,
            'title': 'Category:Skriptsprache',
            'sortkey': '505954484f4e0a505954484f4e',
            'sortkeyprefix': 'PYTHON'
          },
          {
            'ns': 14,
            'title': 'Category:Grundlegende Informationstechnikerprüfung',
            'sortkey': 'e381afe38184e3819de382930a505954484f4e',
            'sortkeyprefix': 'Ja'
          },
          {
            'ns': 14,
            'title': 'Category:Artikel mit ungültigen Quellen/2018',
            'sortkey': '420a505954484f4e',
            'sortkeyprefix': 'B'
          }
        ]
      }
    }
  }
}

Setzen Sie list = XXX, um Suchergebnisse in einer Liste zu erhalten

Zum Beispiel ... Um alle Kategorien im Wiki abzurufen

list=allcategories (ac)

  • Wenn Sie andere Artikel erhalten möchten, lesen Sie die obige Seite.

params = { "action"  : "query",
           "titles"  : "Python",
           "list"    : "allcategories", 
           "acprop"  : "size", ##Unterschiedliche Eigenschaften für jede Liste
           "aclimit" :  5, ##Maximale Anzahl von Erfassungen Änderungen des Elementnamens für jede Liste
           "format"  : "json"
         }
Ergebnis * Faltet sich, weil es etwas lang ist


{
  'batchcomplete': '',
  'continue': {
    'accontinue': '.22_LR_firearms',
    'continue': '-||'
  },
  'query': {
    'pages': {
      '993': {
        'pageid': 993,
        'ns': 0,
        'title': 'Python'
      }
    },
    'allcategories': [
      {
        'size': 1,
        'pages': 1,
        'files': 0,
        'subcats': 0,
        '*': '" + afterCat + "'
      },
      {
        'size': 1,
        'pages': 1,
        'files': 0,
        'subcats': 0,
        '*': '" + afterCat + "$2'
      },
      {
        'size': 2,
        'pages': 2,
        'files': 0,
        'subcats': 0,
        '*': '$1'
      },
      {
        'size': 3,
        'pages': 3,
        'files': 0,
        'subcats': 0,
        '*': '((documentation))Seiten mit ungewöhnlicher Verwendung von'
      },
      {
        'size': 9,
        'pages': 9,
        'files': 0,
        'subcats': 0,
        '*': '+Ultra'
      }
    ]
  }
}

Zum Beispiel ... Um eine Liste der Seiten zu erhalten, die in einer bestimmten Kategorie enthalten sind

params = { "action"  : "query",
           "titles"  : "Python",
           "list"    : "categorymembers",
           "cmtitle" : "Category:Objektorientierte Sprache", ##Wenn Sie Kategoriemitglieder verwenden, müssen Sie dies hier einstellen.
           "cmlimit" :  5, ##Maximale Anzahl von Akquisitionen
           "cmprop"  : "ids|title|sortkey",##Gegenstände zu bekommen.[|]Sie können mehrere Trennzeichen angeben.
           "format"  : "json"
         }
Ergebnis * Faltet sich, weil es etwas lang ist
{
  'batchcomplete': '',
  'continue': {
    'cmcontinue': 'page|4345594c4f4e|2496222',
    'continue': '-||'
  },
  'query': {
    'pages': {
      '993': {
        'pageid': 993,
        'ns': 0,
        'title': 'Python'
      }
    },
    'categorymembers': [
      {
        'pageid': 821212,
        'ns': 0,
        'title': 'Vergleich objektorientierter Sprachen',
        'sortkey': '2ae381b2e3818be3818f0ae382aae38396e382b8e382a7e382afe38388e68c87e59091e8a880e8aa9ee381aee6af94e8bc83'
      },
      {
        'pageid': 181337,
        'ns': 0,
        'title': 'ActiveBasic',
        'sortkey': '41435449564542415349430a4143544956454241534943'
      },
      {
        'pageid': 3785500,
        'ns': 0,
        'title': 'Ballerina',
        'sortkey': '42414c4c4552494e41'
      },
      {
        'pageid': 2066745,
        'ns': 0,
        'title': 'Boo (Programmiersprache)',
        'sortkey': '424f4f2028e38397e383ade382b0e383a9e3839fe383b3e382b0e8a880e8aa9e29'
      },
      {
        'pageid': 1503,
        'ns': 0,
        'title': 'C Sharp',
        'sortkey': '43230a43205348415250'
      }
    ]
  }
}

Parameterergänzung

Mehrfachauswahl von Elementen
Infos und Bilder mit Requisite(Holen Sie sich Bildinformationen)Wenn Sie mehrere Artikel erhalten möchten, wie z[|]Kann durch Rohre getrennt werden.
"prop" : "info"|"images"Es wird die Form sein, die Sie sehen möchten.

Rückgabewertzuschlag

ns(namespace)
Der Typ der abgerufenen Seite wird angezeigt.
Inhaltsseite bei ns: 0, Kategorie bei ns: 14
continue
Dieses Element wird erstellt, wenn das diesmal erfasste Ergebnis fortgesetzt wird.
Wenn Sie im Rückgabewert als Argument den Punkt "Kurzform von prop + continue" setzen, können Sie die Daten aus der Fortsetzung abrufen.

Letztes konkretes Beispiel

Beim Erstellen eines Benutzerwörterbuchs für Mecab habe ich den folgenden Code erstellt, um alle Inhaltstitel in der entsprechenden Kategorie zu erhalten.

makeOwaraiList



import requests
import json
import csv
import re

def getWikiData(url, params):
  res = requests.get( url,
                      params = params)
  return res.json()


fileName = "wikiList"
url      ="https://ja.wikipedia.org/w/api.php"
params   = { "action" : "query",
             "list"   : "categorymembers",
             "cmlimit": "50",
             "format" : "json"
           }

categories = ['Japanische Lachkombination','Japanische Frauenlachkombination','Japanische Männer und Frauen lachen Kombination','Japanisches Lachtrio','Japanische Lachgruppe','Japan>Paar lachende Kombination']


with open( fileName + ".csv",'a', encoding="utf-8") as f:
  writer = csv.writer(f)

  for category in categories :
    params['cmtitle'] = 'Category:' + category;
    params['cmcontinue'] = '';
    wikiData = getWikiData(url,params)
    while True:
      for page in wikiData['query']['categorymembers']:
        if page['ns']  == 0:
          title = (re.sub("\(Komödie\)|\(Komödieコンビ\)|\(KomödieTrio\)|\(Talent\)|\(Komödieグループ\)|\(Trio\)|\(Einheit\)|\(Entertainer\)", "" ,page['title'])).strip()
          writer.writerow([title])
      if ('continue' in wikiData and wikiData['continue']['cmcontinue']):
        params['cmcontinue'] = wikiData['continue']['cmcontinue']
        wikiData = getWikiData(url,params)
      else :
        break


Wieder vertraute ich der Formel voll und ganz und studierte und verwendete die API: entspannt: Es gibt viele Situationen, in denen Sie die Informationen im Wiki verwenden können. Wenn Sie diese API beherrschen, macht die Implementierung mehr Spaß.

Recommended Posts