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
确实有它的位置和用例,但我敢说这似乎不是其中之一。
我正在使用 '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
确实有它的位置和用例,但我敢说这似乎不是其中之一。