MENU

YouTubeチャンネルのRSSフィードURLを取得するPythonスクリプト

この記事では、YouTubeチャンネルのメインチャンネルIDを取得し、それを利用してRSSフィードURLを生成するPythonコードを紹介します。スニペットをコア機能と応用例に分けて解説することで、目的に応じて簡単に再利用できる形を目指します。

目次

必要なライブラリのインストール

このスクリプトを動作させるには、以下のPythonライブラリが必要です。

インストールコマンド

pip install requests beautifulsoup4
  • requests: YouTubeページのHTMLを取得するために使用。
  • beautifulsoup4: HTMLを解析して必要な情報を抽出するために使用。

コア機能: メインチャンネルIDの取得

YouTubeチャンネルのURLからメインチャンネルIDとRSSフィードURLを取得する関数 get_main_channel_info() を紹介します。この関数を使えば、単一のURLに対して簡単にチャンネル情報を取得できます。

コードスニペット

import requests
from bs4 import BeautifulSoup
import re

def get_main_channel_info(youtube_url):
    try:
        # HTMLを取得
        response = requests.get(youtube_url)
        response.raise_for_status()  # ステータスコードのチェック
        html_content = response.text

        # BeautifulSoupで解析
        soup = BeautifulSoup(html_content, 'html.parser')

        # チャンネル名を取得
        channel_title_tag = soup.find("meta", property="og:title")
        channel_title = channel_title_tag["content"] if channel_title_tag else "不明なチャンネル"

        # canonicalタグを探す
        canonical_link = soup.find('link', rel='canonical')
        if canonical_link and 'href' in canonical_link.attrs:
            canonical_url = canonical_link['href']

            # channel_idを抽出 (URL内に含まれる場合)
            channel_id_match = re.search(r"channel/([^/?&]+)", canonical_url)
            if channel_id_match:
                channel_id = channel_id_match.group(1)
                rss_url = f"https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}"
                return youtube_url, channel_title, channel_id, rss_url

        # 必要な情報が見つからない場合
        return youtube_url, channel_title, "不明なID", "RSSフィードなし"
    except Exception as e:
        print(f"エラー: {e}")
        return youtube_url, "不明なチャンネル", "エラー", "エラー"

使い方

以下のように呼び出すことで、単一のYouTubeチャンネルURLから情報を取得できます。

サンプルコード

url = "https://www.youtube.com/@GoogleDevelopers"
result = get_main_channel_info(url)
print("URL:", result[0])
print("チャンネル名:", result[1])
print("メインチャンネルID:", result[2])
print("RSSフィードURL:", result[3])

応用例: コマンドライン入力とCSV保存

複数のYouTubeチャンネルURLをコマンドライン引数で受け取り、情報をCSV形式で保存するプログラムに拡張します。

コードスニペット

import csv
import sys
import requests
from bs4 import BeautifulSoup
import re

def get_main_channel_info(youtube_url):
    try:
        # HTMLを取得
        response = requests.get(youtube_url)
        response.raise_for_status()  # ステータスコードのチェック
        html_content = response.text

        # BeautifulSoupで解析
        soup = BeautifulSoup(html_content, 'html.parser')

        # チャンネル名を取得
        channel_title_tag = soup.find("meta", property="og:title")
        channel_title = channel_title_tag["content"] if channel_title_tag else "不明なチャンネル"

        # canonicalタグを探す
        canonical_link = soup.find('link', rel='canonical')
        if canonical_link and 'href' in canonical_link.attrs:
            canonical_url = canonical_link['href']

            # channel_idを抽出 (URL内に含まれる場合)
            channel_id_match = re.search(r"channel/([^/?&]+)", canonical_url)
            if channel_id_match:
                channel_id = channel_id_match.group(1)
                rss_url = f"https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}"
                return youtube_url, channel_title, channel_id, rss_url

        # 必要な情報が見つからない場合
        return youtube_url, channel_title, "不明なID", "RSSフィードなし"
    except Exception as e:
        print(f"エラー: {e}")
        return youtube_url, "不明なチャンネル", "エラー", "エラー"

def save_to_csv(output_filename, youtube_urls):
    with open(output_filename, mode="w", encoding="utf-8", newline="") as csv_file:
        writer = csv.writer(csv_file)
        # ヘッダー
        writer.writerow(["URL", "チャンネル名", "メインチャンネルID", "RSSフィードURL"])

        # 各URLについて情報を取得して書き込み
        for url in youtube_urls:
            row = get_main_channel_info(url)
            writer.writerow(row)

def main():
    # コマンドライン引数の処理
    if len(sys.argv) < 3:
        print("使い方: python script.py 出力ファイル名.csv URL1 [URL2 URL3 ...]")
        sys.exit(1)

    # 出力ファイル名とURLリストを取得
    output_filename = sys.argv[1]
    youtube_urls = sys.argv[2:]

    # 情報をCSVに保存
    save_to_csv(output_filename, youtube_urls)
    print(f"チャンネル情報が {output_filename} に保存されました。")

if __name__ == "__main__":
    main()

使い方

  1. このコードを youtube_channel_info.py として保存します。
  2. コマンドラインから以下のように実行します:
python youtube_channel_info.py 出力ファイル名.csv URL1 URL2 URL3 ...

python youtube_channel_info.py channel_info.csv https://www.youtube.com/@GoogleDevelopers

実行結果

指定したCSVファイルに以下のようなデータが保存されます:

URLチャンネル名メインチャンネルIDRSSフィードURL
https://www.youtube.com/@GoogleDevelopersGoogle DevelopersUC_x5XG1OV2P6uZZ5FSM9Ttwhttps://www.youtube.com/feeds/videos.xml?channel_id=UC_x5XG1OV2P6uZZ5FSM9Ttw

応用例: RSSフィードを読み込んで内容を出力する

import requests
from bs4 import BeautifulSoup
import re
import feedparser
import sys

def get_main_channel_info(youtube_url):
    """YouTubeのURLからメインチャンネルIDを取得"""
    try:
        # HTMLを取得
        response = requests.get(youtube_url)
        response.raise_for_status()  # ステータスコードのチェック
        html_content = response.text

        # BeautifulSoupで解析
        soup = BeautifulSoup(html_content, 'html.parser')

        # チャンネル名を取得
        channel_title_tag = soup.find("meta", property="og:title")
        channel_title = channel_title_tag["content"] if channel_title_tag else "不明なチャンネル"

        # canonicalタグを探す
        canonical_link = soup.find('link', rel='canonical')
        if canonical_link and 'href' in canonical_link.attrs:
            canonical_url = canonical_link['href']

            # channel_idを抽出
            channel_id_match = re.search(r"channel/([^/?&]+)", canonical_url)
            if channel_id_match:
                channel_id = channel_id_match.group(1)
                rss_url = f"https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}"
                return channel_title, channel_id, rss_url

        # 情報が見つからない場合
        return "不明なチャンネル", "不明なID", "RSSフィードなし"
    except Exception as e:
        print(f"エラー: {e}")
        return "不明なチャンネル", "エラー", "エラー"

def fetch_and_display_rss_feed(rss_url):
    """RSSフィードを取得して表示"""
    try:
        feed = feedparser.parse(rss_url)
        if 'title' in feed.feed:
            print(f"\nチャンネル名: {feed.feed.title}")
        else:
            print("\nRSSフィード情報を取得できませんでした。")

        for entry in feed.entries:
            print(f"タイトル: {entry.title}")
            print(f"リンク: {entry.link}")
            print(f"公開日時: {entry.published}")
            print("-" * 40)
    except Exception as e:
        print(f"エラー: RSSフィードの取得中に問題が発生しました。エラー: {e}")

if __name__ == "__main__":
    # コマンドライン引数の処理
    if len(sys.argv) < 2:
        print("使い方: python script.py <YouTubeチャンネルのURL>")
        sys.exit(1)

    youtube_url = sys.argv[1]
    channel_title, channel_id, rss_url = get_main_channel_info(youtube_url)

    print(f"チャンネル名: {channel_title}")
    print(f"チャンネルID: {channel_id}")
    print(f"RSSフィードURL: {rss_url}")

    if rss_url != "RSSフィードなし":
        fetch_and_display_rss_feed(rss_url)

使い方

python youtube_rss_fetcher.py https://www.youtube.com/@GoogleDevelopers

解説

コア機能: get_main_channel_info() の仕組み

  • HTMLの取得: requestsライブラリでYouTubeページのHTMLを取得。
  • BeautifulSoupによる解析: <meta>タグからチャンネル名、<link rel="canonical">タグから正しいチャンネルIDを抽出。
  • 正規表現: re.search を使い、URL内の channel/ に続くチャンネルIDを取得。

応用例のポイント

  • コマンドライン引数を使用することで、複数のURLに対応。
  • CSV形式で保存することで、他のシステムやツールでの再利用性を向上。

まとめ

  • 単一のYouTubeチャンネルの情報を取得する場合は、get_main_channel_info() を直接呼び出して利用。
  • 複数のURLを処理し、結果をCSV形式で保存する場合は、コマンドライン引数を利用した応用版コードを活用。
目次