シロッコの青空ぶろぐ

高卒シニアが低学歴コンプレックス脱出のため、放送大学の人間と文化コースで学んでいます。通信制大学で学ぼうとする人を応援したい。学んで成功する人が増えれば、私のやる気も燃えるはず。

ChatGPTに「キネマ旬報ベスト・テン」全ランキングのCSVファイルを作って貰う

目次

「キネマ旬報ベスト・テン」から全ランキングのCSVファイルを作りたい

過去に、ChatGPTにCSVデータを処理して貰おうとすると、Python のコードを示し、実行結果をのCSVデータを返すというのがありました。

そのときの面白さから、Bing Chat に教えてもらい、Python で文字列を要素に分けるプログラムを作りました。

他にも、Pythonが生成したデータでChatGPTと対話も行い、ChatGPTの能力の高さには驚くばかりです。

そこで、今回は調子に乗って、ChatGPTに「キネマ旬報ベスト・テン」全ランキングのCSVファイルを作って貰います。

元となる情報は -、Wikipedia「キネマ旬報:各年のベスト・テン結果」にあります。

Pythonを全く知らない私が、「キネマ旬報ベスト・テン」全ランキングのCSVファイルを作れるのか。

GPT-4 のお世話になって挑戦してみます。 

ウィキペディア「キネマ旬報」から情報取得

以下のことをやって貰ったのですが、記事が長くなって読む気が失せると困ります。

  • やりたいことを提示して、実行可能かどうか確認
  • ChatGPTへのプロンプトを作成して定義に間違いがないかチェック

省略します。

以下に、Pythonのライブラリを使用してウィキペディアのページから情報を抽出し、CSVファイルに保存する方法を示します。この例では、requestsとBeautifulSoupとpandasというライブラリを使用します。まず、これらのライブラリをインストールしてください。

pip install requests beautifulsoup4 pandas

これだけは実行する必要がありそうです。

GPT-4 に送ったプロンプト

[ウィキペディアURL]は「キネマ旬報ベスト・テン」の「各年のベスト・テン結果」です。
「第1回(1924年度)」から「第96回(2022年度)」までの「日本映画ベスト・テン」の一覧を表現したCSVファイルをGPT-4に作ってください。

・[ウィキペディアURL]:https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%8D%E3%83%9E%E6%97%AC%E5%A0%B1#%E5%90%84%E5%B9%B4%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%BB%E3%83%86%E3%83%B3%E7%B5%90%E6%9E%9C

# ウェブスクレイピングをするための細部情報

[除外年度]:
・「1924年」と「1925年」は「日本映画ベスト・テン」が発表されなかったので無視する。
・194319?1945年は戦争により中止。第20回(1946年度)から再開している。

[変則年度]:

・「第7回(1930年度)」は変則的な選出方法を採用している。
・「日本・現代映画」のランキングをそのまま取得し、「備考」を示す項目に「日本・現代映画」と記入する。
・「日本・時代映画」のランキングをそのまま取得し、「備考」を示す項目に「日本・時代映画」と記入する。

# 作品関する情報

・[開催回]:何回目の「キネマ旬報ベスト・テン」であるか
・[開催年度]:「キネマ旬報ベスト・テン」が発表された年度
・[順位]:先頭の数字
・[作品名]:[順位]に続く文字列
・[監督名]:
・(山中貞雄監督)のように()に囲まれているので()を外す
・「山中貞雄監督」のように「監督」という役職がある場合は「監督」をを外す
・(田坂具隆監督/村田実演出/阿部豊補導)のように「/」で区切られている場合は、分割して複数人とする。
・「(オムニバス映画/監督:豊田四郎、成瀬巳喜男、山本嘉次郎、衣笠貞之助)」とときは「豊田四郎」、「成瀬巳喜男」、「山本嘉次郎」、「衣笠貞之助」の4人

# 出力CSVファイルの詳細指定
[Cファイル名]:「best_ten.csv」
[CSVファイル全体]:複数の[CSVファイルの行]から構成される
[CSVファイルの行]:以下の項目から構成される1本の映画情報
・[開催回]
・[開催年度]
・[順位]
・[作品名]
・[監督名1]
・[監督名2]
・[監督名3]
・[監督名4]
・[備考]

GPT-4 が作ったPythonのコード

私はAIモデルであり、コードを直接実行することはできませんが、以下のPythonコードを提供します。このコードは、指定されたウィキペディアページから情報を抽出し、指定された形式でCSVファイルに保存します。

import requests
from bs4 import BeautifulSoup
import csv
import re

url = "https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%8D%E3%83%9E%E6%97%AC%E5%A0%B1#%E5%90%84%E5%B9%B4%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%BB%E3%83%86%E3%83%B3%E7%B5%90%E6%9E%9C"
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
tables = soup.select('.wikitable')

def extract_director_names(director_text):
    director_text = re.sub(r'(|)', '', director_text)
    director_text = re.sub(r'監督', '', director_text)
    director_names = director_text.split('/')
    return [name.strip() for name in director_names]

with open('best_ten.csv', mode='w', newline='', encoding='utf-8') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(['開催回', '開催年度', '順位', '作品名', '監督名1', '監督名2', '監督名3', '監督名4', '備考'])

    for table in tables:
        year_text = table.caption.get_text(strip=True)
        match = re.search(r'第(\d+)回((\d+)', year_text)
        if not match:
            continue

        kai = int(match.group(1))
        year = int(match.group(2))

        if year in [1924, 1925] or 1943 <= year <= 1945:
            continue

        for tr in table.tbody.find_all('tr')[1:]:
            row = [kai, year]
            tds = tr.find_all('td')

            if len(tds) == 1:
                if kai == 7:
                    remark = tds[0].get_text(strip=True)
                else:
                    continue
            else:
                rank = int(tds[0].get_text(strip=True))
                title = tds[1].get_text(strip=True)
                director_text = tds[2].get_text(strip=True)
                director_names = extract_director_names(director_text)
                remark = ''

                row.extend([rank, title])
                row.extend(director_names)
                row.append(remark)

            csv_writer.writerow(row[:9])

このコードをPython環境で実行すると、指定されたウィキペディアページからデータを抽出し、「best_ten.csv」というCSVファイルに保存します。ただし、このコードは特定のウィキペディアページの構造に依存しているため、ページの構造が変更されると動作しなくなる可能性があります。また、ウェブスクレイピングを行う際には、ウェブサイトの利用規約やrobots.txtを確認し、適切なアクセス速度や方法で行うことが重要です。これは、ウェブサイトのサーバーに負荷をかけず、適切な方法で情報を収集するためです。

robots.txtの内容を表示する

頼んでいないのにこんなことまでしてくれた。

このPythonコードは、前述のコードの続きではありませんが、robots.txtの内容を取得し、表示するコードを提供します。

import requests

url = "https://ja.wikipedia.org/robots.txt"
response = requests.get(url)

if response.status_code == 200:
    print(response.text)
else:
    print("Error: Could not fetch robots.txt")

このコードを実行すると、ウィキペディアのrobots.txtファイルの内容が表示されます。これを確認し、ウェブスクレイピングが許可されているかどうかを判断してください。

適切な時間間隔

また、ウェブスクレイピングを行う際には、必要に応じて適切な時間間隔を設けることが望ましいです。以下のコードは、Pythonで2秒間の待機を行う例です。

import time

time.sleep(2)  # Sleep for 2 seconds

 

このtime.sleep()関数は、ウェブスクレイピングのコード内で適切な場所に挿入することで、ウェブサイトへのアクセス間隔を調整できます。ただし、ウィキペディアの場合、APIを使用することが推奨されています。APIを使用すると、ウェブページのHTML構造の変更に対応しやすく、また、適切なアクセス速度や方法でデータを取得できます

これをAPIを使用するコードに変更してください。

実用になるコードを提示してくれなかったので、APIを使用するのは諦めました。

Pythonコードを実行する

いよいよ、Pythonコードを実行します。

まず、一発で動作するとは思えず、簡単なことから始めます。

robots.txtの内容を表示するコードの実行から始めます。robots.txt が何かというと、 Google などのロボットが情報収集の許可、不許可を指示するもので、クローラーはその指示を守ります。

「IDLE」でPython による開発を学ぶ

今回からPythonをインストールしたときに一緒にインストールされた「IDLE」を使います。「IDLE」は Python の統合開発学習環境らしいのですが、まだ詳しい使い方は分かっていません。

「スタート」から「Python 3.11」の「V」をクリックして開き「IDLE」を起動します。

「File」→「New File」を選択すると、新しいWindowが開きます。

GPT-4が作ったコードを「Copy code」をクリック。

新しいWindow で「Ctl + v」でペースト。

先にコードは貼り付けてありますが、インデントや行末の文字に注意してください。

インデントは「半角スペース」か「TAB」。

行末にあやしい空白がないか注意。


新しいWindow で「File」→「Save As...」で「robots.py」の名前をつけて保存します。

そうすると、以下のようになります。

「Run」→「Run Module」で実行されます。

エラーがなければ以下のようの結果が表示されます。

「Squeed text(597 lines).」をダブルクリックすると、以下が表示されます。

「Allow」がロボットのアクセスを許可しているディレクトリ、

「Disallow」が禁止しているディレクトリです。

長くなったので

続きは次回に譲ります。

今回は、ChatGPTにお願いして、Wikipedia「キネマ旬報ベスト・テン」から全ランキングのCSVファイルを作るPythonプログラムを書いてもらいました。

robots.txt を確認して、ウェブスクレイピングが許可されているかどうかを判断しろ、というので robots.txt を読み込むプログラムを実行してみました。

(許可されているから、Googleなどで検索できる)

次に、robots.txt を読み込むプログラムを実行するのに「IDLE」を使ってみました。

少し、進歩したような気がしませんか?

そう思って、喜びましょう。

今回も最後まで読んでいただきありがとうございます。