import aiohttp import asyncio import requests import time from config import api_key, channel_id, base_url start_time = time.time() # Get the ID from the Uploads Playlist. url = f'{base_url}/channels?id={channel_id}&key={api_key}&part=contentDetails' r = requests.get(url) results = r.json()['items'] playlist_id = results[0]['contentDetails']['relatedPlaylists']['uploads'] # Get all of the video IDs. video_ids = [] url = f'{base_url}/playlistItems?playlistId={playlist_id}&key={api_key}&part=contentDetails' while True: r = requests.get(url) results = r.json() if 'nextPageToken' in results: nextPageToken = results['nextPageToken'] else: nextPageToken = None if 'items' in results: for item in results['items']: if 'contentDetails' in item: if 'videoId' in item['contentDetails']: videoId = item['contentDetails']['videoId'] video_ids.append(videoId) if nextPageToken: url = f'{base_url}/playlistItems?playlistId={playlist_id}&key={api_key}&part=contentDetails&pageToken={nextPageToken}' else: break async def main(): async with aiohttp.ClientSession() as session: tasks = [] for video_id in video_ids: task = asyncio.ensure_future(get_video_data(session, video_id)) tasks.append(task) view_counts = await asyncio.gather(*tasks) print('Number of videos:', 2*'\t', len(view_counts)) print('Average number of views:', '\t', sum(view_counts) / len(view_counts)) async def get_video_data(session, video_id): url = f'{base_url}/videos?id={video_id}&key={api_key}&part=statistics' async with session.get(url) as response: result_data = await response.json() results = result_data['items'] viewCount = results[0]['statistics']['viewCount'] return int(viewCount) asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) asyncio.run(main()) print("--- %s seconds ---" % (time.time() - start_time))