Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

Pythonを使って複数のRSSを1つにまとめる

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

 

今使っているRSSをまとめるシステムのOSやPHPのVerが低いので刷新したい

Pythonで置き換えることができます

スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

RSS統合システムの構成:config設定とスクリプト解説

RSSフィードの自動収集・統合システムを運用する上で、設定ファイル(YAML)の記述方法と、処理を実行するPythonスクリプトの仕組みについて、実際の構成例とその動作ロジックを解説します。

1. 設定ファイルの記述方法: config/feeds.yaml

システムの司令塔となる設定ファイルです。カテゴリごとに収集対象のRSS URLをリスト化します。

# 記述例
category1:
  - https://example.com/rss1.xml
  - https://example.com/rss2.xml
category2:
  - https://example.com/rss3.xml
  - https://example.com/rss4.xml

このようにYAML形式で記述することで、aggregator.py が自動的に各リストを読み込み、収集・統合処理を実行します。

あとで、category1.rss category2.rssのファイル名で出力されます。

2. 収集・統合スクリプト: aggregator.py の解説

aggregator.py は、フィード収集からXML生成までを自動化する中心的なスクリプトです。

  • データ収集: feedparser を用いて各URLから情報を取得し、共通の辞書型データに正規化します。
  • ソート・抽出: 結合した記事データを公開日順(降順)でソートし、最新の10件を抽出します。
  • XML再生成: xml.etree.ElementTree を利用して、RSS 2.0 形式のXMLファイルをゼロから構築し、feeds/ ディレクトリに保存します。

このスクリプトにより、バラバラな形式のフィードが常に統一された構造のRSSファイルとして書き出されるため、後続の処理が非常に安定します。

RSSフィードを自動収集・統合するシステムの中核を担う aggregator.py の実際のソースコードと、その処理ロジックを解説します。

aggregator.py のソースコード

import feedparser
import yaml
import os
from xml.etree.ElementTree import Element, SubElement, ElementTree

BASE_DIR = '/path/to/rss_aggregator'
CONFIG_FILE = os.path.join(BASE_DIR, 'config/feeds.yaml')
FEEDS_DIR = os.path.join(BASE_DIR, 'feeds')

def parse_date(entry):
    for key in ['published_parsed', 'updated_parsed']:
        val = entry.get(key)
        if val:
            from datetime import datetime
            return datetime(*val[:6])
    from datetime import datetime
    return datetime.now()

def main():
    if not os.path.exists(CONFIG_FILE):
        return
    with open(CONFIG_FILE, 'r') as f:
        config = yaml.safe_load(f)
    if not config:
        return

    for category, rss_urls in config.items():
        combined_feed = []
        for url in rss_urls:
            try:
                d = feedparser.parse(url, request_headers={'User-Agent': 'RSSAggregator/1.0'})
                for entry in d.entries:
                    combined_feed.append({
                        'title': entry.get('title', 'No Title'),
                        'link': entry.get('link', '#'),
                        'description': entry.get('description') or entry.get('summary', ''),
                        'published_dt': parse_date(entry)
                    })
            except Exception:
                continue

        combined_feed.sort(key=lambda x: x['published_dt'], reverse=True)
        latest_items = combined_feed[:10]

        rss = Element('rss', version='2.0')
        channel = SubElement(rss, 'channel')
        SubElement(channel, 'title').text = category
        SubElement(channel, 'link').text = 'https://rss.example.com'

        for entry in latest_items:
            item = SubElement(channel, 'item')
            SubElement(item, 'title').text = entry['title']
            SubElement(item, 'link').text = entry['link']
            SubElement(item, 'description').text = entry['description'] or ''

        os.makedirs(FEEDS_DIR, exist_ok=True)
        tree = ElementTree(rss)
        tree.write(os.path.join(FEEDS_DIR, f'{category}.rss'), encoding='utf-8', xml_declaration=True)

if __name__ == '__main__':
    main()

スクリプトのポイント解説

  • フィード収集 (feedparser): feedparser ライブラリを使用して各URLから記事を取得しています。User-Agentを明示し、サイト側への配慮も行っています。
  • 日付の正規化 (parse_date): RSSごとに異なる日付形式(published_parsed や updated_parsed)をPythonの datetime オブジェクトに変換し、ソートを容易にしています。
  • データ統合とソート: 複数のソースから得た記事を一つのリストに集約し、sort メソッドで日付順に整列した後、最新10件のみを残しています。
  • XML再構築: ElementTree を用い、必要な要素だけを抽出して標準的なRSS 2.0フォーマットで書き出しています。これにより、どのソースが元であっても、出力されるXMLファイルは常に正しい構造が保証されます。

 

このスクリプトは、バラバラなRSSフィードを一つの「使いやすいフォーマット」に整えるための堅実な設計になっています。エラーが発生しても特定のソースだけをスキップする設計のため、安定した運用が可能です。

3. 結果の確認: feeds配下の書き出し

実行が完了すると、/path/to/rss_aggregator/feeds/ 配下に、設定ファイルで指定したカテゴリ名のファイルが生成されます。

  • 生成ファイル例: カテゴリ名.rss
  • 中身: 収集・ソートされた最新10件の記事データが含まれます。

このファイルは標準的なRSSフォーマットで生成されています。

このrssを外部からアクセス可能なWebディレクトリに配置します。

4.Cronで定期実行

頻繁に取りに行くと相手に迷惑!?なので、数時間に1回ぐらいのペースで aggregator.py を実行します。

5.まとめ

設定ファイルでURLを管理し、Pythonスクリプトで統合・フォーマット化するというこの運用フローにより、複数の情報源を自分好みのRSSフィードに整理し、効率的に情報収集を行うことが可能になります。ぜひご自身のブログや情報基盤の自動化に活用してみてください。

タイトルとURLをコピーしました