Почему API Youtube дает мне другие результаты для некоторых каналов, чем они есть на самом деле?

У меня есть сценарий, который получает информацию с Youtube, используя их API, и сохраняет ее в файл Excel.

Скрипт работает нормально для некоторых каналов, а для некоторых нет, например. когда я использовал его для каналов BBC и CNN, он получил всю необходимую информацию, но когда я попробовал его на канале MrBeast или Tech With Tim, он вернул мне только 3 видео для MrBeast и 2 для Tech With Tim, хотя оба на каналах больше видео.

В чем может быть проблема?

Вот полный код:

import pandas as pd
from googleapiclient.discovery import build

api_key = 'YOUR_API_KEY_HERE'  # Replace with your API key

youtube = build('youtube', 'v3', developerKey=api_key)

# Retrieve the channel ID for the given username
channel_request = youtube.channels().list(
    part='snippet,contentDetails',
    forUsername='BBCNews'
)
channel_response = channel_request.execute()

# Extract channel username and ID
channel_username = channel_response['items'][0]['snippet']['title']
channel_id = channel_response['items'][0]['id']

# Initialize variables for pagination
next_page_token = None
all_videos = []

# Retrieve all videos from the channel
while True:
    videos_request = youtube.search().list(
        part='snippet',
        channelId=channel_id,
        type='video',
        order='date',
        maxResults=50,  # Maximum results per page
        pageToken=next_page_token
    )
    videos_response = videos_request.execute()
    
    all_videos.extend(videos_response['items'])

    next_page_token = videos_response.get('nextPageToken')
    if not next_page_token:
        break  # Break the loop if there are no more pages

# Initialize lists to store extracted information
titles = []
published_dates = []
likes = []
views = []
descriptions = []
urls = []

# Extract information from each video
for video in all_videos:
    video_id = video['id']['videoId']
    video_title = video['snippet']['title']
    video_description = video['snippet']['description']
    video_published_at = video['snippet']['publishedAt']
    video_url = f'https://www.youtube.com/watch?v = {video_id}'

    # Retrieve statistics for each video
    video_statistics_request = youtube.videos().list(
        part='statistics',
        id=video_id
    )
    video_statistics_response = video_statistics_request.execute()
    video_statistics = video_statistics_response['items'][0]['statistics']
    video_likes = int(video_statistics.get('likeCount', 0))
    video_views = int(video_statistics.get('viewCount', 0))

    # Append extracted information to lists
    titles.append(video_title)
    published_dates.append(video_published_at)
    likes.append(video_likes)
    views.append(video_views)
    descriptions.append(video_description)
    urls.append(video_url)

# Create a DataFrame from the lists
data = {
    'Title': titles,
    'Published Date': published_dates,
    'Likes': likes,
    'Views': views,
    'Description': descriptions,
    'URL': urls
}
df = pd.DataFrame(data)

# Save DataFrame to Excel file with channel username as filename
excel_file_path = f'{channel_username}_videos.xlsx' 
df.to_excel(excel_file_path, index=False)

print("Excel file saved successfully.")

Кажется, вы путаете различные идентификаторы каналов YouTube, как показывает пользователь /MrBeast . Взгляните на мой ответ на Stack Overflow.

Benjamin Loison 20.05.2024 15:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
126
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

MrBeast использует собственный дескриптор (обозначенный символом @). API YouTube не принимает эти пользовательские дескрипторы напрямую в параметре forUsername.

Вам следует использовать метод Channels.list с параметром forUsername для обработки имен пользователей и метод search.list с q для таких дескрипторов, как @MrBeast.

def get_channel_id(identifier):
    if identifier.startswith('@'):
        handle = identifier[1:]
        search_request = youtube.search().list(
            part='snippet',
            q=handle,
            type='channel'
        )
        search_response = search_request.execute()
        return search_response['items'][0]['snippet']['channelId']
    else:
        channel_request = youtube.channels().list(
            part='snippet,contentDetails',
            forUsername=identifier
        )
        channel_response = channel_request.execute()
        return channel_response['items'][0]['id']


channel_identifier = '@MrBeast'

channel_id = get_channel_id(channel_identifier)

Можете ли вы поделиться ссылкой на предложение на Upwork, о котором вы говорите?

Benjamin Loison 20.05.2024 19:50

Если у вас есть правильный дескриптор канала YouTube, который вы хотите запросить, вы можете использовать запрос channels.list — вы сэкономите больше квоты, поскольку search.list использует более 100 квот, аchannels.list использует 1 квоту.

См. документацию - раздел Фильтры.

Другие вопросы по теме