Вопрос или проблема
Я пытаюсь извлечь некоторые данные из всех видео на канале YouTube (2055 видео). Я сохранил каждый ID видео в массиве video_ids[] и отправляю запрос на получение данных о всех 2055 видео в следующем коде:
all_video_data = []
request = youtube.videos().list(
part="snippet,contentDetails,statistics",
id=video_ids
)
response = request.execute()
for video in response['items']:
data_keep = {'snippet': ['channelTitle', 'title', 'publishedAt'],
'statistics': ['viewCount', 'likeCount', 'commentCount'],
'contentDetails': ['duration']
}
video_data = {}
video_data['video_id'] = video['id']
for k in data_keep.keys():
for v in data_keep[k]:
video_data[v] = video[k][v]
all_video_data.append(video_data)
ОШИБКА:
HttpError Traceback (most recent call last)
Cell In[36], line 7
1 all_video_data = []
3 request = youtube.videos().list(
4 part="snippet,contentDetails,statistics",
5 id=video_ids[0:999]
6 )
----> 7 response = request.execute()
9 for video in response['items']:
10 data_keep = {'snippet': ['channelTitle', 'title', 'publishedAt'],
11 'statistics': ['viewCount', 'likeCount', 'commentCount'],
12 'contentDetails': ['duration']
13 }
File ~\AppData\Local\Programs\Python\Python312\Lib\site-packages\googleapiclient\_helpers.py:130, in positional.<locals>.positional_decorator.<locals>.positional_wrapper(*args, **kwargs)
128 elif positional_parameters_enforcement == POSITIONAL_WARNING:
129 logger.warning(message)
--> 130 return wrapped(*args, **kwargs)
File ~\AppData\Local\Programs\Python\Python312\Lib\site-packages\googleapiclient\http.py:938, in HttpRequest.execute(self, http, num_retries)
936 callback(resp)
937 if resp.status >= 300:
--> 938 raise HttpError(resp, content, uri=self.uri)
939 return self.postproc(resp, content)
HttpError: <HttpError 400 when requesting https://youtube.googleapis.com/youtube/v3/videos returned "The request specifies an invalid filter parameter.". Details: "[{'message': 'The request specifies an invalid filter parameter.', 'domain': 'youtube.parameter', 'reason': 'invalidFilters', 'location': 'parameters.', 'locationType': 'other'}]">
Я понимаю, что ошибка в моем запросе, но не знаю, как это исправить.
Пробовал менять переменные/имена, пытался делать отдельный запрос для каждого видео (ужасно), пытался удариться головой о стену.
Ответ или решение
Ваш вопрос о получении данных о видеороликах на YouTube с использованием API и ошибкой "недопустимый параметр фильтра" очень актуален. Давайте разберёмся, как можно решить эту проблему.
Причина ошибки
Ошибка, с которой вы столкнулись, скорее всего, связана с ограничением API по количеству идентификаторов видео, которые можно передавать в одном запросе. YouTube API позволяет отправлять не более 50 идентификаторов видео за один запрос к методу videos().list()
. Если вы пытаетесь передать в запросе больше 50 идентификаторов, API возвращает ошибку.
Как исправить
Чтобы избежать этой ошибки, вам нужно разбивать массив video_ids
на более мелкие куски (по 50 идентификаторов) и отправлять отдельный запрос для каждой группы. Вот как можно это реализовать:
all_video_data = [] # Список для хранения всех данных о видео
# Функция для разбивки списка на подсписки фиксированной длины
def chunk_list(lst, chunk_size):
for i in range(0, len(lst), chunk_size):
yield lst[i:i + chunk_size]
# Разбиваем массив video_ids на куски по 50
for video_id_chunk in chunk_list(video_ids, 50):
request = youtube.videos().list(
part="snippet,contentDetails,statistics",
id=','.join(video_id_chunk) # Объединяем идентификаторы в строку
)
response = request.execute() # Выполняем запрос
for video in response['items']:
data_keep = {
'snippet': ['channelTitle', 'title', 'publishedAt'],
'statistics': ['viewCount', 'likeCount', 'commentCount'],
'contentDetails': ['duration']
}
video_data = {'video_id': video['id']}
for k in data_keep.keys():
for v in data_keep[k]:
video_data[v] = video[k][v]
all_video_data.append(video_data) # Добавляем данные видео в общий список
# Теперь all_video_data содержит данные для всех видео
Пояснение к коду
-
Функция
chunk_list
: Эта функция разбивает исходный список идентификаторов видео на части заданного размера (в данном случае 50). -
Цикл по частям
video_ids
: Мы проходимся по всем частям и для каждой части формируем запрос к API. -
Объединение идентификаторов: Мы используем метод
.join()
для преобразования списка идентификаторов в строку, разделённую запятыми, требуемую для API. -
Обработка ответа: После выполнения запроса мы обрабатываем ответ, извлекая необходимые данные о каждом видео и добавляя их в общий список.
Заключение
Следуя данным рекомендациям, вы сможете избежать ошибки "недопустимый параметр фильтра" и корректно извлечь данные о видео с канала YouTube, обрабатывая их в рамках ограничений API. Если у вас возникнут дополнительные вопросы или сложности, не стесняйтесь задавать их!