【Python】pipでwikipediaパッケージを使ってみる(Web API)

python-code python
この記事は約10分で読めます。

前回、pipでHTTP通信ができるライブラリを有する requestsパッケージを使ってみる記事を書きました。

今回は、同じくpipを使って、入力した単語をwikipediaの情報から取得し表示させるというボットを作ってみます。

pipやvenvについては requestsパッケージの記事に書いてありますのでこちらもご参照ください。

WikipediaのAPI

実はWikipediaもWeb APIを公開しています。単語を検索し、該当する情報を取得することができます。

Pythonでは、しっかりそのライブラリがあります。(素晴らしい)

Wikipedia-API
Python Wrapper for Wikipedia

手順としては、以下の簡単4ステップです。

  1. venvで仮想環境に入る
  2. pip3コマンドでパッケージをインストールする
  3. wikipediaコマンド用の関数を作成する
  4. ボットに関数をインポートし、利用できるようにする

PythonでWikipediaを使う

venvで仮想環境に入る

前回の記事で行ったように仮想環境に入ります。

まだ仮想環境を用意していない場合は、以下のコマンドを実行します。

python3 -m venv 任意の環境名

そして、macであれば以下のコマンドを入力し、仮想環境に入ります。

source 作成した環境名(ディレクトリ名)/bin/activate

例
source env/bin/activate

Windowsであれば以下のコマンドを入力し、仮想環境に入ります。

作成した環境名(ディレクトリ名)\Scripts\activate.bat

例
env\Scripts\activate.bat

pip3コマンドでパッケージをインストールする

次にWikipediaのパッケージをインストールします。

pip3コマンドを入力していきます。

pip3 install wikipedia

確認するために listを使います。

pip3 list

出力されたリストに wikipedia があれば、問題なくインストールされています。

wikipediaコマンド用の関数を作成する

wiki.pyというファイルを作成し、以下のように書いていきます。関数名は、wikipedia_commandにしました。Wikipediaで調べたいコマンドをユーザーから受け付けるので、引数にcommandを設定しています。

#  ライブラリのインポート
import wikipedia

#  wikipedia_command関数を作成
def wikipedia_command(command):
    #  キーワードを抜き出す。(入力された内容を分割)
    #  maxsplitで最大分割回数を指定
    cmd, keyword = command.split(maxsplit=1)
    #  言語を指定
    wikipedia.set_lang('ja')
    try:
        #  (.pageメソッド)How To Check If Wiki Page Exists
        page = wikipedia.page(keyword)
        #  (.titleメソッド)ページからタイトルを取得。
        title = page.title
        #  (.summaryメソッド)ページからサマリーを取得。
        summary = page.summary
        response = 'タイトル: {}\n{}'.format(title, summary)
    #  エラー(ページが見つからない場合)の処理
    except wikipedia.exceptions.PageError:
        response = '【{}】ノ意味が見ツカリマセンデシタ'.format(keyword)
    return response

ボットに関数をインポートし、利用できるようにする

前回のrequestsコマンドも入っていますが、そこにwikipediaコマンドも付け足す感じで記載しています。 from wiki import wikipedia_command でインポートを行います。

そして、以下を記載することで、ユーザーが wiki {調べたい言葉} と入力することでAPIが実行されてWikipediaの結果が表示されるようになります。(めっちゃ簡単!!)

    #  もし、 wiki が含まれていたら
    if 'wiki' in command:
        response = wikipedia_command(command)
# eto.pyで定義した、eto_command関数を利用できるようにする。
from eto import eto_command
# random.pyで定義した、choice_command関数とdice_command関数を利用できるようにする。
from random_random import choice_command, dice_command
# datetime.pyで定義した、today_command関数とnow_command関数とweekday_command関数を利用できるようにする。
from date_time import today_command, now_command, weekday_command
# requests_sample.pyで定義した、weather_command関数を利用できるようにする。
from requests_sample import weather_command
# wiki.pyで定義した、wikipedia_command関数を利用できるようにする。
from wiki import wikipedia_command

def heisei_command(command):
    # 文字列を分割して、それぞれ heisei, year_str に代入
    heisei, year_str = command.split()
    # try ~ except : year_str に数字の文字列以外が入力された際の例外処理
    #try: 
    # try ~ except を使わずに例外処理を作る。 isdigit()メソッド
    if year_str.isdigit():
        # int型に変換した year_strを year に代入
        year = int(year_str)
        if year >= 1989 and year < 2020:
            heisei_year = year - 1988
            response = '西暦{}年ハ、平成{}年デス'.format(year, heisei_year)
        else:
            response = '西暦{}年ハ、平成デハアリマセン...'.format(year)
    # 例外として、以下をレスポンスさせる。
    #except ValueError: 
    # try ~ except ではなく、elseで例外処理
    else:
        response = '数値ヲ指定シテクダサイ'
    return response

def len_command(command):
    # 文字列を分割して、それぞれ heisei, year_str に代入
    cmd, text = command.split()
    # int型に変換した year_strを year に代入
    length = len(text)
    response = '文字列ノ長サハ {} 文字デス'.format(length)
    return response

# 別ファイル hello.txt をUTF-8でファイルオープン
command_file = open('hello.txt', encoding='utf-8')
# 開いたファイルを読む
raw_data = command_file.read()
# 読んだファイルを閉じる
command_file.close()
# 行ごとの文字列に分割し、linesに代入
lines = raw_data.splitlines()

# 挨拶用の空の辞書を作成
bot_dict = {}
for line in lines:
    word_list = line.split(',')
    key = word_list[0]
    response = word_list[1]
    bot_dict[key] = response

while True:
    command = input('pybot> ')
    response = ""
    # 例外処理のため try ~ except
    try: 
        for key in bot_dict:
            if key in command:
                response = bot_dict[key]
                break
        # もし平成が含まれていたら
        if '平成' in command:
            response = heisei_command(command)
        # もし長さが含まれていたら
        if '長さ' in command:
            response = len_command(command)
        # もし 干支 が含まれていたら
        if '干支' in command:
            response = eto_command(command)
        # もし 選ぶ が含まれていたら
        if '選ぶ' in command:
            response = choice_command(command)
        # もし さいころ が含まれていたら
        if 'さいころ' in command:
            response = dice_command()
        # もし 今日 が含まれていたら
        if '今日' in command:
            response = today_command()
        # もし 現在 が含まれていたら
        if '現在' in command:
            response = now_command()
        # もし 曜日 が含まれていたら
        if '曜日' in command:
            response = weekday_command(command)
        # もし、天気 が含まれていたら
        if '天気' in command:
            response = weather_command()
        #  もし、 wiki が含まれていたら
        if 'wiki' in command:
            response = wikipedia_command(command)
        if not response:
            response = 'イミワカラン'
        print(response)

        if 'さようなら' in command:
            response = 'サヨウナラ'
            break
    # 上記でなければエラーを返す。
    except Exception as e:
        print('予期セヌ エラーガ 発生シマシタ...')
        print('* 種類:', type(e))
        print('* 内容:', e)

実装が終わったら早速実行してみます。

python3 pybot.py

バッチリとれてますね!

このWikipediaボットは結構面白くて好きです。

まとめ

今回はより具体的なwikipediaの機能実装を行ってきました。ライブラリってすごいですね。ほんの少しコードを追加するだけでWikipediaの機能が使えてしまうのですから。

こういったサードパーティ製パッケージはPyPI(パイピーアイ)というサービスで見つけることができます。(ググってもここにたどり着くことが多いです。)

まだ見たこと無い方は覗いてみてください。

PyPI · The Python Package Index
The Python Package Index (PyPI) is a repository of software for the Python programming language.

参考資料

タイトルとURLをコピーしました