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の記事を取得してみる


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 件のコメント:

コメントを投稿