11
votes

Python: Obtenez toutes les URL vidéo YouTube d'une chaîne

Je veux obtenir toutes les URL vidéo d'un canal spécifique. Je pense que Json avec Python ou Java serait un bon choix. Je peux obtenir la nouvelle vidéo avec le code suivant, mais comment puis-je obtenir tous les liens vidéo (> 500)? XXX


0 commentaires

6 Réponses :


11
votes

Augmente les résultats maximaux de 1 à cependant nombreux que vous voulez, mais que vous ne conseillez pas, ils ne conseillent pas de saisir trop d'un appel et vous limiteront à 50 ( https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_paramètres ).

à la place, vous pouvez envisager de saisir les données en lots de 25, disons , en modifiant l'index de démarrage jusqu'à ce que personne ne revienne. p>

Edit: Voici le code de la façon dont je le ferais P>

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


6 commentaires

Une bonne réponse, mais il serait préférable d'utiliser quelque chose comme "sauf spécifiqueError" et non une exception générique: s'il y a d'autres problèmes avec la charge JSON ou avec l'analyse de réponse, ce type de code les cachera.


Bon point, si l'affiche décide de l'utiliser, alors une bonne idée de faire des recherches et de trouver l'erreur spécifique


Si vous supprimez: Imprimez LEN (Vidéos), vous aurez une erreur ... Donc, je pense que cela devra résoudre ce problème.


@Catalinfestila qui n'est pas vrai dans mon cas. Je peux supprimer chaque impression (y compris Len (Vidéos)) et cela fonctionnera. Vérifiez les autres choses et réessayez.


Je pense que cette fonctionnalité est désormais obsolète selon cette réponse YouTube.com/devicesupport


Plus disponible.



6
votes

Basé sur le code trouvé ici et à d'autres endroits, j'ai écrit un petit script qui le fait. Mon script utilise la V3 de l'API de YouTube et ne frappe pas contre la limite de 500 résultats que Google est définie pour les recherches.

Le code est disponible sur GitHub: https://github.com/DSEBASTIN/YOUTUTUBCHANNVIDOSFINDER < / p>


4 commentaires

Merci pour cela. Combiné avec Pafy Vous pouvez récupérer toutes les vidéos sur une chaîne.


Cela n'a pas fonctionné pour le canal Pycon 2015 ni même l'exemple mentionné sur le GIT, il est juste de dire que le canal n'est pas trouvé. Est-ce que je fais quelque chose de mal.


J'ai eu beaucoup d'erreurs d'utiliser cela. Certes, mon nom de chaîne semble avoir un espace qui a causé des problèmes sur la CLI, mais l'outil ne prend pas l'identité à la place, mais il a recherché 5 ans et n'a trouvé aucun vidz et j'ai 410 sur la chaîne. .


FYI Je n'ai pas le temps de maintenir ce projet, mais si quelqu'un est intéressé, n'hésitez pas à y aller et je vais joindre avec plaisir à des améliorations ;-)



16
votes

Après le changement d'API YouTube, la réponse de Max K. Ne fonctionne pas. En remplacement, la fonction ci-dessous fournit une liste des vidéos YouTube dans un canal donné. Veuillez noter que vous avez besoin d'un clé API pour que travail.

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


11 commentaires

Ceci est une réponse simple et précise car je ne peux pas le trouver dans la référence de l'API Python.


@Stian il donne et error httperror: Erreur HTTP 403: Interdit


Pour Python 3: importer urllib.request , modifier inp = urllib.urlopen (URL) à inp = urllib.request.urlopen (URL, délai d'attente = 1)


@SMCS ça ne marche pas. urllib.error.httPerror: Erreur HTTP 403: Interdit


@ RTT0012 Quelle url essayez-vous?


@SMCS J'ai copié votre code et j'ai ajouté ma clé API, le reste que je n'ai pas changé. Je voulais regarder ce chanell: YouTube.com/c/3blue1Brown/videos i Exécutez le code en exécutant get_all_video_in_channel (ucyo_jab_esufrv4b17ajtaw). L'ID Chanell J'ai trouvé: COMMANDERPICKER.COM/YOUTUTUBE-CHANNELNED.PHP Le message d'erreur se lit comme suit: URLLIB.ERROR.HTTTTPERROR: ERREUR HTTP 403: Interdit


@ RTT0012 Cela fonctionne pour moi avec ce site. Passez-vous une chaîne à la méthode, c'est-à-dire get_all_video_in_channel ("ucyo_jab_esuf4b17ajtaw") ?


@SMCS j'ai tapé dans mon code corrottly. En copiant le texte, j'ai oublié la citation chante. Ma clé API n'a aucune restriction. Obtenez toujours le même message d'erreur. Je colle le message d'erreur comme suiveurs ...


Fichier @SMCS "C: \ py38 \ lib \ urllib \ request.py", ligne 222, in Urlopen retourner opener.Open (URL, données, délai, timeout) fichier "C: \ py38 \ lib \ urllib \ request.py", Ligne 531, en réponse ouverte = Meth (req, réponse) Fichier "C: \ py38 \ lib \ urllib \ request.py", ligne 640, dans http_response réponse = self.parent.error (fichier "c: \ py38 \ lib \ urllib \ request.py ", ligne 569, in Error renvoie self._call_chain (* args) Fichier" C: \ py38 \ lib \ urllib \ request.py ", ligne 502, in _call_chain résultat = func (* args) Fichier "C: \ py38 \ lib \ urllib \ request.py", ligne 649, dans http_error_default soulever httperror (req.full_url, code, msg, hdrs, fp)


@SMCS La dernière ligne de message d'erreur se lit comme suit: Urllib.error.httPerror: Erreur HTTP 403: Interdit


@ RTT0012 Vous devriez ouvrir une question sur codereview.stackexchange.com



4
votes

manière indépendante de faire des choses. Aucun API, pas de limite de débit.

import requests
username = "marquesbrownlee"
url = "https://www.youtube.com/user/username/videos"
page = requests.get(url).content
data = str(page).split(' ')
item = 'href="/watch?'
vids = [line.replace('href="', 'youtube.com') for line in data if item in line] # list of all videos listed twice
print(vids[0]) # index the latest video


0 commentaires

0
votes

Utilisation du pilote de chrome SELENIUM:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

driverPath = ChromeDriverManager().install()

driver = webdriver.Chrome(driverPath)

url = 'https://www.youtube.com/howitshouldhaveended/videos'

driver.get(url)

height = driver.execute_script("return document.documentElement.scrollHeight")
previousHeight = -1

while previousHeight < height:
    previousHeight = height
    driver.execute_script(f'window.scrollTo(0,{height + 10000})')
    time.sleep(1)
    height = driver.execute_script("return document.documentElement.scrollHeight")

vidElements = driver.find_elements_by_id('thumbnail')
vid_urls = []
for v in vidElements:
    vid_urls.append(v.get_attribute('href'))


0 commentaires

3
votes

Réponse courte:

Voici une bibliothèque qui peut aider avec ça. p>

PIP Installation Scratibe Code> P>

import youtube_dl
    youtube_dl_options = {
        'skip_download': True,
        'ignoreerrors': True
    }
    with youtube_dl.YoutubeDL(youtube_dl_options) as ydl:
        videos = ydl.extract_info(f'https://www.youtube.com/channel/{channel_id}/videos')


1 commentaires

Très bonne solution, également si quelqu'un est quoi d'obtenir l'URL vidéo au lieu d'ID, vous pouvez utiliser Imprimer ("https://www.youtube.com/watch?v=" + STR (vidéo ["Videod' ])) à la place de Imprimer (vidéo ["Videoid ']) .