😉

Zenn記事のリストをスプレッドシートに出力する

2024/08/25に公開

はじめに

私のZenn記事も90件を超えてきました。
ここで発生するのが、情報量が多すぎてどこになんの記事があるかわからない問題です。
いろいろやってみようと考えていますが、まずは第一歩としてZenn記事をリストで出力して、その後スプレッドシートに出力するをやってみようと思います。

スコープですが、私のアカウントだけではつまらないので、「Accenture Japan (有志)」を対象にしようと思います。

RSSで記事のリストを取得する

記事の一覧ですが、ZennではRSSが対応しているようなので、RSSで取得しますかぁ。
下記URLでXML形式で記事のリストが取得されます。
https://zenn.dev/p/acntechjp/feed
ただ、見るとわかるのですが、全件ではないです。
全件で取得する場合は下記URLになります。
URLの最後に「all=1」をつけます。
https://zenn.dev/p/acntechjp/feed?all=1

Google ColabでRSSを取得してスプレッドシートに出力する

Pythonで書きます。

import xml.etree.ElementTree as ET
from datetime import datetime
import requests
import pandas as pd
from google.colab import auth
from google.auth import default
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# Google Colabで認証を行う
auth.authenticate_user()
creds, _ = default()

# Google Sheets APIを初期化
service = build('sheets', 'v4', credentials=creds)
# RSSフィードのURL
rss_url = 'https://zenn.dev/p/acntechjp/feed?all=1'

# URLからRSSフィードを取得
response = requests.get(rss_url)
rss_content = response.content

# RSSフィードのXMLを解析
root = ET.fromstring(rss_content)

# データを格納するリスト
data = []
# 各記事の情報を抽出
for item in root.findall('./channel/item'):
    url = item.find('link').text
    title = item.find('title').text
    pub_date = item.find('pubDate').text
    creator = item.find('.//{http://purl.org/dc/elements/1.1/}creator').text

    # 日付形式を変更
    pub_date_obj = datetime.strptime(pub_date, '%a, %d %b %Y %H:%M:%S %Z')
    formatted_date = pub_date_obj.strftime('%Y-%m-%d %H:%M:%S')

    data.append([url, title, formatted_date, creator])

# DataFrameを作成
df = pd.DataFrame(data, columns=['URL', 'Title', 'Publication Date', 'Creator'])
# 新しいスプレッドシートを作成
spreadsheet = {
    'properties': {
        'title': 'Zenn Articles'
    }
}
spreadsheet = service.spreadsheets().create(body=spreadsheet,
                                            fields='spreadsheetId').execute()
spreadsheet_id = spreadsheet.get('spreadsheetId')
# シート名を取得
sheet_metadata = service.spreadsheets().get(spreadsheetId=spreadsheet_id).execute()
sheet_name = sheet_metadata['sheets'][0]['properties']['title']
# データをスプレッドシートに書き込む
range_name = f"'{sheet_name}'!A1:D{len(df) + 1}"
values = [df.columns.tolist()] + df.values.tolist()
body = {
    'values': values
}
result = service.spreadsheets().values().update(
    spreadsheetId=spreadsheet_id, range=range_name,
    valueInputOption='RAW', body=body).execute()

print(f'スプレッドシートが作成されました: https://docs.google.com/spreadsheets/d/{spreadsheet_id}')

Colabでの実行結果

結果下記のようにスプレッドシートが生成されました!

さいごに

このスプレッドシートを元にさらに記事の詳細情報を集めたり分析したりできたら良いなと考えています!

Accenture Japan (有志)

Discussion