ぺろりん先生のブログの本文抽出とコメント自動作成

## はじめに

ぺろりん先生こと鹿目凛さんのブログから本文を抽出するコードをPythonで作成しました。
出力結果はExcelに書き起こして、データ解析に使えるようにしています。
応用例として、ChatGPTでブログのコメントを作ることをしています。


## コードの説明

```python
from bs4 import BeautifulSoup
import requests
import time
import os
import openpyxl
import pandas as pd

# ファイルの保存先
os.chdir(r"Write/your/folder/to/save")

# データを格納するリスト
data = []
page = 1
cnt = 1
next_flg = True

# 目次から探索するページのurlを取得
while next_flg:
    list_url = 'https://ameblo.jp/pero0921/entrylist-' + str(page) + '.html'
    response = requests.get(list_url)
    html = response.text
    soup = BeautifulSoup(html, "html.parser")

    h2s = soup.find_all('h2', attrs={'data-uranus-component': 'entryItemTitle'})
    urls = []
    for h2 in h2s:
        url = h2.find('a').get('href')
        urls.append("https://ameblo.jp" + url)
    print(urls)

    # ページごとの処理を記述する部分
    for url in urls:
        # アクセス制限：5秒の間隔をあける。（最低でも１秒以上）
        time.sleep(5)
        cnt += 1

        try:
            # HTMLの内容を取得するためにリクエストを送信
            response_page = requests.get(url, timeout=(3.0, 7.5))
            html_content = response_page.text

            # HTMLの内容を解析
            soup_content = BeautifulSoup(html_content, 'html.parser')

            # ブログのタイトルを取得
            title = soup_content.find("h1").text
            blog_content = soup_content.find('div', {'class': 'skin-entryBody _2p0MdgbG'}).text
            clean_text = blog_content.replace("\u3000", "").replace("\xa0", "")
            data.append([title, clean_text])
            print(title)
        except:
            print(str(url))

    # 次のページが存在するか確認
    page_class = len(soup.find('a', attrs={'data-uranus-component': 'paginationNext'}).get('class'))
    if page_class != 3:
        next_flg = False
        break

    page += 1

# データをExcelファイルに書き込む
df = pd.DataFrame(data, columns=['タイトル', 'ブログ本文'])
df.to_excel('blog_data.xlsx', index=False)
```

## コードの解説

全ページの探索については前回の記事と同様です。前回参考にさせていただいたサイトのリンクも掲載します。

https://qiita.com/yaanai/items/f24e95f4e82df86b597b

http://everykey.sakura.ne.jp/wp/note/?p=147

このコードは、以下の手順でブログページをトレースし、各ブログのテキストを抽出しています:

1. 必要なライブラリをインポートします。`BeautifulSoup`はHTMLの解析に、`requests`はHTTPリクエストを送信するために使用されます。`time`は待機するための時間、`os`はファイル操作に使用されます。また、データの保存には`openpyxl`と`pandas`が使用しようしています。

2. データを格納するための空のリスト`data`を作成します。また、`page`、`cnt`、`next_flg`の変数を初期化します。

3. `while`ループを使用して、次のページが存在するかどうかを確認します。`list_url`を構築し、リクエストを送信してブログリストページのHTMLを取得します。

4. `BeautifulSoup`を使用してHTMLを解析し、`h2`要素を見つけます。各要素からブログのURLを抽出し、`urls`リストに追加します。

5. `urls`リスト内の各URLに対して、一定時間待機してからリクエストを送信します。エラーハンドリングを行い、HTMLの内容を取得し、必要な情報を抽出します。

6. ブログのタイトルと本文を抽出し、`clean_text`変数に対してクリーニング処理を行います。
ブログのタイトルは`h1`タグ、本文は`skin-entryBody _2p0MdgbG`（ぺろりんのブログの場合）に格納されています。空白文字や改行などの文字を`.replace関数`で取り除きます。そして、データを`data`リストに追加します。

7. ブログの処理が完了したら、次のページが存在するかを確認します。存在する場合は、`page`を更新し、次のページに移動します。

8. データを`Excel`ファイルに書き込みます。データフレームを作成し、指定された列名でExcelファイルに保存します。

## アクセスの間隔について

このコードでは、`time.sleep(5)`を使用して各リクエストの間に5秒の間隔を入れています。これは、スクレイピング操作を安定して行うためのものです。短時間で連続してアクセスを行うと、サーバーへの負荷が増加し、アクセスが制限される可能性があります。そのため、一定の間隔をあけることで、サーバーへの負荷を軽減し、スクレイピング操作の成功率を高めることができます。

アクセス間隔について、いろいろわかりやすい記事がありますが、以下を参考にしました。
最初は1秒で設定していましたが、うまく読み込めなくなったので、時間を5秒へ延長しています。

https://www.isoroot.jp/blog/3836/

## 出力結果

Excelでの出力結果は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/6d63f287-a2fb-4f45-ff96-9bf271677e07.png)

こんばんはー！ぺろりんです！　で始まってるんですね。

## 応用例：ChatGPTでのコメント作成

ChatGPTは便利でコメントの作成もできます。

こんな感じでchatGPTに本文を渡すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/7b8ebca1-8838-67fd-8e42-a6179a8e2ba7.png)

ChatGPTがコメントしてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/e91a60bf-fde6-00ee-a42b-b189dc712042.png)

さらに、Google Spreadsheetであれば、
GPT for Sheets and Docsという拡張機能を使用すると、
Excel関数としてChatGPTを使用することができます。

SpreadSheetを開いて、拡張機能からGPT for Sheets and Docsをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/29344772-de6a-6413-854d-e60b34470153.png)

ChatGPTのページからAPI Keysをコピーして、SpreadSheetを有効化
https://platform.openai.com/account/api-keys

=GPT()でChatGPTがコメントしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/8923bbdb-2b9e-56a4-58a4-21ec6d1d54db.png)

注意点としては、
従来課金にしないと動かない？
Paid account　
https://platform.openai.com/account/billing/overview
にしたら動くようになりました。

参考記事

https://note.com/calilife/n/n436e3d617ae4


30秒以上処理がかかる場合は"Exceeded maximum execution time（行 0）が発生しました。"という#ERROR!がでます。
これはGoogleの仕様で、Google Apps Script（GAS）で対応すれば６分まで処理できます。

参考記事

https://happy-nap.hatenablog.com/entry/2023/02/05/104926

ただ、トライアルでできるものの、従量課金制のものをExcelで使うのは...
という気持ちがあるので、通常のサイトやアプリでchatベースでやってて、
実装はしてみたものの使わなそうです。

その他の参考記事



https://dekiru.net/article/23984/






https://www.tinto-eco.com/2023/02/12/what-to-do-if-an-error-occurs-when-linking-chatgpt-with-a-spreadsheet/

---

## まとめ
Pythonによるスクレイピングでブログから本文の抽出と、ChatGPTでのコメント作成を紹介しました。
ChatGPTの拡張機能を使う場合は、課金に気を付けましょう。