2019年1月27日日曜日

PythonでWikimedia APIを使ってWikipediaの記事を取得する

WikipediaにはMediaWikiというAPIがあって記事データなどを取得できる。このAPIとPythonでWikipediaの記事内容を取得してみる。


環境


Raspberry PiとRaspbian Stretch。



エンドポイントとリクエストクエリ


MediaWikiのページにはAPI用のエンドポイントが記載されているが、日本語の場合はhttps://ja.wikipedia.org/w/api.phpを使う。

取得できるデータのフォーマットにはjsonやxmlがあるが、API:データ形式によるとxmlでの取得はこの先廃止されるらしいのでここではjsonで取得する。

APIで記事内容を取得するクエリはAPI:Query/jaのSample queryを参照。ただし、formatはjsonに変更して使用する。

最終的に、以下のようなリクエストを送信する。titlesには取得するページのタイトルを指定する。

https://ja.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&formatversion=2&titles=Main%20Page


APIでWikipediaの記事を取得してみる


以下のコードで「ウィキペディア」ページの記事内容を取得する。

from urllib.request import Request, urlopen
from urllib.parse import urlencode
from urllib.error import URLError, HTTPError
import json

def set_params(page_title):
    params = {
        'action': 'query',
        'prop': 'revisions',
        'rvprop': 'content',
        'titles': page_title,
        'formatversion': 2,
        'format': 'json',
    }

    return params

def main():
    request_url = 'https://ja.wikipedia.org/w/api.php?' + urlencode(set_params('ウィキペディア'))

    req = Request(request_url)

    try:
        with urlopen(req) as res:
            res_json = res.read()
    except HTTPError as e:
        print('HTTPError: {}'.format(e.reason))
    except URLError as e:
        print('URLError: {}'.format(e.reason))
    else:
        wiki = json.loads(res_json.decode('utf-8'))
        print(wiki['query']['pages'][0]['revisions'][0]['content'])

if __name__ == '__main__':
    main()

結果は以下のように、Wikipedia書式(ヘルプ:書式整形)のテキストが得られる。


0 件のコメント:

コメントを投稿