3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

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

コードの説明

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秒の間隔をあける。(最低でも1秒以上)
        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)

コードの解説

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

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

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

  2. データを格納するための空のリストdataを作成します。また、pagecntnext_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秒へ延長しています。

出力結果

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

image.png

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

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

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

こんな感じでchatGPTに本文を渡すと
image.png

ChatGPTがコメントしてくれる
image.png

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

SpreadSheetを開いて、拡張機能からGPT for Sheets and Docsをインストール
image.png

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

=GPT()でChatGPTがコメントしてくれます。
image.png

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

参考記事

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

参考記事

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

その他の参考記事


まとめ

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?