質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
YouTube API

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

Python

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

Q&A

1回答

3064閲覧

YoutubeAPIをGoogleColabを利用してチャンネル情報を取得した際のエラーを解決したい

GASHIRA

総合スコア10

YouTube API

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

Python

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

0グッド

0クリップ

投稿2021/04/11 13:00

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
YoutubeAPIを活用して今後のYoutube活動における調査を行うと利用をしてみようと考えております。
https://su-gi-rx.com/archives/4528#i-2
のサイトなどでキーワードなどで調べて出てくる動画チャンネルの分析をひとまずCSV吐き出しで行おうと考えておりまして、コピーして行ったのですが、なかなかうまくいきません。
初歩的なミスや相談になっているかもしれませんが、何卒ご助言頂ければ幸いです。

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

エラーメッセージ

HttpError Traceback (most recent call last)
<ipython-input-19-e6b6718e68d1> in <module>()
33 maxResults = 50,
34 order = "date", #日付順にソート
---> 35 pageToken = nextpagetoken #再帰的に指定
36 ).execute()
37

1 frames
/usr/local/lib/python3.7/dist-packages/googleapiclient/_helpers.py in positional_wrapper(*args, **kwargs)
132 elif positional_parameters_enforcement == POSITIONAL_WARNING:
133 logger.warning(message)
--> 134 return wrapped(*args, **kwargs)
135
136 return positional_wrapper

/usr/local/lib/python3.7/dist-packages/googleapiclient/http.py in execute(self, http, num_retries)
913 callback(resp)
914 if resp.status >= 300:
--> 915 raise HttpError(resp, content, uri=self.uri)
916 return self.postproc(resp, content)
917

HttpError: <HttpError 400 when requesting https://youtube.googleapis.com/youtube/v3/search?part=snippet&channelId=channelId&maxResults=50&order=date&key=[入力したkeyがひょうじされている]&alt=json returned "Request contains an invalid argument.". Details: "Request contains an invalid argument.">

該当のソースコード#

python

1 2from apiclient.discovery import build 3import pandas as pd 4from apiclient.discovery import build 5from apiclient.errors import HttpError 6 7# API情報 8API_KEY = 'API KEY' 9YOUTUBE_API_SERVICE_NAME = 'youtube' 10YOUTUBE_API_VERSION = 'v3' 11 12youtube = build( 13 YOUTUBE_API_SERVICE_NAME, 14 YOUTUBE_API_VERSION, 15 developerKey=API_KEY 16 ) 17 18search_response = youtube.search().list( 19 q='[キーワード]', 20 part='id,snippet', 21 maxResults=25 22).execute() 23 24channels = [] 25 26for search_result in search_response.get("items", []): 27 if search_result["id"]["kind"] == "youtube#channel": 28 channels.append([search_result["snippet"]["title"], 29 search_result["id"]["channelId"]]) 30 31for channel in channels: 32 print(channel) 33 34
API_KEY = 'API KEY' YOUTUBE_API_SERVICE_NAME = 'youtube' YOUTUBE_API_VERSION = 'v3' CHANNEL_ID = 'channelId' channels = [] #チャンネル情報を格納する配列 searches = [] #videoidを格納する配列 videos = [] #各動画情報を格納する配列 nextPagetoken = None nextpagetoken = None youtube = build( YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=API_KEY ) channel_response = youtube.channels().list( part = 'snippet,statistics', id = CHANNEL_ID ).execute() for channel_result in channel_response.get("items", []): if channel_result["kind"] == "youtube#channel": channels.append([channel_result["snippet"]["title"],channel_result["statistics"]["subscriberCount"],channel_result["statistics"]["videoCount"],channel_result["snippet"]["publishedAt"]]) while True: if nextPagetoken != None: nextpagetoken = nextPagetoken search_response = youtube.search().list( part = "snippet", channelId = CHANNEL_ID, maxResults = 50, order = "date", #日付順にソート pageToken = nextpagetoken #再帰的に指定 ).execute() for search_result in search_response.get("items", []): if search_result["id"]["kind"] == "youtube#video": searches.append(search_result["id"]["videoId"]) try: nextPagetoken = search_response["nextPageToken"] except: break for result in searches: video_response = youtube.videos().list( part = 'snippet,statistics', id = result ).execute() for video_result in video_response.get("items", []): if video_result["kind"] == "youtube#video": videos.append([video_result["snippet"]["title"],video_result["statistics"]["viewCount"],video_result["statistics"]["likeCount"],video_result["statistics"]["dislikeCount"],video_result["statistics"]["commentCount"],video_result["snippet"]["publishedAt"]]) videos_report = pd.DataFrame(videos, columns=['title', 'viewCount', 'likeCount', 'dislikeCount', 'commentCount', 'publishedAt']) videos_report.to_csv("videos_report.csv", index=None) channel_report = pd.DataFrame(channels, columns=['title', 'subscriberCount', 'videoCount', 'publishedAt']) channel_report.to_csv("channels_report.csv", index=None)

試したこと

ここに問題に対して試したことを記載してください。

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

GoogleColab

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

エラーメッセージの部分が、APIキーの部分のみ改変されていて
それ以外はそのままであるという前提ですが

CHANNEL_ID = 'channelId'

の部分がコピペ元のサイトそのままになっているためだと思われます。

ここは個別のチャンネルIDを指定しなければなりません。

例:気象庁のチャンネルならば、
CHANNEL_ID = 'UCajQ4ZQJrgwSxkF6xaCfrRw'

チャンネルIDは、YouTubeの動画ページのチャンネルページを開いたときに現れている、UCから始まる文字列です。

https://www.youtube.com/channel/UCxxxxxxxxxxxxx ←この部分。


(追記)
あと、動画によっては、高評価数・低評価数・コメント数がAPIで取得できない場合があります。
そのような動画があると、KeyErrorが発生してプログラムが止まってしまいます。
したがって、下記のようにします。

diff

1for video_result in video_response.get("items", []): 2 if video_result["kind"] == "youtube#video": 3- videos.append([video_result["snippet"]["title"],video_result["statistics"]["viewCount"],video_result["statistics"]["likeCount"],video_result["statistics"]["dislikeCount"],video_result["statistics"]["commentCount"],video_result["snippet"]["publishedAt"]]) 4+ videos.append([video_result["snippet"]["title"],video_result["statistics"]["viewCount"],video_result["statistics"].get("likeCount"),video_result["statistics"].get("dislikeCount"),video_result["statistics"].get("commentCount"),video_result["snippet"]["publishedAt"]])

投稿2021/04/11 13:11

編集2021/04/11 13:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問