2013-03-19 3 views
5

Desidero ottenere tutte le URL video di un canale specifico. Penso che JSON con Python o Java sia una buona scelta. Posso ottenere il video più recente con il seguente codice, ma come posso ottenere TUTTI i collegamenti video (> 500)?python: ottieni tutti gli URL video youtube di un canale

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 

risposta

9

Aumento max-risultati da 1 a tuttavia molti si desidera, ma attenzione non consigliano afferrare troppi in una chiamata e si limiterà a 50 (https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_parameters).

Invece si potrebbe prendere in considerazione l'acquisizione dei dati in gruppi di 25, ad esempio, cambiando l'indice di inizio fino a quando nessuno è tornato indietro.

EDIT: Ecco il codice per come lo farei

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

buona risposta, ma sarebbe meglio usare qualcosa come "ad eccezione SpecificError" e non un'eccezione generica: se ci sono altri problemi con il carico JSON o con l'analisi di risposta, questo codice di tipo li nasconde. –

+1

Buon punto, se il poster decide di usarlo, allora sicuramente una buona idea per fare qualche ricerca e trovare l'errore specifico –

+0

Se rimuoverete: print len ​​(video) allora avrete errore ... quindi penso che sarà necessario aggiustalo. –

6

Sulla base del codice trovato qui e in altri posti, ho scritto un piccolo script che fa questo. Il mio script utilizza la v3 dell'API di YouTube e non colpisce il limite di 500 risultati che Google ha impostato per le ricerche.

Il codice è disponibile su GitHub a:. https://github.com/dsebastien/youtubeChannelVideosFinder

+1

Grazie per questo. Combinato con [pafy] (https://github.com/mps-youtube/pafy) puoi recuperare tutti i video su un canale. – Jabba

+2

questo non ha funzionato per il canale PyCon 2015 o anche l'esempio menzionato sul git, dice solo canale non trovato. Sto facendo qualcosa di sbagliato. –

1

Dopo il cambio API di YouTube, max k di risposta non funziona. In sostituzione, la funzione seguente fornisce un elenco dei video di YouTube in un determinato canale. Si prega di notare che è necessario un API Key per farlo funzionare.

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