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

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

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

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

YouTube API

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

Python

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

Q&A

解決済

1回答

2394閲覧

Youtube Data APIを用いて、channelIdから登録者数を出したい

joji17

総合スコア1

YouTube

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

YouTube API

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

Python

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

0グッド

0クリップ

投稿2021/02/28 16:04

Youtube Data API を用いて、channelIdから登録者数を出したい

Youtube Data Api を用いて、キーワード検索からそれぞれの動画情報を抽出するコードは完成したのですが、
チャンネル登録者数だけ、channel()に格納されているため、取得できない状況です。

質問内容:

  1. "試したこと"に記載した方法以外で、"該当のソースコード"に新規コードを追加するだけで、チャンネル登録者数も抽出する方法はございますでしょうか?

  2. 1の質問で、無い場合、"試したこと"のコードの何が間違っていることが原因で、チャンネル登録者数が取得できていないのでしょうか?

該当のソースコード

Python

1from googleapiclient.discovery import build 2import pandas as pd 3import codecs 4 5def get_video_info(query, maxResults, next): 6 search_request = youtube.search().list( 7 part='id', 8 q=query, 9 type='video', 10 maxResults=maxResults, 11 ) 12 13 i = 0 14 while search_request and i < next: 15 search_response = search_request.execute() 16 video_ids = [item['id']['videoId'] for item in search_response['items']] 17 18 videos_response = youtube.videos().list( 19 part='snippet,statistics', 20 id=','.join(video_ids) 21 ).execute() 22 23 yield videos_response['items'] 24 search_request = youtube.search().list_next(search_request, search_response) 25 i += 1 26 27 return search_request 28 29YOUTUBE_API_KEY = 'xxxxxx' 30youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY) 31query = '意識' 32dict = get_video_info( 33 query, 34 50, 35 3, 36) 37 38# csvファイルに保存する 39extacted_data_file = '意識.csv' 40with codecs.open(extacted_data_file, "w", encoding='cp932', errors='replace') as f: 41 for i, items_per_page in enumerate(dict): 42 if i == 0: 43 column_list = ['id', 'url', 44 'publishedAt','channelTitle', 'channelId', 'title', 45 'viewCount', 'likeCount', 'dislikeCount', 'commentCount', 'subscriberCount'] 46 column_list_str = ','.join(column_list) 47 f.write(column_list_str + '\n') 48 for item in items_per_page: 49 dic_list = [] 50 dic_list.append(item['id']) 51 dic_list.append('http://youtube.com/watch?v=' + item['id']) 52 53 snippet = item['snippet'] 54 for key in ['publishedAt', 'channelTitle','channelId','title']: 55 dic_list.append(snippet[key].replace(',', '_')) 56 57 statistics = item['statistics'] 58 for key in ['viewCount','likeCount','dislikeCount','commentCount']: 59 dic_list.append(statistics[key] if key in statistics else "NA") 60 f.write(','.join(list(map(str, dic_list))) + '\n') 61

試したこと

上記のコードで作成されたcsvファイルを用いて、channelId列からそれぞれの登録者数取得し、それをcsvファイルの最終列に追加しようとしたのですが、以下のコードではうまくチャンネル登録者数を取得できませんでした。

Python

1import pandas as pd 2from googleapiclient.discovery import build 3 4YOUTUBE_API_KEY = 'xxxxxxx' 5 6csv = pd.read_csv('./Desktop/意識.csv',encoding="cp932") 7 8def youtube_channel_detail(channel_id, api_key): 9 api_service_name = 'youtube' 10 api_version = 'v3' 11 youtube = build(api_service_name, api_version, developerKey=api_key) 12 search_response = youtube.channels().list( 13 part='snippet,statistics', 14 id=channel_id, 15 ).execute() 16 17 return search_response['items'][0] 18 19 20 21for idx, row in csv.iterrows(): 22 23 24 def main(): 25 26 d = youtube_channel_detail(csv.row['channelId'], YOUTUBE_API_KEY) 27 csv.iloc[idx, 10] = d['statistics']['subscriberCount'] 28 csv.to_csv(/Users/junji/Desktop/生き方.csv)

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. "試したこと"に記載した方法以外で、"該当のソースコード"に新規コードを追加するだけで、チャンネル登録者数も抽出する方法はございますでしょうか?

下記のような感じになるでしょうか。(先頭行+となっている色付きのところが追加部分)あまり難しく考える必要はないです。前半は、「試したこと」のコードからそのまま引っ張ってきてます。

diff

1from googleapiclient.discovery import build 2import pandas as pd 3import codecs 4 5+def youtube_channel_detail(channel_id, api_key): 6+ api_service_name = 'youtube' 7+ api_version = 'v3' 8+ youtube = build(api_service_name, api_version, developerKey=api_key) 9+ search_response = youtube.channels().list( 10+ part='snippet,statistics', 11+ id=channel_id, 12+ ).execute() 13+ 14+ return search_response['items'][0] 15 16def get_video_info(query, maxResults, next): 17 search_request = youtube.search().list( 18 part='id', 19 q=query, 20 type='video', 21 maxResults=maxResults, 22 ) 23 24 i = 0 25 while search_request and i < next: 26 search_response = search_request.execute() 27 video_ids = [item['id']['videoId'] for item in search_response['items']] 28 29 videos_response = youtube.videos().list( 30 part='snippet,statistics', 31 id=','.join(video_ids) 32 ).execute() 33 34 yield videos_response['items'] 35 search_request = youtube.search().list_next(search_request, search_response) 36 i += 1 37 38 return search_request 39 40YOUTUBE_API_KEY = 'xxxxxx' 41youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY) 42query = '意識' 43dict = get_video_info( 44 query, 45 50, 46 3, 47) 48 49# csvファイルに保存する 50extacted_data_file = '意識.csv' 51with codecs.open(extacted_data_file, "w", encoding='cp932', errors='replace') as f: 52 for i, items_per_page in enumerate(dict): 53 if i == 0: 54 column_list = ['id', 'url', 55 'publishedAt','channelTitle', 'channelId', 'title', 56 'viewCount', 'likeCount', 'dislikeCount', 'commentCount', 'subscriberCount'] 57 column_list_str = ','.join(column_list) 58 f.write(column_list_str + '\n') 59 for item in items_per_page: 60 dic_list = [] 61 dic_list.append(item['id']) 62 dic_list.append('http://youtube.com/watch?v=' + item['id']) 63 64 snippet = item['snippet'] 65 for key in ['publishedAt', 'channelTitle','channelId','title']: 66 dic_list.append(snippet[key].replace(',', '_')) 67 68 statistics = item['statistics'] 69 for key in ['viewCount','likeCount','dislikeCount','commentCount']: 70 dic_list.append(statistics[key] if key in statistics else "NA") 71+ # チャンネル情報を取得し登録者数を最後列に追加する。 72+ channel_detail = youtube_channel_detail(snippet['channelId'], YOUTUBE_API_KEY) 73+ dic_list.append(channel_detail['statistics'].get('subscriberCount')) 74 f.write(','.join(list(map(str, dic_list))) + '\n')
  1. "試したこと"のコードの何が間違っていることが原因で、チャンネル登録者数が取得できていないのでしょうか?

コード変更を最小限に修正するなら下記のようになるかと思います。

(先頭が-の行は削除、+の行は追加)

diff

1import pandas as pd 2from googleapiclient.discovery import build 3 4YOUTUBE_API_KEY = 'xxxxxxx' 5 6csv = pd.read_csv('./Desktop/意識.csv',encoding="cp932") 7 8def youtube_channel_detail(channel_id, api_key): 9 api_service_name = 'youtube' 10 api_version = 'v3' 11 youtube = build(api_service_name, api_version, developerKey=api_key) 12 search_response = youtube.channels().list( 13 part='snippet,statistics', 14 id=channel_id, 15 ).execute() 16 17 return search_response['items'][0] 18 19 20 21for idx, row in csv.iterrows(): 22 23 # 不要なので削除 24- def main(): 25 26- d = youtube_channel_detail(csv.row['channelId'], YOUTUBE_API_KEY) 27+ d = youtube_channel_detail(row['channelId'], YOUTUBE_API_KEY) 28 29 # subscriberCountを持っていない場合でもkeyErrorが出ないように対応 30- csv.iloc[idx, 10] = d['statistics']['subscriberCount'] 31+ csv.iloc[idx, 10] = d['statistics'].get('subscriberCount') 32 csv.to_csv(/Users/junji/Desktop/生き方.csv)

投稿2021/03/01 12:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

joji17

2021/03/02 07:19

ありがとうございました!!解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問