LoginSignup
2
2

More than 3 years have passed since last update.

MediaWikiAPIで記事内容を取得する方法を実例例付きでわかりやすく解説してみた(Python3)

Last updated at Posted at 2020-06-08

経緯

MediaWikiを使ってWikiサイトを作っており、Pythonで更新情報などを取得するためにAPIを探したのですが数個のQiita記事と微妙な翻訳がされたMediaWiki日本語版、英語のMediaWikiしか情報が無かったので今後API活用を考えている人のために記事を書くことにしました。このAPIは基本的にWikipedia以外のMediaWikiサイトにも使えるのでかなり汎用性が高いです。
細かい説明が間違っているかもしれないのとQiita初投稿なので若干読みにくい部分はご了承ください...

使うパラメータ

今回記事内容を取得するのに利用する主要パラメータです。
パラメータに関してはこちらのQiita記事:MediaWiki APIを使ってWikipediaの情報を取得が詳細に紹介しているので記事内容取得以外のこともする場合は参考にすると良いと思います。
注:リンクから叩くこともできるのですが可読性を高めるためにrequestsを使っています。

パラメータ 説明 用例
format 出力フォーマット json,xml... "format":"json"→jsonで出力する
action 操作 query,edit... "action":"query"→取得操作をする
prop 記事構成要素の取得 revisions,links,images... "prop":"revisions"→リビジョンを取得する
title 記事タイトル 記事名 "titles":"ねこ"→「ねこ」という記事を取得する
rvprop 取得する要素 content... "rvprop":"content"→記事本文を取得する
list 記事リストの取得 categorymembers,search... "list":"categorymembers"→カテゴリメンバを取得する
cmtitle カテゴリタイトル カテゴリ名 "cmtitle":"ぬこ"→「ぬこ」カテゴリを取得する
cmlimit 取得上限数 1~500 "cmlimit":"100"→最大100件まで取得する

実装例1

したいこと

MediaWikiで作られたkousokuwiki.orgというサイトで「カテゴリ:千葉県の校則」がついている記事名を取得する。

コード

# coding: UTF-8
from urllib.request import Request, urlopen
from urllib.parse import urlencode
from urllib.error import URLError, HTTPError
import json
import requests
S = requests.Session()
#URLを宣言する.wikipediaの場合は"https://jp.wikipedia.org/w/api.php"となる.
URL = "https://kousokuwiki.org/w/api.php"

#パラメータの設定.
PARAMS = {
    "action": "query",
    "cmtitle": "Category:千葉県の校則",
    "cmlimit": "500",
    "list": "categorymembers",
    "format": "json"
}

#get関数によって情報を取得
R = S.get(url=URL, params=PARAMS)
DATA = R.json()

#jsonから必要なデータの抽出
PAGES = DATA['query']['categorymembers']

#タイトル情報のみ抽出してリストに格納
Return_List=[]
for page in PAGES:
    Return_List.append(page['title'])
print(Return_List)

出力

[千葉県立千葉東高等学校の校則,千葉県立印旛明誠高等学校の校則,千葉県立国分高等学校の校則,千葉県立成田国際高等学校の校則,千葉県立松戸国際高等学校の校則,千葉県立柏の葉高等学校の校則...(以下略)]

実装例2

したいこと

MediaWikiで作られたkousokuwiki.orgというサイトの「千葉県立柏の葉高等学校の校則」という記事の中身を取得する。

コード

# coding: UTF-8
from urllib.request import Request, urlopen
from urllib.parse import urlencode
from urllib.error import URLError, HTTPError
import json
import requests
S = requests.Session()
#URLを宣言する.wikipediaの場合は"https://jp.wikipedia.org/w/api.php"となる.
URL = "https://kousokuwiki.org/w/api.php"

#パラメータの設定.
PARAMS = {
    "action": "query",
    "prop": "revisions",
    "titles": "千葉県立柏の葉高等学校の校則",
    "rvprop": "content",
    "format": "json"
}

#get関数によって情報を取得
R = S.get(url=URL, params=PARAMS)
DATA = R.json()

#jsonから必要なデータの抽出
CONTENT = DATA['query']['pages']

print(CONTENT)

出力

{'61': {'pageid': 61, 'ns': 0, 'title': '千葉県立柏の葉高等学校の校則', 'revisions': [{'contentformat': 'text/x-wiki', 'contentmodel': 'wikitext', '*': '千葉県立柏の葉高等学校(略称:柏の葉高校)は[[千葉県]]に存在する[[公立校|公立]]の[[高等学校]]<br>\n[[表記区分]] 、[[免責事項]]を確認の上ご利用ください。\n\n=基本規定=\n\n{| class="wikitable"\n! 項目\n! 校則\n! 実態\n! 備考\n|-\n| スマホ利用\n| 可能\n| 可能\n| PCも可能\n|-\n| SNS利用\n| 可能\n| 可能\n| 心得の規定はあり\n|-\n| アルバイト\n| 限定\n| 可能\n| 要許可願 実態として成績が悪くなければ可能。シフトは基本午後8時まで、午後10時までに帰宅することが条件(と紙に書いてあった)。けれど紙に書かなくてもバレなきゃ問題ないし(店側が学校に確認の連絡を取らない場合)、時間だって虚偽の申告してもバレなかった。\n|-\n| 運転免許\n| 限定\n| 限定\n| 進路決定後に限り許可願で可能\n|-\n| 校則改正\n| 無規定\n| 不可能\n| 職員が決定\n|}\n\n=頭髪・服装規定=\n{| class="wikitable"\n! 項目\n! 校則\n! 実態\n! 備考\n|-\n| 男子制服\n| colspan="3" |ブレザー\n|-\n| 女子制服\n| colspan="3" |ブレザー+スカート、スラックス可スラックス時のみネクタイ可\n|-\n| 靴類(校外)\n| colspan="3" |黒,茶の革靴又は運動靴\n|-\n| 靴類(校内)\n| colspan="3" |指定の学年色の上履き\n|-\n| 男子靴下\n| colspan="3" |紺又は白のソックス\n|-\n| 女子靴下\n|colspan="3" |黒又は紺のハイソックス\n|-\n| バック\n| colspan="3" |華美でない機能的な高校生らしいもの\n|-\n| 頭髪\n| colspan="3" |パーマ 脱色 染色 カール つけ毛等 禁止\n|-\n| コート類\n| 可能\n| 可能\n|華美でないもの 校舎内では脱ぐ\n|-\n| マフラー類\n| 可能\n| 可能\n| 華美でないもの 校舎内では脱ぐ\n|-\n| セーター類\n| 可能\n| 可能\n| 学校指定のもの\n|-\n| 化粧\n| 不可能\n| 脱\n| 化粧 マニキュア ピアス カラコン 装飾品は一切禁止\n|}\n\n=その他規定=\n\n=条文抜粋=\n[[Category:千葉県の校則]]'}]}}

必要に応じてさらにほしい情報のみにスライスしてください。

終わりに

日本語情報が乏しいMediaWikiAPIを実例付きで解説させていただきました。今後別のパラメータの解説と実装例を追加するかもしれません!皆様のお役に立てれば幸いです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2