【Python】Wikipediaをスクレイピングしてクイズゲームを作る

スポンサーリンク
PC創作
マイケル
マイケル
みなさんこんばんは!
マイケルです!
エレキベア
エレキベア
クマ〜〜〜〜〜
マイケル
マイケル
今日はPythonを使った簡単なクイズゲームを作っていくよ!
エレキベア
エレキベア
Pythonでゲーム開発は初めてクマね
急にどうしたクマか
マイケル
マイケル
実は最近この参考書にハマっていてね・・・

Pythonでつくる ゲーム開発 入門講座

マイケル
マイケル
入門書ではあるけど、ゲーム作成について
CUIでの表示から本格的なRPG作成
まで幅広く書かれているんだ!
エレキベア
エレキベア
ゲーム開発もPythonも好きなマイケルにはもってこいクマね
マイケル
マイケル
その通り!
基本のロジックを学び直す意味でも、たまにPythonで簡単なゲームを作っていこうと思ったんだ!
エレキベア
エレキベア
Unityは便利クマが内包的な部分も多いクマからね
マイケル
マイケル
便利が故の難点だね。
それじゃさっそく作っていこう!
スポンサーリンク

Wikiクイズゲームの設計

マイケル
マイケル
今回作るのは、 Wikipediaから情報を取得して出題するクイズゲームです!
参考書に載っていたクイズゲームのサンプルに、スクレイピング処理を加えてカスタマイズしたものになります!
マイケル
マイケル
CUIアプリということで、コンソールで出題して解答するだけの簡単なゲームです。
Screenshot 2020 12 24 23 35 52↑CUI上でのクイズゲーム
エレキベア
エレキベア
Wikiから情報を取得するのはいいアイデアクマね
でもどうやって取得するクマ?
マイケル
マイケル
実はWikipediaでは「http://ja.wikipedia.org/wiki/Special:Randompage」
のURLを指定すると、ページをランダムに取得することができるんだ!

この仕組みをうまく使って、
① Wikipediaのページをランダム取得
② スクレイピングで必要な情報を取得し、クイズ形式に加工

という内容で実装しようと思うよ!

エレキベア
エレキベア
なるほどクマ
これなら起動する度に問題も変わって割と遊べそうクマね
マイケル
マイケル
どうなるか楽しみだね!
それじゃ実装に入っていこう!
スポンサーリンク

Wikiクイズゲームの実装

ライブラリのインストール

マイケル
マイケル
まずはPythonで使用するライブラリをインストールします!
今回は、スクレイピング処理でbeautifulsoup4計算処理でnumpyを使用するので下記コマンドでインストールしておきましょう!
pip install numpy
pip install beautifulsoup4
↑ライブラリのインストール

実装

マイケル
マイケル
そして実装は以下の通りです!
出題する問題の数だけWikipediaの情報を取得する内容となっています。
import requests
from bs4 import BeautifulSoup
import numpy as np

# 出題数, 正解数
question_count = 3
answer_count = 0
for i in range(question_count):
    # Wikipediaからランダムページ取得
    load_url = "http://ja.wikipedia.org/wiki/Special:Randompage"
    html = requests.get(load_url)
    soup = BeautifulSoup(html.content, "html.parser")

    # 単語と説明文(一行)を取得
    answer = soup.find("h1").text
    question = soup.find("p").text
    # 説明文の名称部分までのインデックスを取得
    # 検索ワード:「)」「)」「は、」
    index_list = [question.find(')'), question.find(')'), question.find('は、') - 1]
    index_list = [i for i in index_list if i >= 0]
    # 最短の検索結果までの文字列を???で置換
    if len(index_list) > 0:
        index = np.min(index_list)
        question = "??? " + question[index + 1:]

    # 問題出力
    print("[問" + str(i + 1) + "]")
    input_word = input(question)
    if input_word == answer:
        print("正解でやんす")
        answer_count += 1
    else:
        print("残念でした!!")
    print(" 正解 => " + answer + "\n")

print("*** 結果発表 ***\n" + str(answer_count) + "/" + str(question_count) + " 問正解!!")
↑クイズゲームの実装(全体)
エレキベア
エレキベア
コード量も少ないしシンプルな構造クマね
ランダムページ取得処理
マイケル
マイケル
Wikipediaのランダムページ取得はこの通り!
先ほどインストールしたbeautifulsoup4を使って取得しています。
・・・略・・・

    # Wikipediaからランダムページ取得
    load_url = "http://ja.wikipedia.org/wiki/Special:Randompage"
    html = requests.get(load_url)
    soup = BeautifulSoup(html.content, "html.parser")

・・・略・・・
↑クイズゲームの実装(ページ取得)
スクレイピング処理
マイケル
マイケル
そしてメインとなるスクレイピング処理は以下の通りです!
・・・略・・・

    # 単語と説明文(一行)を取得
    answer = soup.find("h1").text
    question = soup.find("p").text
    # 説明文の名称部分までのインデックスを取得
    # 検索ワード:「)」「)」「は、」
    index_list = [question.find(')'), question.find(')'), question.find('は、') - 1]
    index_list = [i for i in index_list if i >= 0]
    # 最短の検索結果までの文字列を???で置換
    if len(index_list) > 0:
        index = np.min(index_list)
        question = "??? " + question[index + 1:]

・・・略・・・
↑クイズゲームの実装(スクレイピング処理)
マイケル
マイケル
Wikipediaのページは以下のようになっているので、
最初のh1、pタグから単語名と説明文を取得しています。
<h1 id="firstHeading" class="firstHeading" lang="ja">【単語】</h1>
・・・略・・・
<div id="bodyContent" class="mw-body-content">
		<p>【説明文】</p>
・・・略・・・
↑Wikipediaページの構造
マイケル
マイケル
あとは説明文内の単語部分を「???」に置き換えて質問文に設定し、
単語を解答に設定
すれば完成です!
エレキベア
エレキベア
お手軽だったクマね〜〜〜〜
スポンサーリンク

おわりに

マイケル
マイケル
よ〜し、それじゃ早速プレイしてみよう!!
01 WikiQuiz↑作ったクイズゲームをプレイ
マイケル
マイケル
むっず〜〜〜〜!!!
かすりもしないよ・・・!!!
エレキベア
エレキベア
(クソゲークマ・・・。)
マイケル
マイケル
ジャンルの絞り込みや、正解の範囲調整など、
調整次第でもっと遊べるようになると思うので、
ぜひみなさんもオリジナルのWikiクイズゲーム作成にもトライしてみてくださいね!
エレキベア
エレキベア
エレキベアも作ってみるクマ〜〜〜〜〜
マイケル
マイケル
それでは今日はこの辺で!
アデュー!!
エレキベア
エレキベア
クマ〜〜〜〜〜〜〜

【Python】Wikipediaをスクレイピング してクイズゲームを作る

コメント