2013-03-19 91 views
5

私は特定のチャンネルのすべてのビデオURLを取得したいと思います。私はpythonまたはjavaとjsonは良い選択だと思う。次のコードで最新のビデオを入手できますが、どのようにすべてのビデオリンクを取得できますか(> 500)?python:チャンネルのすべてのYouTube動画URLを取得

import urllib, json 
author = 'Youtube_Username' 
inp = urllib.urlopen(r'http://gdata.youtube.com/feeds/api/videos?max-results=1&alt=json&orderby=published&author=' + author) 
resp = json.load(inp) 
inp.close() 
first = resp['feed']['entry'][0] 
print first['title'] # video title 
print first['link'][0]['href'] #url 

答えて

9

1から欲しいしかし、多くの増加のmax-結果、彼らは1回の呼び出しであまりにも多くつかん助言するものではありませんし、50(https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_parameters)であなたを制限されます注意してください。

代わりに、何も戻らなくなるまで開始インデックスを変更することで、データを25のバッチで取得することができます。

編集:ここで私は、コードに基づいて、それを

import urllib, json 
author = 'Youtube_Username' 

foundAll = False 
ind = 1 
videos = [] 
while not foundAll: 
    inp = urllib.urlopen(r'http://gdata.youtube.com/feeds/api/videos?start-index={0}&max-results=50&alt=json&orderby=published&author={1}'.format(ind, author)) 
    try: 
     resp = json.load(inp) 
     inp.close() 
     returnedVideos = resp['feed']['entry'] 
     for video in returnedVideos: 
      videos.append(video) 

     ind += 50 
     print len(videos) 
     if (len(returnedVideos) < 50): 
      foundAll = True 
    except: 
     #catch the case where the number of videos in the channel is a multiple of 50 
     print "error" 
     foundAll = True 

for video in videos: 
    print video['title'] # video title 
    print video['link'][0]['href'] #url 
+1

良い答えが、一般的な例外「SpecificError除く」とないようなものを使用する方がよいでしょう:JSONの負荷や応答解析と他の問題がある場合は、この種のコードは、それらを非表示になります。 –

+1

良い点、ポスターを使用することを決定した場合、いくつかの調査を行い、特定のエラーを見つけることを間違いなく考えてください –

+0

削除する場合:print len(videos)を入力するとエラーが発生します。それを修正してください。 –

6

を行うだろうかのコードがありますここに発見し、他のいくつかの場所で、私はこれを行う小さなスクリプトを書きました。私のスクリプトはYoutubeのAPIのv3を使用しており、Googleが検索のために設定した500の結果制限には当てられません。

コードはGitHubでの上で利用可能です:。ユーチューブのAPIの変更後https://github.com/dsebastien/youtubeChannelVideosFinder

+1

ありがとうございます。 [pafy](https://github.com/mps-youtube/pafy)と組み合わせると、チャンネル上のすべての動画を取得できます。 – Jabba

+2

これはPyCon 2015チャンネル、またはgitで言及された例でさえも機能しませんでした。私は間違ったことをしていますか? –

1

、最大のkの答えは動作しません。以下の機能は、特定のチャンネルのYouTube動画のリストを提供します。それが動作するにはAPI Keyが必要であることに注意してください。

import urllib 
import json 

def get_all_video_in_channel(channel_id): 
    api_key = YOUR API KEY 

    base_video_url = 'https://www.youtube.com/watch?v=' 
    base_search_url = 'https://www.googleapis.com/youtube/v3/search?' 

    first_url = base_search_url+'key={}&channelId={}&part=snippet,id&order=date&maxResults=25'.format(api_key, channel_id) 

    video_links = [] 
    url = first_url 
    while True: 
     inp = urllib.urlopen(url) 
     resp = json.load(inp) 

     for i in resp['items']: 
      if i['id']['kind'] == "youtube#video": 
       video_links.append(base_video_url + i['id']['videoId']) 

     try: 
      next_page_token = resp['nextPageToken'] 
      url = first_url + '&pageToken={}'.format(next_page_token) 
     except: 
      break 
    return video_links 
関連する問題