从 YouTube API 响应中选择特定键

Posted

技术标签:

【中文标题】从 YouTube API 响应中选择特定键【英文标题】:Select specific keys from YouTube API response 【发布时间】:2021-12-15 18:51:20 【问题描述】:

我正在使用“googleapiclient”python 从 YouTube API V3 获取数据。 响应很大,我想要的只是解析一些键,然后将它们附加到 csv 文件。 为了快速工作而不是遍历每个项目,每个页面有 50 个项目,并且多个页面估计数量约为 50,因此如果我循环提取键,我必须进行 250 次迭代可能更多。 所以,我决定使用 pandas 来加快这个过程,但我还不知道如何。 你能告诉我如何加快解析过程,最好使用熊猫吗? 以下是响应中的一项:


  "kind": "youtube#searchListResponse",
  "etag": "9C4YPSA6KJ2_ZQe6k0khyWyZw4U",
  "nextPageToken": "CDIQAA",
  "regionCode": "DE",
  "pageInfo":  "totalResults": 569, "resultsPerPage": 50 ,
  "items": [
    
      "kind": "youtube#searchResult",
      "etag": "-tjutsrDQfkNJkMufUBxwHakEkE",
      "id":  "kind": "youtube#video", "videoId": "wnnKjI1m2Ug" ,
      "snippet": 
        "publishedAt": "2019-11-14T10:00:11Z",
        "channelId": "UCVdfgrCLfJQfO5EgPlzaYAQ",
        "title": "Was ist XML? Einfach und schnell erkl\u00e4rt!",
        "description": "Werbung: Jetzt Premium Mitgliedschaft sichern ...",
        "thumbnails": 
          "default": 
            "url": "https://i.ytimg.com/vi/wnnKjI1m2Ug/default.jpg",
            "width": 120,
            "height": 90
          ,
          "medium": 
            "url": "https://i.ytimg.com/vi/wnnKjI1m2Ug/mqdefault.jpg",
            "width": 320,
            "height": 180
          ,
          "high": 
            "url": "https://i.ytimg.com/vi/wnnKjI1m2Ug/hqdefault.jpg",
            "width": 480,
            "height": 360
          
        ,
        "channelTitle": "Programmieren Starten",
        "liveBroadcastContent": "none",
        "publishTime": "2019-11-14T10:00:11Z"
      
    

我想从每个项目中提取: ['id'] > ['videoId'] ['sn-p'] > ['title'] ['sn-p'] > ['channelTitle']

谢谢。

【问题讨论】:

【参考方案1】:

如果您可以使用 pandas 来帮助加快速度,我会感到惊讶。 Pandas 是一个用于操作和处理数据帧的库。也许您可以使用 pandas 来构建这些数据的数据框,或者将其保存为 CSV,但我认为这对基本处理没有帮助。

要处理这些数据,我认为您只需将所需的功能(即收集您正在寻找的这三个数据点)应用于您拥有的数据。您的响应以 json 形式返回,因此将其解析为 json,获取项目列表,然后为项目列表中的每个项目提取您想要的数据。

import json

item_list = json.loads(YOUR_RESPONSE)["items"]

def extract(item):
    return [item["id"]["videoId"], item["snippet"]["title"], item["snippet"]["channelTitle"]]

for item in item_list:
    print(extract(item))

我不确定一旦获得了提取的信息,你想做什么,但这种方法可以让你从项目中获得你关心的值。

【讨论】:

【参考方案2】:

我只是想补充一点,pandas 对于这种类型的工作负载是出了名的慢。由于这是一个非常简单的问题,如果可以的话,我建议不要使用pandas。请参阅下面的快速性能比较我能够放在一起。

from timeit import timeit
import pandas as pd

data = 
  "kind": "youtube#searchListResponse",
  "etag": "9C4YPSA6KJ2_ZQe6k0khyWyZw4U",
  "nextPageToken": "CDIQAA",
  "regionCode": "DE",
  "pageInfo":  "totalResults": 569, "resultsPerPage": 50 ,
  "items": [
    
      "kind": "youtube#searchResult",
      "etag": "-tjutsrDQfkNJkMufUBxwHakEkE",
      "id":  "kind": "youtube#video", "videoId": "wnnKjI1m2Ug" ,
      "snippet": 
        "publishedAt": "2019-11-14T10:00:11Z",
        "channelId": "UCVdfgrCLfJQfO5EgPlzaYAQ",
        "title": "Was ist XML? Einfach und schnell erkl\u00e4rt!",
        "description": "Werbung: Jetzt Premium Mitgliedschaft sichern ...",
        "thumbnails": 
          "default": 
            "url": "https://i.ytimg.com/vi/wnnKjI1m2Ug/default.jpg",
            "width": 120,
            "height": 90
          ,
          "medium": 
            "url": "https://i.ytimg.com/vi/wnnKjI1m2Ug/mqdefault.jpg",
            "width": 320,
            "height": 180
          ,
          "high": 
            "url": "https://i.ytimg.com/vi/wnnKjI1m2Ug/hqdefault.jpg",
            "width": 480,
            "height": 360
          
        ,
        "channelTitle": "Programmieren Starten",
        "liveBroadcastContent": "none",
        "publishTime": "2019-11-14T10:00:11Z"
      
    
  ]



def extract(item):
    snippet = item['snippet']
    return [item["id"]["videoId"], snippet["title"], snippet["channelTitle"]]


print('Pandas:           ', timeit("_ = pd.json_normalize(data['items'])[['id.videoId', 'snippet.title', 'snippet.channelTitle']]",
             number=1000, globals=globals()))

print('Dict key lookup:  ', timeit("""
for item in data["items"]:
    _ = extract(item)
""", number=1000, globals=globals()))

结果:

Pandas:            0.7727613999741152
Dict key lookup:   0.00024690001737326384

我认为这些结果不言自明。也就是说,pandas 确实有它的位置和用例,但我敢说这似乎不是其中之一。

【讨论】:

非常有帮助,谢谢。【参考方案3】:

您可以使用 pandas json_normalize 来展平嵌套数据。结合过滤所需的列(假设输入是一个名为data的字典):

import pandas as pd

df = pd.json_normalize(data['items'])[['id.videoId', 'snippet.title', 'snippet.channelTitle']]

结果:

id.videoId snippet.title snippet.channelTitle
0 wnnKjI1m2Ug Was ist XML? Einfach und schnell erklärt! Programmieren Starten

【讨论】:

正是我想要的,但正如@rv.kvetch 回答的那样,与正常解析相比,pandas 太慢了。我将其标记为答案,因为我一直在寻找这种技术。

以上是关于从 YouTube API 响应中选择特定键的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Google Apps 脚本中的 YouTube 数据 API 从云端硬盘上传:空响应

无法通过 Google Apps 脚本中的 YouTube 数据 API 从云端硬盘上传:空响应

如何从 googleapi Youtube API 获取 XML 响应

如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url

Youtube api v3 无法从频道中检索所有视频

我如何在本机反应中从 json 中选择特定值?