API Requests 속도 향상 (Async Python)

 

https://www.youtube.com/watch?v=ln99aRAcRt0 

 

[  script.py ]

import aiohttp
import asyncio
import requests
import time

 

from key import key  # 사용자 모듈 

start_time = time.time()
channel_id = 'UC-QDfvrRIDB6F0bIO4I4HkQ'
url = f'https://www.googleapis.com/youtube/v3/channels?id={channel_id}&key={key}&part=contentDetails'
r = requests.get(url)
results = r.json()['items']
playlist_id = results[0]['contentDetails']['relatedPlaylists']['uploads']
url = f'https://www.googleapis.com/youtube/v3/playlistItems?playlistId={playlist_id}&key={key}&part=contentDetails&maxResults=50'

video_ids = []
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']:
            videoId = item['contentDetails']['videoId']
            video_ids.append(videoId)

    if nextPageToken:
        url = f'https://www.googleapis.com/youtube/v3/playlistItems?playlistId={playlist_id}&pageToken={nextPageToken}&key={key}&part=contentDetails&maxResults=50'
    else:
        break

'''
view_counts = []
for video_id in video_ids:
    url = f'https://www.googleapis.com/youtube/v3/videos?id={video_id}&key={key}&part=statistics'
    r = requests.get(url)
    results = r.json()['items']
    viewCount = results[0]['statistics']['viewCount']
    view_counts.append(int(viewCount))
print('Number of videos:', len(view_counts))
print('Average number of views:', sum(view_counts) / len(view_counts))
'''

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:', len(view_counts))
    print('Average number of views:', sum(view_counts) / len(view_counts))

async def get_video_data(session, video_id):
    url = f'https://www.googleapis.com/youtube/v3/videos?id={video_id}&key={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.run(main())
print("--- %s seconds ---" % (time.time() - start_time))

 

[ key.py ]

key = 'YOUTUBE API KEY'

 

[ requirements.txt ]

aiohttp==3.7.3
async-timeout==3.0.1
attrs==20.3.0
certifi==2020.12.5
chardet==3.0.4
idna==2.10
multidict==5.1.0
pkg-resources==0.0.0
requests==2.25.1
typing-extensions==3.7.4.3
urllib3==1.26.2
yarl==1.6.3

 

반응형

+ Recent posts