43号線を西へ東へ

フリーランスの備忘録、アウトプットの実験場

12月のブログ分析:Pythonスクレイピングで得た知見とは

このブログはプロモーションリンクを含むときがあります


本ブログの12月を振り返る日記です。

先月のブログ活動記録を残すために、Pythonコードを使って一記事ずつの文字数をカウントしてみましたので、記録しておきます。

先月のこよみモード

12月のカレンダーを一面クリア。42日分あります。

月の初日が金または土曜日になると、日曜日はじまりのカレンダーが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字)

driveon43.com

伊丹空港の鑑賞スポット千里川土手の話題です。駐車場情報や持ち物リスト、フライトレコーダーを使った飛行機鑑賞方法など、内容盛りだくさんな記事でした。

2位:2668字

driveon43.com

2023年はAIが大衆化した年でした。AIを取り上げた記事をまとめて振り返った記事。

3位:2192字

driveon43.com

推敲にiPhoneアプリTextwellを使いこなそうという記事。

文字数が少なかった記事 29位~31位

29位:836字

driveon43.com

大掃除の時に外れないネジ回しを回すためにドライバージョイントを使って外した話し。

30位:747字

driveon43.com

北野武監督の映画「首」の感想です。残酷な描写の多い映画でした。万人受けはしない映画だったなぁ。

31位:538字

driveon43.com

ノエビアスタジアムで行われたラグビーリーグワン開幕戦、神戸製鋼と本田の試合の振り返り記事でした。試合内容の振り返りが無いのであっさりとした記事になっています。

ChatGPTへの指示をまとめておきます

いくら優秀だからといって、コードは一回で完成することはありません。不具合がでたらChatGPTに報告して修正するのを何回も繰り返して改善していきます。出来上がったらこちらが伝えた要望をまとめて出力すれば、同じようなコードを依頼する時に、上手に指示を出せるかもしれません。

エド105
コード作成時の私のお願いを書き出して

ChatGPT
もちろんです。以下に、これまでのコード作成時のご指示をまとめておきます:

  1. 最初の指示:

    • リストにある複数のURLにアクセスし、各ページのタイトル、本文の文字数、カテゴリをCSVにまとめるPythonコードを作成。
    • 本文は別のファイルに保存する。
  2. 本文の抽出に関する指示:

    • 最初のコードではWebページ全体が抜き出されていたため、本文だけを抜き出すように修正する。
    • 本文を表すHTMLタグとして<div class="entry-content hatenablog-entry">を使用する。
  3. URLリストの取得と出力ファイルの保存場所に関する指示:

    • URLのリストは外部のテキストファイルurl_list.txtから読み込むように変更。
    • 出力ファイル(CSVと本文ファイル)は、日時を含んだフォルダ名に保存する。
    • 出力し終わったurl_list.txtも同じフォルダに移動する。

これらの指示に基づき、指定された要件を満たすための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分以内に完了。来月も使えるので、コンピュータを使いこなしている充実感を堪能しました。

続きはこちらから

本記事には続編があります。本文を抽出したファイルをクラウドテキストマイニングサービスにアップロードして、ワードクラウドを作ってみました。

driveon43.com