python:获取频道的所有YouTube视频网址

Joh*_*nny 7 python youtube youtube-api

我想获取特定频道的所有视频网址.我认为使用python或java的json将是一个不错的选择.我可以使用以下代码获取最新视频,但如何获得所有视频链接(> 500)?

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
Run Code Online (Sandbox Code Playgroud)

der*_*mid 22

简短回答:

这是一个可以帮助解决这个问题的库。

pip install scrapetube

import scrapetube

videos = scrapetube.get_channel("UC9-y-6csu5WGm29I7JiwpnA")

for video in videos:
    print(video['videoId'])
Run Code Online (Sandbox Code Playgroud)

长答案:

由于缺乏任何其他解决方案,上述模块是我创建的。这是我尝试过的:

  1. 硒。它有效,但有三大缺点: 1. 它需要安装网络浏览器和驱动程序。2.对CPU和内存要求较高。3.无法处理大通道。
  2. 使用 youtube-dl。像这样:
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')
Run Code Online (Sandbox Code Playgroud)

这也适用于小型频道,但对于较大的频道,我会因为在如此短的时间内发出如此多的请求而被 youtube 阻止(因为 youtube-dl 会为频道中的每个视频下载更多信息)。

scrapetube所以我制作了一个使用 Web API 来获取所有视频的库。

  • 非常好的解决方案,如果有人想要获取视频 url 代替 id,您可以使用 `print("https://www.youtube.com/watch?v="+str(video['videoId'])) ` 代替 `print(video['videoId'])` 。 (2认同)

max*_* k. 10

将最大结果从1增加到您想要的多个,但要注意,他们不建议在一次通话中抓取太多,并将限制为50(https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_parameters).

相反,您可以考虑通过更改start-index直到没有回来来批量抓取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
Run Code Online (Sandbox Code Playgroud)

  • 我认为此功能现已根据此回复https://youtube.com/devicesupport弃用 (3认同)

Sti*_*ian 8

更改youtube API后,最大k。的答案不起作用。作为替代,下面的功能提供给定频道中的youtube视频列表。请注意,您需要一个API密钥才能正常工作。

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
Run Code Online (Sandbox Code Playgroud)

  • 对于 Python 3:“导入 urllib.request”,将“inp = urllib.urlopen(url)”更改为“inp = urllib.request.urlopen(url,timeout=1)” (2认同)

dSe*_*ien 6

基于此处和其他地方的代码,我编写了一个小脚本来执行此操作.我的脚本使用了Youtube API的v3,但没有达到Google为搜索设置的500个结果限制.

该代码可在GitHub上获得:https://github.com/dsebastien/youtubeChannelVideosFinder

  • 这对于PyCon 2015频道甚至git上提到的例子都不起作用,它只是说未找到频道.难道我做错了什么. (2认同)