Подавляющее количество запросов API с использованием API Python YouTube - PullRequest
0 голосов
/ 03 февраля 2019

Я сделал быстрый грязный скрипт на Python, чтобы идентифицировать некоторые видео, которые я нашел, и посмотреть, приходят ли они с YouTube, а затем добавить дату, когда они были опубликованы.Таким образом, он сканирует папку на наличие файлов, а затем для каждого файла ищет подходящее видео на YouTube.

Дело в том, что я попытался с папкой, содержащей 12 файлов, выполнил скрипт один раз и получил 1224 запроса, когда ондолжно было быть 12. Я тщательно проверяю свой сценарий, который следует этому руководству от Google , но я не могу понять, почему я выполнил квоту в 10000 запросов после выполнения сценария несколько раз.Мой сценарий выполняется менее чем за 10 секунд, и мой компьютер не может отправить более тысячи запросов так быстро.

Я думал, что это изначально из-за ошибки во время тестирования разработки, которая объясняет большое количество запросов наэтот снимок экрана похож на бесконечный цикл, но после того, как я понял, что он безопасен, я несколько дней ждал, чтобы запустить его снова сегодня, и увидел необычно огромное количество запросов: enter image description here

Мой код очень прост и доступен для просмотра на Github , однако вот файл main.py для быстрого просмотра и исторических целей, может кто-нибудь увидеть, если я что-то упустил:

youtube = None
try:
    youtube = build(
        serviceName=constants.API_SERVICE_NAME,
        version=constants.API_VERSION,
        developerKey=constants.YOUTUBE_API_KEY
    )
except exceptions.DefaultCredentialsError:
    cprint(console.COLORS.BRIGHT_RED, "['API']['YOUTUBE_API_KEY'] needs to be set in config.ini \n "
                                      "https://docs.python.org/3.7/library/configparser.html#quick-start")
    exit(-1)
except errors.HttpError:
    cprint(console.COLORS.BRIGHT_RED,
           "['API']['YOUTUBE_API_KEY'] in config.ini returned a Bad Request. This means it's invalid or you "
           "have internet problems.")
    exit(-2)

for filepath in glob(join(constants.SCRAPING_FOLDER, "*.*")):
    filename = splitext(basename(filepath))[0]
    extension = splitext(basename(filepath))[1]

    print("Pocessing", '"' + filename + '"', "...")
    regexMatches = re.search(constants.REGEXES.VIDEO_ID, filename)
    if regexMatches[2]:
        video_title = regexMatches[1]
        video_id = regexMatches[2]
    else:
        video_title = filename
        video_id = ""

    cprint(console.COLORS.BRIGHT_BLUE, "Video title:", '"' + video_title + '"', "...")
    cprint(console.COLORS.BRIGHT_BLUE, "Video id:", '"' + video_id + '"', "...")

    hashed_video_title = re.sub(constants.REGEXES.ALPHANUM_FILTER, "", video_title).lower()

    try:
        search_response = youtube.search().list(
            q=(video_id if video_id else filename),
            type='video',
            part='id,snippet',
            maxResults=constants.MAX_RESULTS
        ).execute()
    except errors.HttpError as err:
        # cprint(console.COLORS.BRIGHT_RED, err.content.message)
        bob = json.decoder.JSONDecoder()
        cprint(console.COLORS.BRIGHT_RED, err)
        exit(-3)

    highest_score = 0
    highest_score_search_result_title = ""
    highest_score_search_result_date = ""
    highest_score_search_id = ""
    for search_result in search_response.get('items', []):
        # pprint(search_result)
        search_result_title = search_result['snippet']['title']
        search_result_id = search_result['id']['videoId']
        search_result_date = search_result['snippet']['publishedAt']
        cprint(console.COLORS.BRIGHT_YELLOW, "Scraped Video Title:", search_result_title)

        pprint(search_result_id)

        if search_result_id == video_id:
            print("Found video id match!")
            highest_score = 1.0
            highest_score_search_result_date = search_result_date
            break

        hashed_search_result_title = re.sub(constants.REGEXES.ALPHANUM_FILTER, "", search_result_title).lower()

        score = SequenceMatcher(None, hashed_video_title, hashed_search_result_title).ratio()

        if score > highest_score:
            highest_score = score
            highest_score_search_result_title = search_result_title
            highest_score_search_result_date = search_result_date
            highest_score_search_id = search_result['id']['videoId']

    if highest_score > 0:
        cprint(console.COLORS.BRIGHT_GREEN, "Closest scraped video title:", highest_score_search_result_title)
        print("Score:", highest_score)
        print("Video id:", highest_score_search_id)

        if highest_score < constants.AUTO_IGNORING_MAX_SCORE:
            cprint(console.COLORS.BRIGHT_CYAN, "Skipping video, cannot find good match")
        elif highest_score >= constants.AUTO_RENAMING_MIN_SCORE or query_yes_no("Is this the correct video?"):
            course_date = dparser.parse(highest_score_search_result_date).strftime("%Y-%m-%d %H-%M-%S ")
            new_folder_name = os.path.join(constants.SCRAPING_FOLDER, course_date + filename + extension)
            print(new_folder_name)
            old_folder_name = os.path.join(constants.SCRAPING_FOLDER, filename + extension)
            os.rename(old_folder_name, new_folder_name)
    else:
        cprint(console.COLORS.BRIGHT_RED, "No video results could be scraped")

    print("---------------------------------------")
    sleep(constants.API_DELAY_BETWEEN_REQUESTS)
...