モチベーション:
読んでいると地域の位置関係が分からなくなってきたので、地図を作って整理したくなった。
全て読み返すのも大変なので、Geminiに食わせて簡単な位置関係を出す。
方針:
Geminiはスクレイピングできない仕様なのか、URL指定してもサイトの中身を見てくれないので、
一旦ローカルに落として、解析してもらう。
手順:
1. 対象の小説をローカルPCにダウンロード
2. Geminiに食わせるための準備(htmlのままでもいいかも)
3. Gemini APIを使うための準備
4. Gemini実行
■1. 読みたい小説をローカルにhtml形式でダウンロード
curl --limit-rate 200K --retry-max-time 5 'https://ncode.syosetu.com/n0022gd/[41-102]/' -o '#1.html'
--limit-rate:
あまり早く読み込むとサーバーに負荷がかかる?と応答が来なくなるかもしれないので
ダウンロード速度を制限(意味はないかも)
--retry-max-time:
リトライする場合、少し待つことでサーバー負荷を気持ち軽くなるかも
[41-102]:
読みたい話数を指定。序盤は、同じ場所から動かないので、動きが出てくるところを抽出
#1.html:
[41-102]に対応する番号をそのままローカルに保存するファイル名にする
■2. Geminiに食わせるための準備
2-1. 102話まであるので、順に処理したいので全て3桁のファイル名にする
for i in `ls [4-9]*.html`; do mv $i 0$i; done
2-2. htmlファイルをtxtファイルに変換
$ cat get.py
from bs4 import BeautifulSoup
def process_files(start_num, end_num):
for i in range(start_num, end_num+1):
html_file = format(i, '03')+str(".html")
txt_file = format(i, '03')+str(".txt")
with open(txt_file, 'w+', encoding='utf-8') as f_txt:
with open(html_file, 'r', encoding='utf-8') as f_html:
soup = BeautifulSoup(f_html, "html.parser")
p_element = soup.select('p[id]')
for contents in p_element:
f_txt.write(contents.text+'\n')
start_num = 41
end_num = 102
process_files(start_num, end_num)
■3. Gemini APIを使うための準備
3-1. ライブラリのインストール:
pip install google-generativeai
3-2. API keyの取得
以下サイトから、右上にある「APIキーを作成」ボタンをクリック。別ウィンドウにキーができるので、コピー
export GOOGLE_API_KEY="AIzaSyAx....."
3-4. Geminiに渡す内容を作成(無料版を使うので、gemini-2.0-flashを指定)
複数のテキストファイルを順番に読み込み、その内容を1つの大きな文字列に結合し、
最後にその文字列をGemini APIに送るためのプロンプトを組み立てる
$cat analyze.py
import os
import google.generativeai as genai
# Configure the API key from your environment variable
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
# Set the start and end file numbers
start_num = 41
end_num = 101
model = genai.GenerativeModel('gemini-2.0-flash')
# Combine the content of all text files
combined_text = ""
for i in range(start_num, end_num + 1):
file_path = f'{i:03d}.txt'
if os.path.exists(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
combined_text += f.read() + "\n"
else:
print(f"Warning: File '{file_path}' not found. Skipping.")
# Construct the prompt for analysis
prompt_text = f"""以下の小説の内容を分析してください。
登場する地域名とその位置関係をリストアップしてください。
{combined_text}
"""
# Send the combined text to the Gemini API
if combined_text:
try:
response = model.generate_content(prompt_text)
print("分析結果:")
print(response.text)
except Exception as e:
print(f"An error occurred: {e}")
else:
print("No file content to analyze. Please check your files.")
4. Gemini実行
$python3 analyze.py
本文の取得は以下のサイトのようにすればよかったのかな。
https://scol.hatenablog.com/entry/2019/04/04/193000
そもそもログインすれば、txtで落とせるのか。
EoF