この記事では、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()
使い方
- このコードを
youtube_channel_info.py
として保存します。 - コマンドラインから以下のように実行します:
python youtube_channel_info.py 出力ファイル名.csv URL1 URL2 URL3 ...
例
python youtube_channel_info.py channel_info.csv https://www.youtube.com/@GoogleDevelopers
実行結果
指定したCSVファイルに以下のようなデータが保存されます:
URL | チャンネル名 | メインチャンネルID | RSSフィードURL |
---|---|---|---|
https://www.youtube.com/@GoogleDevelopers | Google Developers | UC_x5XG1OV2P6uZZ5FSM9Ttw | https://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形式で保存する場合は、コマンドライン引数を利用した応用版コードを活用。