🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2762閲覧

Youtube Data APIによる動画情報取得の抜け漏れ対策について

TM_beginner

総合スコア1

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

2クリップ

投稿2021/01/25 11:32

編集2021/01/25 12:39

前提・実現したいこと

Youtube Data Api V3を活用し、Video IDを漏れなく取得したい。
漏れている原因がコードにあるのか、Youtubeの動画設定などにあるのか(Api側にあるのか)を明らかにしたい。

発生している問題・エラーメッセージ

下記コードにてYoutube Data Apiによる動画情報の取得を行っておりますが、得られているIDの数が実際に投稿されている動画の数と一致しておりません。

該当のソースコード

Python3

1 2from apiclient.discovery import build 3id = "UCD-miitqNY3nyukJ4Fnf4_A" #Vtuberの月ノ美兎さんのチャンネルIDを入れた場合 4 token_check = None 5 nextPageToken = None 6 7 while True: 8 if token_check != None: 9 nextPageToken = token_check 10 11 Search_Video = youtube.search().list( 12 part = "id", 13 channelId = id, 14 maxResults = 50, 15 order = 'date', 16 safeSearch = "none", 17 pageToken = nextPageToken 18 ).execute() 19 20 for ID_check in Search_Video.get("items", []): 21 if ID_check["id"]["kind"] == "youtube#video": 22 id_info = [] 23 id_info = [ID_check["id"]["videoId"]] 24 print(id_info) #仮置き(実際にはDBに情報格納) 25 26 try: 27 token_check = Search_Video["nextPageToken"] 28 except: 29 break

試したこと

漏れている動画を確認し、個別にVideoIDを取得した後、そのID情報をもとにvideos()では情報を取得出来ました。

補足情報(FW/ツールのバージョンなど)

Python 3.9.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/25 12:30

漏れている動画の確認、とはどのようにして行ったのでしょうか。 実際に動画の数を目視で数えたとして、その目視で数えた動画数の方が、apiで得られた動画の数よりも多い、ということでしょうか。
TM_beginner

2021/01/25 12:37

ありがとうございます。 同じくYoutube Data Apiの機能を使い、チャンネルのvideoCount情報を取得し、その数と上のコードで得られるIDの数が一致していないことに気付いたのが投稿させて頂いたキッカケです。どの動画が漏れているかについては目視で確認致しました。
guest

回答1

0

ベストアンサー

下記の手順で、検証してみました。

1.実投稿動画数の確認

YouTubeはスクレイピング(結果として表示されるHTMLページをseleniumその他プログラムの自動的な手段を用いて取得すること)が禁止されている。

したがって、スクレイピング(類似の動作含む)を回避しつつ、動画の数を効率よく数えるため、下記の要領で実投稿動画数をカウントした。

Windows 10 Professional バージョン20H2
ブラウザソフトは、Microsoft Edge バージョン 88.0.705.50 (公式ビルド) (64 ビット)で、
拡張機能をすべて無効にして行った。

(下記のうちブラウザ操作についてはスクリプト等の機械的手段を行わずすべて手動で行った)
・ブラウザでYouTubeからログオフする。
・当該チャンネルページに飛ぶ。
・ブラウザの設定(サイトのアクセス許可)で、「イメージ」を「ブロック」し、画像をオフにする。
・チャンネルページで、動画タブを開く。
・「アップロード済み」となっているセレクトボックスを「すべての動画」に変える。
・中断に「すべて表示」のリンクがあるので、それをクリックする。
・ページをスクロールし、すべての投稿動画をブラウザ内に表示させる。
・ページ内の動画欄をドラッグし、Ctrl+Cを押して、テキスト情報をクリップボードにコピーする。
・Excelを立ち上げ、クリップボードにコピーした内容を、テキスト形式で張り付ける。
・Excel上で、気力で動画タイトルの行のみ抽出する。「字幕」という文字があったり「360°~」から始まるタイトルが2行になっていたりしたので手間取った

以上により、2021/1/25 22:18JST時点で、のチャンネルページに「すべての動画」として表示される動画
**「440個」**であることが確認できました。

2.YouTube APIで取得できる動画数の確認

# 質問文のスクリプトで取得できる結果から、videoidとタイトルのリストを作る。 videos = [] add = videos.append for i in Search_Video: for t in i["items"]: if t["id"].get("videoId"): add((t["id"]["videoId"], t["snippet"]["title"])) >>> len(videos) >>> 412

となり、2021/1/25 22:35JST時点で同チャンネルからAPIで取得できる動画の数は
**「412個」**であることが分かりました。

APIで取得したタイトルと、エクセルのタイトルを昇順並び替えして照合し、どの動画が欠落しているか確認しました。

APIにあって、エクセルにはないものが1件(なんたらフリーチャット)、
エクセル(実投稿動画)にあって、APIにはないものが29件確認できました。

3.考察

APIで取得できていなかった29件の動画IDは以下です。

{'KKXv11Yah4Q', 'aVum3p02SAs', 'hCNqq6axQtY', '_eQHVri4ieo', 'xqkuRNaMXjM', '8dtqh0gxBeQ', 'LRDS84JooTo', 'xq7BDlPc3CY', 'w0pv9F4_lYs', 'naHTMKnEjsM', 'mhhnWObC-uA', 'ojAPlue629o', 'tiSt4O-nppM', 'OFELMaAYfjE', 'EnzRIkWBNeM', 'Z9iXsDO-xl0', 'vlvwH53NCUg', '0QbD-TjW4GE', 'Sj7YcB1TlI0', 'quuZ06TLy-E', 'SpSoY0vvc1c', '6ezHwI9W3YU', 'YYLJpD_V1aQ', 'MbG5iQzXYvw', 'V2PuidDn6GI', 'trGGp3zbJoA', 'Bw_uE7JAFlg', 'a0XhjXcJBm0', 'PFm6cps37oY'}

これらの動画について、APIで取得できる動画情報その他からは、取得できている動画との差異を見つけることはできませんでした。

YouTube search.listで取得できない動画IDが存在するのは、おそらくYouTube APIのバグではないかと思われます。

4.抜け漏れの回避方法

1つの方法として、playlistを使用する手段が考えられます。(ただし確実に抜け漏れを防げるかどうかは検証しきれていません)

「UU」にチャンネルIDの3文字目以降をつなげた文字列が、そのチャンネルのアップロード済み動画一覧を取得できるプレイリストIDになっているようです。
(配信中の動画や、永続的に待機状態になっている動画は取得できません。)

完全に一致しているかは検証できていません。
質問中に記載されたチャンネルに関して、下記のスクリプトで取得できる動画数と、目視で数えた投稿動画数は、一致しました。(2021/1/25 0:26JST時点。数のみ確認したため、入り繰りがある可能性はゼロではありません。)

import requests def get_playlist_items(pl_id): api_key='api_key' url = f'https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"UU"+pl_id[2:]}&key={api_key}&part=snippet&maxResults=50' ret = [] while True: try: resp = requests.get(url) resp.raise_for_status() data = resp.json() except Exception as e: print(str(e)) return [] items = data.get('items') if items: ret.extend(items) nextPageToken = data.get('nextPageToken') if nextPageToken: url=f'https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"UU"+pl_id[2:]}&key={api_key}&part=snippet&maxResults=50&pageToken={nextPageToken}' else: return ret # テスト items = get_playlist_items("UCD-miitqNY3nyukJ4Fnf4_A") for v in items: print(v["snippet"]["resourceId"]["videoId"], v["snippet"]["title"]) print(len(items))

投稿2021/01/25 16:03

編集2021/01/25 22:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TM_beginner

2021/01/26 02:54

ご回答ありがとうございました。 他のチャンネルでも同様であることと、取れていない動画の一貫性が確認出来ないため、APIサイドのバグという認識です。 またプレイリスト経由の方法もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問