我正在使用Youtube Data API v3提取youtube频道中所有视频的标题。
我关注了https://developers.google.com/youtube/v3/code_samples/python的摘要
查询['statistics']['videoCount']
时得到一个数字
但是当我在youtube中搜索实际频道时,它会为视频计数提供一个不同的数字。
假设我正在尝试ID为- UCeLHszkByNZtPKcaVXOCOQQ 的频道
['statistics']['videoCount']
给出 19
但是,如果我在YouTube上搜索频道发布马龙,该频道中就有 36 个视频。我要去哪里错了?
['statistics']['videoCount']
是否确实提供了YouTube频道中确切数量的视频?
这是我的代码:
from pprint import pprint
from googleapiclient.discovery import build
import os
YOUTUBE_API_KEY = os.environ.get('YOUTUBE_API_KEY')
youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
lis = ['UCeLHszkByNZtPKcaVXOCOQQ']
for i in lis:
channels_response = youtube.channels().list(part='statistics', id=i).execute()
print(i, channels_response['items'][0]['statistics']['videoCount'])
for i in lis:
channels_response = youtube.channels().list(part='contentDetails', id=i).execute()
for channel in channels_response['items']:
uploads_list_id = channel["contentDetails"]["relatedPlaylists"]["uploads"]
playlistitems_list_request = youtube.playlistItems().list(
playlistId=uploads_list_id,
part="snippet",
maxResults=50
)
while playlistitems_list_request:
playlistitems_list_response = playlistitems_list_request.execute()
for playlist_item in playlistitems_list_response["items"]:
# pprint(playlist_item)
title = playlist_item["snippet"]["title"]
video_id = playlist_item["snippet"]["resourceId"]["videoId"]
print(title, video_id)
playlistitems_list_request = youtube.playlistItems().list_next(
playlistitems_list_request, playlistitems_list_response
)
答案 0 :(得分:1)
首先,您要打印给定YouTube频道(使用其channel_id
)中的视频数量。
拥有channel_id
后,请使用此请求检索以下数据:
videoCount
)。playlistid
。这是请求:
https://www.googleapis.com/youtube/v3/channels?part=snippet%2CcontentDetails%2Cstatistics&id=UCeLHszkByNZtPKcaVXOCOQQ&fields=items(contentDetails%2Cid%2Csnippet(country%2Cdescription%2Ctitle)%2Cstatistics%2Cstatus)%2CnextPageToken%2CpageInfo%2CprevPageToken%2CtokenPagination&key={YOUR_API_KEY}
这些是YouTube频道的结果:Post Malone
您可以在Google API Explorer demo中测试这些结果:
{
"pageInfo": {
"totalResults": 1,
"resultsPerPage": 1
},
"items": [
{
"id": "UCeLHszkByNZtPKcaVXOCOQQ",
"snippet": {
"title": "Post Malone",
"description": "The official Post Malone YouTube Channel.\nwww.postmalone.com"
},
"contentDetails": {
"relatedPlaylists": {
"uploads": "UUeLHszkByNZtPKcaVXOCOQQ",
"watchHistory": "HL",
"watchLater": "WL"
}
},
"statistics": {
"viewCount": "967939106",
"commentCount": "0",
"subscriberCount": "11072809",
"hiddenSubscriberCount": false,
"videoCount": "19"
}
}
]
}
检查以下两个值:uploads
和videoCount
。
如果您输入Post Malone's uploaded videos,您会发现他确实有19个上传的视频(与videoCount
值中显示的数量相同)。< / p>
在您的问题中您说:
但是,如果我在youtube上搜索“发布马龙”频道,则该频道有36个 里面的视频。我要去哪里错了?
我不认为您做错了什么,只是您没有完整的图表。您会看到,如果您检查了其中的playlists
,就会发现35个视频与这些播放列表相对应:
他的全部35个视频都显示在他的频道的"videos" tab中。
总而言之,这19个视频对应于他上传的19个视频(归类于他的“上传”播放列表)。如果要检索他的所有视频,则可以选择检索YouTube频道中的所有播放列表。
在这种情况下,这些视频实际上不在频道中,而是在单独的自动生成的YouTube频道中,因此造成了混乱。
答案 1 :(得分:0)
此代码段可让您从youtube播放列表中提取所有视频标题:
import re
import requests
url = "https://www.your_playlist_url.com"
r = requests.get(url)
code = r.text
titles = re.findall("simpleText":"[^"]*"},"index", code)
for i in titles: print(i[13: -9])`
它只提取HTML并过滤掉视频标题,这些视频标题存储在复杂的javascript对象中。