Как извлечь большие объемы данных (более 1000 видео) из API данных YouTube v3? - PullRequest
0 голосов
/ 31 мая 2019

Моя цель - извлечь все видео из плейлиста, который может содержать много видео, ~ 3000 и может содержать более 5000 видео. При maxResults = 50 и после реализации разбиения на страницы с помощью nextPageToken я могу вызывать API только 20 раз, после чего nextPageToken не отправляется с ответом

Я вызываю API из приложения Python. У меня есть цикл while до тех пор, пока nextPageToken не будет отправлен, в идеале это должно произойти ПОСЛЕ того, как все видео извлечены, но он преждевременно завершает работу после вызова API 19-20 раз

def main():
    youtube = get_authorised_youtube()  # returns YouTube resource authorized with OAuth.

    first_response = make_single_request(youtube, None)  # make_single_request() takes in the youtube resource and nextPageToken, if any.
    nextPageToken = first_response["nextPageToken"]

    try:
        count = 0
        while True:
            response = make_single_request(youtube, nextPageToken)
            nextPageToken = response["nextPageToken"]


            count += 1
            print(count, end=" ")
            print(nextPageToken)
    except KeyError as e:  # KeyError to catch if nextPageToken wasn't present
        response.pop("items")
        print(response)  # prints the last response for analysis


if __name__ == '__main__':
    main()

фрагмент make_single_request():

def make_single_request(youtube, nextPageToken):
    if nextPageToken is None:
        request = youtube.videos().list(
            part="id",
            myRating="like",
            maxResults=50
        )
    else:
        request = youtube.videos().list(
            part="id",
            myRating="like",
            pageToken=nextPageToken,
            maxResults=50
        )
    response = request.execute()

    return response

Ожидается, что код будет содержать до 50 вызовов API, но, как ожидается, будет совершать только около 20 вызовов, соответственно.

Примечание. Следующий код был выполнен с неоплаченной учетной записью GCP. Выполненные вызовы имеют part = "id", стоимость квоты которого равна 0. Предел вызовов в соответствии с GCP составляет: 10000. По квоте на консоль я делаю только 20.

Выход:

1 CGQQAA
2 CJYBEAA
3 CMgBEAA
4 CPoBEAA
5 CKwCEAA
6 CN4CEAA
7 CJADEAA
8 CMIDEAA
9 CPQDEAA
10 CKYEEAA
11 CNgEEAA
12 CIoFEAA
13 CLwFEAA
14 CO4FEAA
15 CKAGEAA
16 CNIGEAA
17 CIQHEAA
18 CLYHEAA
19 {'kind': 'youtube#videoListResponse', 'etag': '"ETAG"', 'prevPageToken': 'CLYHEAE', 'pageInfo': {'totalResults': TOTAL_RESULTS(>4000), 'resultsPerPage': 50}}

РЕДАКТИРОВАТЬ: после изменения maxResults=20 наблюдается, что код выполняет около 50 вызовов API, поэтому общее количество видео, которое может быть извлечено, является постоянным на уровне 1000.

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Для получения всего списка понравившихся видео данного канала без каких-либо пропусков, я предлагаю вам использовать PlaylistItems конечная точка вместо этого, запрашиваемых для данного понравившихся видео канала воспроизведения канала путем передачи правильного значения в параметр playlistId конечной точки.

Полученные видео любимого видео ID списка воспроизведения после запроса собственной конечной точки канала .Необходимый идентификатор можно найти по адресу .items.contentDetails.relatedPlaylists.likes.

0 голосов
/ 31 мая 2019

Попробуйте подождать некоторое время таким образом:

import time
time.sleep(1) # time here in seconds
...