我们需要YouTube的频道名称的视频列表(使用API)。
我们可以通过下面的API获得一个频道列表(只有频道名):
https://gdata.youtube.com/feeds/api/channels?v=2&q=tendulkar
下面是频道的直接链接
https://www.youtube.com/channel/UCqAEtEr0A0Eo2IVcuWBfB9g
Or
WWW.YouTube.com/channel/HC-8jgBP-4rlI
现在,我们需要>> UCqAEtEr0A0Eo2IVcuWBfB9g或HC-8jgBP-4rlI频道的视频。
我们尝试
https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&User=UC7Xayrf2k0NZiz3S04WuDNQ
https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&q=UC7Xayrf2k0NZiz3S04WuDNQ
但是,这并没有帮助。
我们需要把所有视频发到频道上。上传到一个频道的视频可以来自多个用户,因此我不认为提供用户参数会有帮助…
在最初的问题被问到之后很久才发布,但我做了一个python包,使用一个非常简单的API来做到这一点。它把所有的视频上传到一个频道,但我不确定这一部分(包括在最初的问题中):
上传到一个频道的视频可以来自多个用户,因此我不认为提供用户参数会有帮助…
也许YouTube在这个问题发布后的8年里发生了变化,但如果没有,我制作的软件包可能不包括这个案例。
使用API:
pip3 install -U yt-videos-list # macOS
pip install -U yt-videos-list # Windows
# if that doesn't work, try
python3 -m pip install -U yt-videos-list # macOS
python -m pip install -U yt-videos-list # Windows
然后打开一个python解释器
python3 # macOS
python # Windows
然后运行程序:
from yt_videos_list import ListCreator
lc = ListCreator()
help(lc) # display API information - shows available parameters and functions
my_url = 'https://www.youtube.com/user/1veritasium'
lc.create_list_for(url=my_url)
Python文档(将最频繁地更新,所以请检查此页面的更新!)
库主页
PyPI页面
这是我的Python解决方案,使用谷歌API。
观察:
创建一个.env文件来存储API开发密钥,并将其放入.gitignore文件中
参数“forUserName”应该设置为Youtube频道的名称(用户名)。或者,您可以使用通道id,设置参数为“id”,而不是“forUserName”。
对象“playlistItem”让你访问每个视频。我只展示了它的标题,但还有很多其他属性。
import os
import googleapiclient.discovery
from decouple import config
def main():
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
api_service_name = "youtube"
api_version = "v3"
DEVELOPER_KEY = config('API_KEY')
youtube = googleapiclient.discovery.build(
api_service_name, api_version, developerKey = DEVELOPER_KEY)
request = youtube.channels().list(
part="contentDetails",
forUsername="username",
# id="oiwuereru8987",
)
response = request.execute()
for item in response['items']:
playlistId = item['contentDetails']['relatedPlaylists']['uploads']
nextPageToken = ''
while (nextPageToken != None):
playlistResponse = youtube.playlistItems().list(
part='snippet',
playlistId=playlistId,
maxResults=25,
pageToken=nextPageToken
)
playlistResponse = playlistResponse.execute()
print(playlistResponse.keys())
for idx, playlistItem in enumerate(playlistResponse['items']):
print(idx, playlistItem['snippet']['title'])
if 'nextPageToken' in playlistResponse.keys():
nextPageToken = playlistResponse['nextPageToken']
else:
nextPageToken = None
if __name__ == "__main__":
main()
示例:.env文件
API_KEY=<Key_Here>
由于每个回答这个问题的人都有500个视频限制的问题,这里有一个使用Python 3中的youtube_dl的替代解决方案。此外,不需要API密钥。
安装youtube_dl: sudo pip3 Install youtube_dl
找出目标频道的频道id。ID将以UC开头。将Channel的C替换为Upload的U(即UU…),这是上传播放列表。
使用youtube-dl的播放列表下载功能。理想情况下,你不希望下载播放列表中的每个视频,这是默认的,而只是元数据。
示例(警告—需要数十分钟):
import youtube_dl, pickle
# UCVTyTA7-g9nopHeHbeuvpRA is the channel id (1517+ videos)
PLAYLIST_ID = 'UUVTyTA7-g9nopHeHbeuvpRA' # Late Night with Seth Meyers
with youtube_dl.YoutubeDL({'ignoreerrors': True}) as ydl:
playd = ydl.extract_info(PLAYLIST_ID, download=False)
with open('playlist.pickle', 'wb') as f:
pickle.dump(playd, f, pickle.HIGHEST_PROTOCOL)
vids = [vid for vid in playd['entries'] if 'A Closer Look' in vid['title']]
print(sum('Trump' in vid['title'] for vid in vids), '/', len(vids))