【问题标题】:Most popular youtube videos from Youtube API来自 Youtube API 的最受欢迎的 youtube 视频
【发布时间】:2018-08-01 12:20:58
【问题描述】:

我正在尝试使用 python 获取流行的 YouTube 视频数据。虽然我可以成功下载数据,但我无法将其存储或保存为 csv 格式。这是我使用的代码:

# -*- coding: utf-8 -*-

import os

import google.oauth2.credentials

import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow


CLIENT_SECRETS_FILE = "client_secret.json"


SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'

def get_authenticated_service():
  flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
  credentials = flow.run_console()
  return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)

def print_response(response):
  print(response)


def build_resource(properties):
  resource = {}
  for p in properties:
   
    prop_array = p.split('.')
    ref = resource
    for pa in range(0, len(prop_array)):
      is_array = False
      key = prop_array[pa]

      # For properties that have array values, convert a name like
      # "snippet.tags[]" to snippet.tags, and set a flag to handle
      # the value as an array.
      if key[-2:] == '[]':
        key = key[0:len(key)-2:]
        is_array = True

      if pa == (len(prop_array) - 1):
        # Leave properties without values out of inserted resource.
        if properties[p]:
          if is_array:
            ref[key] = properties[p].split(',')
          else:
            ref[key] = properties[p]
      elif key not in ref:
        # For example, the property is "snippet.title", but the resource does
        # not yet have a "snippet" object. Create the snippet object here.
        # Setting "ref = ref[key]" means that in the next time through the
        # "for pa in range ..." loop, we will be setting a property in the
        # resource's "snippet" object.
        ref[key] = {}
        ref = ref[key]
      else:
        # For example, the property is "snippet.description", and the resource
        # already has a "snippet" object.
        ref = ref[key]
  return resource

# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
  good_kwargs = {}
  if kwargs is not None:
    for key, value in kwargs.iteritems():
      if value:
        good_kwargs[key] = value
  return good_kwargs

def videos_list_most_popular(client, **kwargs):
  # See full sample for function
  kwargs = remove_empty_kwargs(**kwargs)

  response = client.videos().list(
    **kwargs
  ).execute()

  return print_response(response)


if __name__ == '__main__':
  # When running locally, disable OAuthlib's HTTPs verification. When
  # running in production *do not* leave this option enabled.
  os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
  client = get_authenticated_service()
  
  videos_list_most_popular(client,
    part='snippet,contentDetails,statistics',
    chart='mostPopular',
    regionCode='US',
    videoCategoryId='')

如何将结果保存为 csv 格式?我尝试了以下代码,但出现错误:

数据 = json.loads(str(response,'utf-8'))

NameError:名称“响应”未定义

【问题讨论】:

    标签: python csv youtube youtube-api youtube-data-api


    【解决方案1】:

    NameError 表示变量response 不在您运行它的上下文中。我不知道您将该行放在代码中的什么位置,但您调用了不会返回任何数据的videos_list_most_popular 函数。

    videos_list_most_popular 返回print_response 函数的结果。但由于该函数只打印响应,并没有实际返回任何内容,它将返回None,然后在执行videos_list_most_popular 的位置下方,结果将为无。

    而且它也会消失,因为您没有将该函数的结果分配给任何东西(看起来像:response = videos_list_most_popular(...))。

    您需要更改videos_list_most_popular,使其返回response,然后像我上面所做的那样分配该返回值。然后你就可以执行你写的那行了。

    【讨论】:

    • 谢谢。但现在我得到一个不同的错误:Data = json.loads(str(response,'utf-8')) TypeError: 解码到 str: 需要一个类似字节的对象,找到了 NoneType
    • 错误是说str(...) 函数需要一个类似字节的对象。但它得到一个None。显然变量responseNone,而不是您期望的视频列表。您能否更新您的问题以再次反映您当前的文件?我更容易看到发生了什么:-)
    • 如何分配结果?能具体点吗?
    • 就像我在回答中写的:response = videos_list_most_popular(...)
    • 谢谢。我将函数的结果分配给一个变量并且它起作用了。
    猜你喜欢
    • 2011-08-17
    • 2011-05-11
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多