はじめに
ぺろりん先生こと鹿目凛さんのブログから本文を抽出するコードを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)
コードの解説
全ページの探索については前回の記事と同様です。前回参考にさせていただいたサイトのリンクも掲載します。
このコードは、以下の手順でブログページをトレースし、各ブログのテキストを抽出しています:
-
必要なライブラリをインポートします。
BeautifulSoup
はHTMLの解析に、requests
はHTTPリクエストを送信するために使用されます。time
は待機するための時間、os
はファイル操作に使用されます。また、データの保存にはopenpyxl
とpandas
が使用しようしています。 -
データを格納するための空のリスト
data
を作成します。また、page
、cnt
、next_flg
の変数を初期化します。 -
while
ループを使用して、次のページが存在するかどうかを確認します。list_url
を構築し、リクエストを送信してブログリストページのHTMLを取得します。 -
BeautifulSoup
を使用してHTMLを解析し、h2
要素を見つけます。各要素からブログのURLを抽出し、urls
リストに追加します。 -
urls
リスト内の各URLに対して、一定時間待機してからリクエストを送信します。エラーハンドリングを行い、HTMLの内容を取得し、必要な情報を抽出します。 -
ブログのタイトルと本文を抽出し、
clean_text
変数に対してクリーニング処理を行います。
ブログのタイトルはh1
タグ、本文はskin-entryBody _2p0MdgbG
(ぺろりんのブログの場合)に格納されています。空白文字や改行などの文字を.replace関数
で取り除きます。そして、データをdata
リストに追加します。 -
ブログの処理が完了したら、次のページが存在するかを確認します。存在する場合は、
page
を更新し、次のページに移動します。 -
データを
Excel
ファイルに書き込みます。データフレームを作成し、指定された列名でExcelファイルに保存します。
アクセスの間隔について
このコードでは、time.sleep(5)
を使用して各リクエストの間に5秒の間隔を入れています。これは、スクレイピング操作を安定して行うためのものです。短時間で連続してアクセスを行うと、サーバーへの負荷が増加し、アクセスが制限される可能性があります。そのため、一定の間隔をあけることで、サーバーへの負荷を軽減し、スクレイピング操作の成功率を高めることができます。
アクセス間隔について、いろいろわかりやすい記事がありますが、以下を参考にしました。
最初は1秒で設定していましたが、うまく読み込めなくなったので、時間を5秒へ延長しています。
出力結果
Excelでの出力結果は以下の通りです。
こんばんはー!ぺろりんです! で始まってるんですね。
応用例:ChatGPTでのコメント作成
ChatGPTは便利でコメントの作成もできます。
さらに、Google Spreadsheetであれば、
GPT for Sheets and Docsという拡張機能を使用すると、
Excel関数としてChatGPTを使用することができます。
SpreadSheetを開いて、拡張機能からGPT for Sheets and Docsをインストール
ChatGPTのページからAPI Keysをコピーして、SpreadSheetを有効化
https://platform.openai.com/account/api-keys
注意点としては、
従来課金にしないと動かない?
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の拡張機能を使う場合は、課金に気を付けましょう。