CONTENTS コンテンツ

ポケモン図鑑の説明文を生成しよう!(3)

生成AIを使おう!

2024.06.10

 生成AIで架空のポケモンを作るためのデータベースを作るところ。コードのサンプルを元に実際に使えるようカスタマイズしていこう。

入力:

あるwebサイトからテキストデータを引っ張ってきて、データベースとして保存します。
対象のwebサイトは
https://wiki.xn--rckteqa2e.com/wiki/%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E4%B8%80%E8%A6%A7
の「名前」の列のリンクをクリックした各ページです。
各リンク先のページで、
「ポケモンずかんの説明文」と「種族値」の間の行
かつ
「リンクのついていない行」
にたいし、1行を1データとして格納します。
上記を行えるようなPythonのコードを書いてください。

出力:

以下は、指定されたWebサイトから必要なデータをスクレイピングし、データベースに保存するためのPythonコードのサンプルです。このコードはBeautifulSoupとSQLiteを使用して実装されています。

まず、必要なライブラリをインストールします。

pip install requests beautifulsoup4 sqlite3

次に、Pythonコードを以下に示します。

import requests
from bs4 import BeautifulSoup
import sqlite3
import time

# データベースの設定
conn = sqlite3.connect('pokemon_data.db')
c = conn.cursor()

# テーブル作成
c.execute('''CREATE TABLE IF NOT EXISTS pokemon (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT,
                description TEXT
            )''')

# メインのURL
main_url = 'https://wiki.xn--rckteqa2e.com/wiki/%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E4%B8%80%E8%A6%A7'

# メインページのHTMLを取得
response = requests.get(main_url)
soup = BeautifulSoup(response.text, 'html.parser')

# ポケモンのリンクをすべて取得
pokemon_links = soup.select('table tbody tr td a')

for link in pokemon_links:
    pokemon_name = link.text
    pokemon_url = 'https://wiki.xn--rckteqa2e.com' + link['href']

    # 各ポケモンページのHTMLを取得
    pokemon_response = requests.get(pokemon_url)
    pokemon_soup = BeautifulSoup(pokemon_response.text, 'html.parser')

    # ポケモン図鑑の説明文と種族値の間の行を抽出
    description_found = False
    for line in pokemon_soup.find_all('li'):
        if 'ポケモンずかんの説明文' in line.text:
            description_found = True
            continue
        if description_found:
            if '種族値' in line.text:
                break
            if not line.find('a'):
                description = line.text.strip()
                if description:
                    # データベースに保存
                    c.execute("INSERT INTO pokemon (name, description) VALUES (?, ?)", (pokemon_name, description))

    # サーバーへの負担を軽減するために少し待機
    time.sleep(1)

# データベースをコミットしてクローズ
conn.commit()
conn.close()

このコードは以下の手順で動作します:

  1. メインページからポケモンのリンクを取得します。
  2. 各ポケモンのページにアクセスし、説明文と種族値の間にあるリンクのついていない行を取得します。
  3. 取得したデータをSQLiteデータベースに保存します。

各ポケモンのページにアクセスする際にサーバーへの負担を軽減するため、1秒間の待機を設けています。これにより、サーバーに過度の負担をかけずにデータを収集できます。

とりあえず動かしてみて、出来たもの見ながら修正していこう。pipがインストールされてない、dbファイルを見るためにDB Browser for SQLiteのインストールが必要などつまづきながら進んで、やっと成果物のdbファイルを閲覧できた。データが無かった。道のりは遠そうだ。

次回に続く

この記事をシェアする