如何使用Youtube Data API v3获取youtube频道中的所有视频标题?

时间:2019-03-05 20:06:07

标签: python-3.x youtube youtube-api google-api-python-client youtube-data-api

我正在使用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
            )

2 个答案:

答案 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"
   }
  }
 ]
}

检查以下两个值:uploadsvideoCount

如果您输入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对象中。