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
'Python 활용' 카테고리의 다른 글
파이썬, Parallel HTTP requests (requests_futures 이용) (0) | 2022.01.30 |
---|---|
파이썬, 다중 HTTP 요청 (synchronous, multiprocessing, multithreading, asyncio) (0) | 2022.01.29 |
파이썬, Nvidia-smi 정보 출력하기 (0) | 2022.01.26 |
파이썬, CPU 이용률, 메모리 크기/이용률 출력 (0) | 2022.01.26 |
파이썬, JSON <--> 사전 자료 <--> 문자열 구조 변환 (0) | 2022.01.24 |