Skip to content

Instantly share code, notes, and snippets.

@alexisperrier
Last active June 23, 2024 09:04
Show Gist options
  • Select an option

  • Save alexisperrier/609a77b0cb8895437595d9dc2f754e29 to your computer and use it in GitHub Desktop.

Select an option

Save alexisperrier/609a77b0cb8895437595d9dc2f754e29 to your computer and use it in GitHub Desktop.
Telecharge les videos TikTok a partir de leur URLs avec yt-dlp
'''
Code généré en juin 2024
Telecharge les videos TikTok a partir de leur URLs avec yt-dlp
Ce script télécharge efficacement plusieurs vidéos TikTok en parallèle tout en gérant les ressources et en implémentant une limitation de débit pour éviter de surcharger le serveur.
'''
import json
import pandas as pd
import asyncio
import yt_dlp
import aiohttp
class AsyncTikTokDL(yt_dlp.YoutubeDL):
async def __aenter__(self):
return self
async def __aexit__(self, exc_type, exc, tb):
await asyncio.sleep(0) # Dummy await
async def extract_info_async(self, url):
loop = asyncio.get_event_loop()
return await loop.run_in_executor(None, self.extract_info, url)
async def download_async(self, url):
loop = asyncio.get_event_loop()
return await loop.run_in_executor(None, self.download, [url])
async def download_tiktok(url, output_path, semaphore):
ydl_opts = {
'format': 'best',
'outtmpl': f'{output_path}/%(id)s.%(ext)s',
'cookiesfrombrowser': ('chrome',),
}
async with semaphore:
ydl = AsyncTikTokDL(ydl_opts)
try:
info = await ydl.extract_info_async(url)
if info:
print(f"Downloading: {info.get('title', 'Unknown Title')}")
await ydl.download_async(url)
print(f"Successfully downloaded: {url}")
else:
print(f"Failed to extract info for: {url}")
except Exception as e:
print(f"Error downloading {url}: {str(e)}")
# Wait for 5 seconds between downloads
await asyncio.sleep(5)
async def download_multiple_tiktoks(urls, output_path, max_concurrent=3):
semaphore = asyncio.Semaphore(max_concurrent)
tasks = [download_tiktok(url, output_path, semaphore) for url in urls]
await asyncio.gather(*tasks)
async def main(username, urls):
# definir le repertoire des vidéos
output_path = f'./videos/{username}/'
async with aiohttp.ClientSession() as session:
await download_multiple_tiktoks(urls, output_path)
if __name__ == "__main__":
username = 'cnews'
urls = ['https://www.tiktok.com/@cnews/video/7382980155112688928',
'https://www.tiktok.com/@cnews/video/7382981320491732256',
]
asyncio.run(main(username, urls))
@alexisperrier
Copy link
Author

Classe AsyncTikTokDL :

  • Étend yt_dlp.YoutubeDL pour la rendre asynchrone.
  • Implémente les méthodes de gestionnaire de contexte asynchrone (aenter, aexit).
  • Fournit des wrappers asynchrones pour les méthodes extract_info et download.

Fonction download_tiktok :

  • Fonction asynchrone pour télécharger une seule vidéo TikTok.
  • Utilise un sémaphore pour limiter les téléchargements simultanés.
  • Extrait les informations de la vidéo et la télécharge en utilisant AsyncTikTokDL.
  • Implémente la gestion des erreurs et un délai de 5 secondes entre les téléchargements.

Fonction download_multiple_tiktoks :

  • Orchestre le téléchargement de plusieurs vidéos TikTok en parallèle.
  • Crée un sémaphore pour limiter le nombre de téléchargements simultanés.
  • Utilise asyncio.gather pour exécuter plusieurs tâches de téléchargement en parallèle.

Fonction main :

  • Point d'entrée du script.
  • Définit la liste des URLs des vidéos TikTok à télécharger.
  • Appelle download_multiple_tiktoks pour démarrer le processus de téléchargement.

Exécution du script :

  • Utilise asyncio.run(main()) pour démarrer la boucle d'événements asynchrone.

Ce script télécharge efficacement plusieurs vidéos TikTok en parallèle tout en gérant les ressources et en implémentant une limitation de débit pour éviter de surcharger le serveur.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment