从 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 响应