[PYTHON] Obtenons les informations Wiki en utilisant l'API MediaWiki

Bonjour: détendu: Il y a des moments où vous souhaitez obtenir des informations sur wikipedia. Utilisons l'API MediaWiki qui peut être utilisée dans de tels cas.

Qu'est-ce que l'API MediaWiki?

Vous pouvez utiliser des fonctions wiki telles que l'ajout, la mise à jour et la recherche de pages de connexion au wiki.

Officiel: API MediaWiki

Forme de base d'API

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

En donnant à l'URL ci-dessus un type de traitement comme paramètre "action", vous pouvez utiliser diverses fonctions telles que la recherche et la mise à jour. Cette fois, nous allons apprendre comment rechercher et obtenir les informations de base du Wiki "acquisition (action = requête)".

Définissez title = XXX pour spécifier le titre de la page et obtenir les informations pour cette page

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))

【résultat】

{
 'batchcomplete': '',
  'query': {
    'pages': {
      '993': {
        'pageid': 993, ##Identifiant unique
        'ns': 0,## nameSpace 
        'title': 'Python' ##titre de la page
      }
    }
  }
}

Définir prop = XXX lors de l'ajout du contenu acquis

Par exemple ... Si vous voulez des informations de base sur une page appelée "Python"

Officiel: prop = info (in)


params = { "action"  : "query",
           "titles"  : "Python",
           "prop"    : "info",
           "format"  : "json"
         }
[Result] * Se replie car il est un peu long

{
  '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
      }
    }
  }
}

Des propriétés plus détaillées peuvent être spécifiées pour chaque accessoire

Par exemple ... Si vous voulez voir les informations de base + le nombre de personnes qui ont visité la page

(La plupart du temps [accessoire principal raccourci + accessoire] est le nom de l'élément)


params = { "action"  : "query",
           "titles"  : "Python",
           "prop"    : "info",##Position debout de l'élément majeur
           "inprop"  : "watchers",##Position debout du sous-article
           "format"  : "json"
         }
Résultat * Se replie car il est un peu long

{
  '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 ##ici
      }
    }
  }
}

Par exemple ... Si vous souhaitez obtenir la "catégorie" et "l'élément clé pour le tri" inclus dans la page "Python"

Officiel: prop = categories (cl)

  • Si vous souhaitez obtenir d'autres éléments, reportez-vous à la page ci-dessus.

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

Résultat * Se replie car il est un peu long

{
  'batchcomplete': '',
  'query': {
    'pages': {
      '993': {
        'pageid': 993,
        'ns': 0,
        'title': 'Python',
        'categories': [
          {
            'ns': 14,
            'title': 'Category:Python',
            'sortkey': '2a0a505954484f4e',
            'sortkeyprefix': '*'
          },
          {
            'ns': 14,
            'title': 'Category:Langage orienté objet',
            'sortkey': '505954484f4e0a505954484f4e',
            'sortkeyprefix': 'PYTHON'
          },
          {
            'ns': 14,
            'title': 'Category:Logiciels open source',
            'sortkey': '505954484f4e0a505954484f4e',
            'sortkeyprefix': 'PYTHON'
          },
          {
            'ns': 14,
            'title': 'Category:Langage de script',
            'sortkey': '505954484f4e0a505954484f4e',
            'sortkeyprefix': 'PYTHON'
          },
          {
            'ns': 14,
            'title': 'Category:Examen d'ingénieur d'information de base',
            'sortkey': 'e381afe38184e3819de382930a505954484f4e',
            'sortkeyprefix': 'Oui'
          },
          {
            'ns': 14,
            'title': 'Category:Articles contenant des sources non valides/2018',
            'sortkey': '420a505954484f4e',
            'sortkeyprefix': 'B'
          }
        ]
      }
    }
  }
}

Set list = XXX pour obtenir les résultats de la recherche dans une liste

Par exemple ... Pour obtenir toutes les catégories sur le Wiki

list=allcategories (ac)

  • Si vous souhaitez obtenir d'autres éléments, reportez-vous à la page ci-dessus.

params = { "action"  : "query",
           "titles"  : "Python",
           "list"    : "allcategories", 
           "acprop"  : "size", ##Différentes propriétés pour chaque liste
           "aclimit" :  5, ##Nombre maximum d'acquisitions Changements de nom d'article pour chaque liste
           "format"  : "json"
         }
Résultat * Se replie car il est un peu long


{
  '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))Pages avec une utilisation inhabituelle de'
      },
      {
        'size': 9,
        'pages': 9,
        'files': 0,
        'subcats': 0,
        '*': '+Ultra'
      }
    ]
  }
}

Par exemple ... Pour obtenir une liste de pages incluses dans une catégorie spécifique

params = { "action"  : "query",
           "titles"  : "Python",
           "list"    : "categorymembers",
           "cmtitle" : "Category:Langage orienté objet", ##Si vous utilisez des membres de catégorie, vous devez le définir ici.
           "cmlimit" :  5, ##Nombre maximum d'acquisitions
           "cmprop"  : "ids|title|sortkey",##Articles à obtenir.[|]Vous pouvez spécifier plusieurs délimiteurs.
           "format"  : "json"
         }
Résultat * Se replie car il est un peu long
{
  'batchcomplete': '',
  'continue': {
    'cmcontinue': 'page|4345594c4f4e|2496222',
    'continue': '-||'
  },
  'query': {
    'pages': {
      '993': {
        'pageid': 993,
        'ns': 0,
        'title': 'Python'
      }
    },
    'categorymembers': [
      {
        'pageid': 821212,
        'ns': 0,
        'title': 'Comparaison des langages orientés objet',
        'sortkey': '2ae381b2e3818be3818f0ae382aae38396e382b8e382a7e382afe38388e68c87e59091e8a880e8aa9ee381aee6af94e8bc83'
      },
      {
        'pageid': 181337,
        'ns': 0,
        'title': 'ActiveBasic',
        'sortkey': '41435449564542415349430a4143544956454241534943'
      },
      {
        'pageid': 3785500,
        'ns': 0,
        'title': 'Ballerina',
        'sortkey': '42414c4c4552494e41'
      },
      {
        'pageid': 2066745,
        'ns': 0,
        'title': 'Boo (Langage de programmation)',
        'sortkey': '424f4f2028e38397e383ade382b0e383a9e3839fe383b3e382b0e8a880e8aa9e29'
      },
      {
        'pageid': 1503,
        'ns': 0,
        'title': 'C Sharp',
        'sortkey': '43230a43205348415250'
      }
    ]
  }
}

Supplément de paramètres

Sélection multiple d'éléments
info et images avec accessoire(Obtenir des informations sur l'image)Si vous souhaitez obtenir plusieurs éléments tels que[|]Peut être séparé par des tuyaux.
"prop" : "info"|"images"Ce sera la forme que vous souhaitez voir.

Supplément de valeur de retour

ns(namespace)
Le type de page récupérée est affiché.
Page de contenu lorsque ns: 0, catégorie lorsque ns: 14
continue
Cet élément est créé lorsqu'il y a une suite du résultat acquis cette fois.
Si vous définissez l'élément "forme courte de prop + continuer" dans la valeur de retour comme argument, vous pouvez obtenir les données de la suite.

Dernier exemple concret

Lors de la création d'un dictionnaire utilisateur pour mecab, j'ai créé le code suivant pour obtenir tous les titres de contenu inclus dans la catégorie correspondante.

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 = ['Combinaison de rire japonais','Combinaison de rire des femmes japonaises','Combinaison de rire hommes et femmes japonais','Trio de rires japonais','Groupe de rire japonais','Japon>Couple rire combinaison']


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("\(comédie\)|\(comédieコンビ\)|\(comédietrio\)|\(Talent\)|\(comédieグループ\)|\(trio\)|\(unité\)|\(Artiste\)", "" ,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


Encore une fois, j'ai pleinement fait confiance à la formule et j'ai étudié et utilisé l'API: détendu: Il existe de nombreuses situations où vous pouvez utiliser les informations sur le wiki, donc si vous pouvez maîtriser cette API, ce sera plus amusant à mettre en œuvre.

Recommended Posts