Select 来自 YouTube API 响应的特定键

Select specific keys from YouTube API response

我正在使用 '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']
['snippet'] > ['title']
['snippet'] > ['channelTitle']

谢谢。

您可以使用 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

如果您可以使用 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))

我不确定您在获得提取的信息后想用它做什么,但这种方法可以让您从项目中获得您关心的值。

我只想补充一点,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 确实有它的位置和用例,但我敢说这似乎不是其中之一。