2013-03-19 13 views
5

Ich möchte alle Video-URLs eines bestimmten Kanals erhalten. Ich denke, Json mit Python oder Java wäre eine gute Wahl. Ich kann das neueste Video mit dem folgenden Code erhalten, aber wie bekomme ich ALLE Video-Links (> 500)?Python: Holen Sie sich alle Youtube-Video-URLs eines Kanals

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 

Antwort

9

Zunahme max-Ergebnisse von 1 bis jedoch viele Sie wollen, aber passen sie nicht raten, zu viele in einem Aufruf greifen und werden Sie bei 50 (https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_parameters) begrenzen.

Stattdessen könnten Sie die Daten nach unten in Chargen von 25 Grabbing betrachten, sagen wir, durch eine Änderung der Start-Index, bis keiner zurück kam.

EDIT: Hier ist der Code, wie ich es hier und an einigen anderen Orten

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

Gute Antwort, aber es wäre besser, etwas zu verwenden, wie „außer SpecificError“ und nicht eine allgemeine Ausnahme: wenn es andere Probleme mit der json Last oder mit der Antwort Parsing, diese Art Code ihnen verstecken. –

+1

Guter Punkt, wenn das Plakat, es zu benutzen entscheidet dann auf jeden Fall eine gute Idee, einige der Forschung zu tun und den spezifischen Fehler –

+0

finden Wenn Sie entfernen: print len ​​(Videos), dann werden Sie erhielt Fehler ... so denke ich, müssen repariere das . –

6

Basierend auf dem Code tun würde, habe ich ein kleines Skript geschrieben, das dies tut. Mein Skript verwendet v3 der Youtube-API und trifft nicht auf das Limit von 500 Ergebnissen, das Google für Suchvorgänge festgelegt hat.

Der Code ist über bei GitHub verfügbar. https://github.com/dsebastien/youtubeChannelVideosFinder

+1

Danke dafür. In Kombination mit [pafy] (https://github.com/mps-youtube/pafy) kannst du alle Videos auf einem Kanal abrufen. – Jabba

+2

das hat nicht funktioniert für PyCon 2015 channel oder sogar das Beispiel auf dem git erwähnt, es sagt nur Kanal nicht gefunden. Mache ich etwas falsch. –

1

Nach dem youtube-API ändern, max k Antwort nicht funktioniert. Als Ersatz bietet die folgende Funktion eine Liste der Youtube-Videos in einem bestimmten Kanal. Bitte beachten Sie, dass Sie eine API Key benötigen, damit es funktioniert.

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 
Verwandte Themen