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

Pythonで置き換えることができます
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フィードに整理し、効率的に情報収集を行うことが可能になります。ぜひご自身のブログや情報基盤の自動化に活用してみてください。

