本ブログの12月を振り返る日記です。
先月のブログ活動記録を残すために、Pythonコードを使って一記事ずつの文字数をカウントしてみましたので、記録しておきます。
先月のこよみモード
月の初日が金または土曜日になると、日曜日はじまりのカレンダーが6行になります。7日×6行=42日分。こよみの一面クリアが非常につらい状態になります。31日ある月は金曜日か土曜日始まり、30日の 月は土曜日始まりの場合です。長かったですが、一面クリアすることができました。
せっかくなので振り返ってきたいのですが、何度も振り返っていると新鮮味にかけるので、今回は趣向を変えて見たいと思います。Python自分記事をスクレイピングして統計をみたいと思います。
ChatGPTが書いたPythonコードでスクレイピング
自分でコードを書けないので、いつも通り書いてもらいます。よい時代になりました。コードと指示は記事後半に貼り付けておきます。
スクレイピング時間は1分ほどでした。Excelに読み込みむときにそのまま開くとCSVが文字化けしました。コードの修正が必要ですが、Excelを開いてからインポート機能を利用すれば大丈夫でした。
カテゴリーも抜き出す部分の指定ができていなかったようです。最初ChatGPTに当ブログのHTMLファイルを読み込ませてから指示を入れるといいのかもしれません。
12月に書いた記事の統計情報
記事あたり文字数1313.7±518となりました。
項目 | 数値 |
---|---|
記事数 | 31記事 |
総文字数 | 40,725 |
1記事あたり平均文字数 | 1313.7 |
最大文字数 | 2702 |
最小文字数 | 538 |
標準偏差 | 518.4 |
はてなブログの編集画面でも文字数が表示されますが、それよりも少ない文字数になっています。はてなフォトライフの写真の引用タグ等が差し引かれた文字数なのでしょう。
文字数が多かった記事1位~3位
1位:2702文字 (はてなブログ編集画面では4169字)
伊丹空港の鑑賞スポット千里川土手の話題です。駐車場情報や持ち物リスト、フライトレコーダーを使った飛行機鑑賞方法など、内容盛りだくさんな記事でした。
2位:2668字
2023年はAIが大衆化した年でした。AIを取り上げた記事をまとめて振り返った記事。
3位:2192字
推敲にiPhoneアプリTextwellを使いこなそうという記事。
文字数が少なかった記事 29位~31位
29位:836字
大掃除の時に外れないネジ回しを回すためにドライバージョイントを使って外した話し。
30位:747字
北野武監督の映画「首」の感想です。残酷な描写の多い映画でした。万人受けはしない映画だったなぁ。
31位:538字
ノエビアスタジアムで行われたラグビーリーグワン開幕戦、神戸製鋼と本田の試合の振り返り記事でした。試合内容の振り返りが無いのであっさりとした記事になっています。
ChatGPTへの指示をまとめておきます
いくら優秀だからといって、コードは一回で完成することはありません。不具合がでたらChatGPTに報告して修正するのを何回も繰り返して改善していきます。出来上がったらこちらが伝えた要望をまとめて出力すれば、同じようなコードを依頼する時に、上手に指示を出せるかもしれません。
コード作成時の私のお願いを書き出して
もちろんです。以下に、これまでのコード作成時のご指示をまとめておきます:
最初の指示:
本文の抽出に関する指示:
- 最初のコードではWebページ全体が抜き出されていたため、本文だけを抜き出すように修正する。
- 本文を表すHTMLタグとして
<div class="entry-content hatenablog-entry">
を使用する。
URLリストの取得と出力ファイルの保存場所に関する指示:
- URLのリストは外部のテキストファイル
url_list.txt
から読み込むように変更。 - 出力ファイル(CSVと本文ファイル)は、日時を含んだフォルダ名に保存する。
- 出力し終わった
url_list.txt
も同じフォルダに移動する。
- URLのリストは外部のテキストファイル
これらの指示に基づき、指定された要件を満たすためのPythonコードを段階的に作成しました。各ステップでの要件に応じて、コードの機能を拡張してきました。
Pythonコード(クリックで展開)
import requests from bs4 import BeautifulSoup import csv import os from datetime import datetime # URLリストをファイルから読み込む with open('url_list.txt', 'r') as file: urls = [line.strip() for line in file.readlines()] # 現在の日時を取得してフォルダ名に使用 current_time = datetime.now().strftime("%Y%m%d_%H%M%S") os.makedirs(current_time, exist_ok=True) # CSVファイルと本文ファイルのパスを設定 csv_file = os.path.join(current_time, "web_data.csv") text_file_base = os.path.join(current_time, "page_content_{}.txt") # CSVのヘッダー headers = ['URL', 'Title', 'Content Length', 'Category'] # CSVファイルを開く with open(csv_file, mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(headers) # 各URLに対して処理を行う for i, url in enumerate(urls): response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 本文が含まれると予想される特定のdivタグを指定 content_tag = soup.find('div', class_='entry-content hatenablog-entry') if content_tag: content = content_tag.get_text(strip=True) content_length = len(content) title = soup.title.string if soup.title else 'No Title' category = soup.find('meta', {'name': 'category'})['content'] if soup.find('meta', {'name': 'category'}) else 'No Category' # CSVに書き込み writer.writerow([url, title, content_length, category]) # 本文を別ファイルに保存 with open(text_file_base.format(i), mode='w', encoding='utf-8') as text_file: text_file.write(content) else: # 本文が見つからない場合 print(f"Content not found for URL: {url}") # url_list.txtを移動する os.rename('url_list.txt', os.path.join(current_time, 'url_list.txt'))
まとめ
12月もこよみモードの一面コンプリートを達成することができました。
12月分のブログの文字数を記事単位でカウントするPythonコードをChatGPTに書いてもらい、無事に動作しました。
文字数をカウントして何の意味があるのか?いいえ、とくになにもありませんが、あえて言うならChatGPTの練習のためですね。
コード作りに20分ほどかかっているが、手作業なら30分かかる作業が、5分以内に完了。来月も使えるので、コンピュータを使いこなしている充実感を堪能しました。
続きはこちらから
本記事には続編があります。本文を抽出したファイルをクラウドのテキストマイニングサービスにアップロードして、ワードクラウドを作ってみました。