Suno snatched millions of songs from YouTube, Genius, and Deezer
Back to Tutorials
techTutorialintermediate

Suno snatched millions of songs from YouTube, Genius, and Deezer

July 15, 20261 views5 min read

Learn to build a music metadata scraper that can extract song information from YouTube, Deezer, and Genius platforms, demonstrating the technical methods used by AI systems like Suno for data collection.

Introduction

In this tutorial, we'll explore how to build a basic music metadata scraper using Python that can extract song information from platforms like YouTube, Deezer, and Genius. This tutorial demonstrates the technical methods used by AI systems like Suno to gather training data, helping you understand the underlying technology while emphasizing ethical data usage.

Prerequisites

  • Python 3.7+ installed on your system
  • Basic understanding of web scraping concepts
  • Knowledge of REST APIs and HTTP requests
  • Python libraries: requests, beautifulsoup4, pandas
  • Understanding of JSON data structures

Step-by-step instructions

Step 1: Set up your development environment

First, create a new Python project directory and install the required dependencies:

mkdir music_scraper
cd music_scraper
pip install requests beautifulsoup4 pandas

Why: Setting up a dedicated project directory helps organize your code. The required libraries provide the necessary tools for making HTTP requests, parsing HTML, and handling data structures.

Step 2: Create the main scraper class

Create a file called music_scraper.py and start with the basic class structure:

import requests
import json
from bs4 import BeautifulSoup
import pandas as pd

class MusicScraper:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        })

    def get_youtube_metadata(self, video_id):
        # Implementation will go here
        pass

    def get_deezer_metadata(self, track_id):
        # Implementation will go here
        pass

    def get_genius_metadata(self, song_id):
        # Implementation will go here
        pass

Why: This creates a structured approach to handling different music platforms, making it easier to extend functionality later.

Step 3: Implement YouTube metadata extraction

YouTube's metadata extraction requires using their API or scraping their HTML:

def get_youtube_metadata(self, video_id):
    try:
        # Using YouTube's oEmbed API for basic metadata
        url = f"https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v={video_id}"
        response = self.session.get(url)
        
        if response.status_code == 200:
            data = response.json()
            return {
                'platform': 'YouTube',
                'title': data.get('title'),
                'author': data.get('author_name'),
                'video_id': video_id,
                'url': data.get('url')
            }
        return None
    except Exception as e:
        print(f"Error fetching YouTube metadata: {e}")
        return None

Why: The oEmbed API provides a clean way to extract basic metadata without complex scraping, which is more reliable and respects rate limits.

Step 4: Add Deezer API integration

Deezer provides a public API that allows access to track information:

def get_deezer_metadata(self, track_id):
    try:
        url = f"https://api.deezer.com/track/{track_id}"
        response = self.session.get(url)
        
        if response.status_code == 200:
            data = response.json()
            return {
                'platform': 'Deezer',
                'title': data.get('title'),
                'artist': data.get('artist', {}).get('name'),
                'album': data.get('album', {}).get('title'),
                'duration': data.get('duration'),
                'track_id': track_id,
                'url': data.get('link')
            }
        return None
    except Exception as e:
        print(f"Error fetching Deezer metadata: {e}")
        return None

Why: Using the official API is the most ethical and reliable way to access data, as it's designed for developers and includes proper rate limiting.

Step 5: Implement Genius API integration

Genius provides an API that allows access to lyrics and song information:

def get_genius_metadata(self, song_id):
    try:
        # Genius API requires an access token
        headers = {
            'Authorization': 'Bearer YOUR_ACCESS_TOKEN_HERE'
        }
        url = f"https://api.genius.com/songs/{song_id}"
        response = self.session.get(url, headers=headers)
        
        if response.status_code == 200:
            data = response.json()
            song_data = data.get('response', {}).get('song', {})
            return {
                'platform': 'Genius',
                'title': song_data.get('title'),
                'artist': song_data.get('primary_artist', {}).get('name'),
                'lyrics': song_data.get('lyrics'),
                'url': song_data.get('url'),
                'song_id': song_id
            }
        return None
    except Exception as e:
        print(f"Error fetching Genius metadata: {e}")
        return None

Why: Genius's API provides structured access to lyrics and metadata, which is exactly what AI systems like Suno would need for training.

Step 6: Create a data processing pipeline

Now create a method to process and combine data from multiple sources:

def process_song_collection(self, song_data_list):
    """Process and clean collected song data"""
    df = pd.DataFrame(song_data_list)
    
    # Remove duplicates
    df = df.drop_duplicates(subset=['title', 'artist'])
    
    # Clean data
    df['artist'] = df['artist'].str.strip()
    df['title'] = df['title'].str.strip()
    
    return df

def save_to_file(self, data, filename):
    """Save collected data to JSON file"""
    with open(filename, 'w') as f:
        json.dump(data, f, indent=2)
    print(f"Data saved to {filename}")

Why: This creates a proper data pipeline that handles cleaning and storage, which is essential for any large-scale data collection project.

Step 7: Test your scraper with sample data

Create a test script to verify your scraper works:

if __name__ == "__main__":
    scraper = MusicScraper()
    
    # Sample data for testing
    test_data = [
        {'platform': 'YouTube', 'video_id': 'dQw4w9WgXcQ'},
        {'platform': 'Deezer', 'track_id': '123456'},
        {'platform': 'Genius', 'song_id': '789012'}
    ]
    
    collected_data = []
    
    for item in test_data:
        if item['platform'] == 'YouTube':
            result = scraper.get_youtube_metadata(item['video_id'])
        elif item['platform'] == 'Deezer':
            result = scraper.get_deezer_metadata(item['track_id'])
        elif item['platform'] == 'Genius':
            result = scraper.get_genius_metadata(item['song_id'])
        
        if result:
            collected_data.append(result)
    
    # Process and save data
    processed_data = scraper.process_song_collection(collected_data)
    scraper.save_to_file(collected_data, 'music_collection.json')
    
    print("Collected data:")
    print(processed_data.to_string())

Why: Testing ensures your scraper works correctly and helps identify any issues with API access or data parsing before scaling to larger datasets.

Step 8: Add rate limiting and error handling

Implement proper rate limiting to avoid being blocked by APIs:

import time

class MusicScraper:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        })
        self.rate_limit_delay = 1  # seconds between requests

    def make_request_with_delay(self, url, **kwargs):
        time.sleep(self.rate_limit_delay)  # Rate limiting
        return self.session.get(url, **kwargs)

Why: Rate limiting prevents your scraper from being blocked and demonstrates responsible data collection practices.

Summary

This tutorial demonstrated how to build a basic music metadata scraper that can collect data from YouTube, Deezer, and Genius platforms. While this shows the technical capabilities that AI systems like Suno might use, it's crucial to emphasize that ethical data collection practices should always be followed. When building such systems, always respect API terms of service, implement proper rate limiting, and consider the legal and ethical implications of data usage.

The techniques shown here provide insight into how large-scale data collection works, but remember that any commercial use of scraped data should comply with platform terms of service and applicable copyright laws.

Source: The Verge AI

Related Articles