Skip to main content

SpotifyScraper

PyPI version Python Support Documentation Status codecov License: MIT

A modern Python library for extracting data from Spotify without using the official API. Extract tracks, albums, artists, and playlists with ease!

🎵 Features

  • No API Key Required: Access Spotify data without authentication
  • Multiple Data Types: Extract tracks, albums, artists, and playlists
  • Media Downloads: Download cover images and 30-second preview MP3s
  • Flexible Browsers: Use lightweight requests or full Selenium automation
  • CLI Interface: Command-line tool for quick data extraction
  • Type Safety: Full type hints and TypedDict support
  • Error Handling: Comprehensive exception hierarchy
  • Bulk Operations: Process multiple URLs efficiently
  • Data Analysis: Built-in playlist analysis and comparison tools

📦 Installation

Basic Installation

pip install spotifyscraper

With Selenium Support

pip install "spotifyscraper[selenium]"

Development Installation

pip install "spotifyscraper[dev]"

Full Installation (All Features)

pip install "spotifyscraper[all]"

🚀 Quick Start

Python Library Usage

from spotify_scraper import SpotifyClient

# Initialize client
client = SpotifyClient()

# Get track information
track_url = "https://open.spotify.com/track/4iV5W9uYEdYUVa79Axb7Rh"
track_info = client.get_track_info(track_url)
print(f"Track: {track_info['name']} by {track_info['artists'][0]['name']}")

# Get album with tracks
album_url = "https://open.spotify.com/album/0JGOiO34nwfUdDrD612dOp"
album_info = client.get_album_info(album_url)
print(f"Album: {album_info['name']} ({album_info['total_tracks']} tracks)")

# Download cover art
cover_path = client.download_cover(track_url, path="covers/")
print(f"Cover saved to: {cover_path}")

# Don't forget to close the client
client.close()

CLI Usage

# Get track info
spotify-scraper track https://open.spotify.com/track/4iV5W9uYEdYUVa79Axb7Rh

# Get album info with pretty output
spotify-scraper album https://open.spotify.com/album/0JGOiO34nwfUdDrD612dOp --pretty

# Download track preview
spotify-scraper download track https://open.spotify.com/track/4iV5W9uYEdYUVa79Axb7Rh --with-cover

# Get playlist info in JSON format
spotify-scraper playlist https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M --output playlist.json

📖 Detailed Usage

Client Configuration

from spotify_scraper import SpotifyClient

# Initialize with custom settings
client = SpotifyClient(
    browser_type="selenium",     # Use Selenium for JavaScript content
    log_level="DEBUG",          # Set logging level
    proxy={
        "http": "http://proxy.example.com:8080",
        "https": "https://proxy.example.com:8080"
    }
)

Authentication (Optional)

Some features like lyrics require authentication via cookies:

# Using cookie file (exported from browser)
client = SpotifyClient(cookie_file="spotify_cookies.txt")

# Using cookie dictionary
client = SpotifyClient(cookies={"sp_t": "your_token_here"})

Error Handling

from spotify_scraper import SpotifyClient, URLError, NetworkError, ExtractionError

client = SpotifyClient()

try:
    track_info = client.get_track_info("https://open.spotify.com/track/invalid")
except URLError as e:
    print(f"Invalid URL: {e}")
except NetworkError as e:
    print(f"Network error: {e}")
except ExtractionError as e:
    print(f"Extraction failed: {e}")
finally:
    client.close()

Bulk Operations

from spotify_scraper.utils.common import SpotifyBulkOperations

# Process multiple URLs
urls = [
    "https://open.spotify.com/track/4iV5W9uYEdYUVa79Axb7Rh",
    "https://open.spotify.com/album/0JGOiO34nwfUdDrD612dOp",
    "https://open.spotify.com/artist/00FQb4jTyendYWaN8pK0wa"
]

bulk = SpotifyBulkOperations()
results = bulk.process_urls(urls, operation="all_info")

# Export results
bulk.export_to_json(results, "spotify_data.json")
bulk.export_to_csv(results, "spotify_data.csv")

Data Analysis

from spotify_scraper.utils.common import SpotifyDataAnalyzer

analyzer = SpotifyDataAnalyzer()

# Analyze playlist
playlist_url = "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
stats = analyzer.analyze_playlist(playlist_url)

print(f"Total duration: {stats['total_duration_formatted']}")
print(f"Average track length: {stats['average_duration_formatted']}")
print(f"Most common artist: {stats['most_common_artists'][0]}")

# Compare playlists
playlist1 = "https://open.spotify.com/playlist/..."
playlist2 = "https://open.spotify.com/playlist/..."
comparison = analyzer.compare_playlists(playlist1, playlist2)

print(f"Common tracks: {len(comparison['common_tracks'])}")
print(f"Similarity score: {comparison['similarity_score']:.2%}")

📊 Data Structures

Track Data

{
    "id": "4iV5W9uYEdYUVa79Axb7Rh",
    "name": "Harder Better Faster Stronger",
    "uri": "spotify:track:4iV5W9uYEdYUVa79Axb7Rh",
    "type": "track",
    "duration_ms": 225400,
    "artists": [
        {
            "name": "Daft Punk",
            "uri": "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi",
            "id": "4tZwfgrHOc3mvqYlEYSvVi"
        }
    ],
    "album": {
        "name": "Discovery",
        "uri": "spotify:album:2noRn2Aes5aoNVsU6iWThc",
        "images": [...]
    },
    "preview_url": "https://p.scdn.co/mp3-preview/...",
    "is_playable": true,
    "is_explicit": false
}

Album Data

{
    "id": "0JGOiO34nwfUdDrD612dOp",
    "name": "Discovery",
    "uri": "spotify:album:0JGOiO34nwfUdDrD612dOp",
    "type": "album",
    "artists": [...],
    "images": [...],
    "release_date": "2001-03-07",
    "total_tracks": 14,
    "tracks": [...]
}

🛠️ Advanced Features

Custom Browser Backend

# Use Selenium for JavaScript-heavy content
client = SpotifyClient(browser_type="selenium")

# Selenium will be used automatically if requests fails
client = SpotifyClient(browser_type="auto")

Logging Configuration

import logging

# Configure logging
client = SpotifyClient(
    log_level="DEBUG",
    log_file="spotify_scraper.log"
)

# Or configure globally
logging.basicConfig(level=logging.DEBUG)

Environment Variables

Configure via environment variables (prefix with SPOTIFY_SCRAPER_):

export SPOTIFY_SCRAPER_LOG_LEVEL=DEBUG
export SPOTIFY_SCRAPER_BROWSER_TYPE=selenium
export SPOTIFY_SCRAPER_COOKIE_FILE=/path/to/cookies.txt

🎯 CLI Commands

Track Command

spotify-scraper track [URL] [OPTIONS]

Options:
  -o, --output PATH      Output file path
  -p, --pretty          Pretty print output
  -f, --format FORMAT   Output format (json/yaml/table)
  --with-lyrics         Include lyrics (requires auth)

Album Command

spotify-scraper album [URL] [OPTIONS]

Options:
  -o, --output PATH      Output file path
  -p, --pretty          Pretty print output
  -f, --format FORMAT   Output format (json/yaml/table)
  --tracks-only         Only output track list

Playlist Command

spotify-scraper playlist [URL] [OPTIONS]

Options:
  -o, --output PATH      Output file path
  -p, --pretty          Pretty print output
  -f, --format FORMAT   Output format (json/yaml/table)

Download Command

# Download cover image
spotify-scraper download cover [URL] --output cover.jpg

# Download track preview with cover
spotify-scraper download track [URL] --with-cover

# Batch download from URL list
spotify-scraper download batch urls.txt --output downloads/

🔧 Troubleshooting

Common Issues

  1. No track preview available

    • Not all tracks have preview URLs
    • Try using a different track
  2. Authentication required for lyrics

    • Export cookies from your browser
    • Use --cookie-file option
  3. Selenium browser errors

    • Install Chrome/Chromium
    • Install appropriate driver (chromedriver)
  4. Rate limiting

    • Add delays between requests
    • Use proxy rotation

🤝 Contributing

Contributions are welcome! Please read our Contributing Guidelines first.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

⚠️ Disclaimer

This library is for educational and personal use only. Respect Spotify's Terms of Service and use responsibly.

🔗 Links

Metadata

Release files for spotifyscraper 2.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for spotifyscraper 2.0.3
File Size Uploaded
spotifyscraper-2.0.3.tar.gz 195.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for spotifyscraper 2.0.3
File Interpreter ABI Platform
spotifyscraper-2.0.3-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 295.9 kB

Release files / spotifyscraper-2.0.3.tar.gz

Download URL spotifyscraper-2.0.3.tar.gz
Size 195.0 kB
Tags Source
SHA-256 checksum
How to use checksums
e849c8a8d8bcfff2a8960f9da2b45332d144bde36db332c76d8ea39e0811d875
BLAKE2b-256 checksum
How to use checksums
e2fe54da62f75353c0bd7da211b2d21c6c1dac0cffde1810583662f5255a301a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.3

Release files / spotifyscraper-2.0.3-py2.py3-none-any.whl

Download URL spotifyscraper-2.0.3-py2.py3-none-any.whl
Size 100.9 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
e70a29b6dbe57846c28aa43aa76d2519fb20a805eadc44f372c143c78721eaec
BLAKE2b-256 checksum
How to use checksums
1515adf2f6e510f9ed3991bfc3f8176528385e4e86665e28a0bbcd81ce539d8d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.3

Release history Release notifications | RSS feed

3.9.2

2 release files

3.9.1

2 release files

3.9.0

2 release files

3.8.0

2 release files

3.7.0

2 release files

3.6.1

2 release files

3.6.0

2 release files

3.5.0

2 release files

3.4.0

2 release files

3.3.0

2 release files

3.2.0

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.1.5

2 release files

2.1.4

2 release files

2.1.3

2 release files

2.1.2

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.20

2 release files

2.0.19

2 release files

2.0.18

2 release files

2.0.15

2 release files

2.0.14

2 release files

2.0.13

2 release files

2.0.12

2 release files

2.0.11

2 release files

2.0.10

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

This release

2.0.3 This release

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.0.5

1 release file

1.0.4

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page