DEV Community

Session zero
Session zero

Posted on

Track K-pop Trends with Melon Chart Data: A Developer's Guide

Status: Draft (파일 저장만 — 게시 금지)

Platform: Medium / LinkedIn

Target: K-pop fan developers, music streaming analysts, marketers, r/dataisbeautiful readers

Actor: https://apify.com/oxygenated_quagmire/melon-chart-scraper

Created: 2026-03-01


📝 Article Draft


Track K-pop Trends with Melon Chart Data: A Developer's Guide

How to scrape Korea's #1 music platform to build K-pop analytics, trend trackers, and recommendation systems


K-pop isn't a trend — it's a global industry.

BTS sold out Wembley Stadium. BLACKPINK broke YouTube records. NewJeans and aespa have fans in São Paulo, Lagos, and Oslo. In 2024, K-pop generated over $12 billion in global revenue, with music streaming at the core.

And at the center of Korea's music streaming universe? Melon — with 28 million+ users and real-time charts that the entire industry watches.

If you're building music analytics tools, fan dashboards, recommendation systems, or just want to explore K-pop data for a side project — Melon chart data is your goldmine. The problem? Melon doesn't offer a public API.

Until now.


1. Why Melon Data?

Melon's Position in K-pop

Melon (멜론) is Korea's oldest and largest music streaming platform, launched in 2004. It's owned by Kakao Entertainment and has a direct pipeline to Korean music consumption patterns.

Why does this matter for data analysis?

  • Real-time cultural signal: Melon's TOP 100 updates continuously. When HYBE drops a new BTS track at midnight, you can watch it climb the charts in real time.
  • Multiple chart dimensions: Daily, weekly, monthly, and HOT 100 charts capture both trends and longevity.
  • Rich metadata: Genre, release date, album info, and full lyrics — all in one place.
  • No authentication required: All chart data is publicly accessible.

K-pop's Global Data Opportunity

The K-pop fandom is uniquely data-hungry:

  • Fans obsessively track chart positions ("streaming parties" coordinate to boost rankings)
  • Labels monitor chart performance to gauge comeback success
  • Playlist curators need real-time trending data
  • Researchers study K-pop's cultural diffusion patterns

There's a massive gap between the data available and the tools to access it. That's where this guide comes in.


2. Introducing Melon Chart Scraper

The Melon Chart Scraper is an Apify Actor that extracts data from Melon's public charts and search results — no API key, no browser, no proxies needed.

What It Can Do

Mode What You Get
top100 Real-time TOP 100 chart
hot100 HOT 100 chart
daily Daily chart rankings
weekly Weekly chart rankings
monthly Monthly chart rankings
search Search by artist, song, or album

The fetchDetails Power-Up

Add "fetchDetails": true to unlock:

  • 🎵 Full lyrics (Korean — great for NLP or language learning projects)
  • 🎸 Genre classification (댄스/발라드/R&B etc.)
  • 📅 Release date (calculate chart debut timing)
  • 🎧 FLAC quality info

Pricing

  • $0.50 per 1,000 tracks — that's TOP 100 chart for $0.05
  • Detail pages included in the price
  • No minimum spend

3. Step-by-Step Guide

Step 1: Get Your Apify Account

  1. Sign up at apify.com — free tier available
  2. Navigate to the Melon Chart Scraper Actor page
  3. Click "Try for free"

Step 2: Configure Your Input

Basic — Grab the TOP 100:

{
  "mode": "top100",
  "maxResults": 100
}
Enter fullscreen mode Exit fullscreen mode

Advanced — Weekly chart with full details:

{
  "mode": "weekly",
  "fetchDetails": true,
  "maxResults": 100
}
Enter fullscreen mode Exit fullscreen mode

Search for specific artist:

{
  "mode": "search",
  "keyword": "아이유",
  "maxResults": 50
}
Enter fullscreen mode Exit fullscreen mode

Step 3: Run and Extract Data

  1. Click "Start" in the Apify Console
  2. Wait ~10-30 seconds for TOP 100 (faster without fetchDetails)
  3. Download results as JSON, CSV, or Excel
  4. Or use the Apify API for automated integration:
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "mode": "top100",
    "fetchDetails": True,
    "maxResults": 100
}

run = client.actor("oxygenated_quagmire/melon-chart-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).iterate_items()

for item in items:
    print(f"#{item['rank']} {item['title']} - {item['artist']}")
Enter fullscreen mode Exit fullscreen mode

Step 4: Schedule Automated Runs

In the Apify Console, set a schedule to run daily or weekly:

  • Daily chart snapshot at midnight KST
  • Weekly chart every Monday morning
  • Export to Google Sheets, S3, or your database

4. Real Use Cases

Use Case 1: K-pop Trend Analysis Dashboard

Goal: Visualize weekly chart movements to spot rising artists and declining tracks.

import pandas as pd
import matplotlib.pyplot as plt

# Collect weekly chart data over 4 weeks
weekly_data = []
for week in weeks:
    run = client.actor("oxygenated_quagmire/melon-chart-scraper").call(
        run_input={"mode": "weekly", "maxResults": 50}
    )
    items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
    for item in items:
        item["week"] = week
    weekly_data.extend(items)

df = pd.DataFrame(weekly_data)

# Track a specific artist's chart trajectory
ive_songs = df[df["artist"].str.contains("IVE")]
pivot = ive_songs.pivot(index="week", columns="title", values="rank")
pivot.plot(marker="o", title="IVE - Melon Weekly Chart Trajectory")
plt.gca().invert_yaxis()  # Lower rank = better
plt.show()
Enter fullscreen mode Exit fullscreen mode

What you can build:

  • Interactive chart movement visualizations (great for r/dataisbeautiful!)
  • "Longevity score" — how long does a song stay in top 10?
  • Genre trend analysis over months

Use Case 2: Artist Popularity Monitor (Comeback Tracker)

Goal: Track how quickly a new album enters and climbs Melon's charts.

from datetime import datetime
import time

def monitor_comeback(artist_name, check_interval_minutes=30, duration_hours=72):
    """Monitor a K-pop comeback's chart performance in real time."""
    results = []
    end_time = datetime.now().timestamp() + (duration_hours * 3600)

    while datetime.now().timestamp() < end_time:
        run = client.actor("oxygenated_quagmire/melon-chart-scraper").call(
            run_input={"mode": "top100", "maxResults": 100}
        )

        chart_data = list(client.dataset(run["defaultDatasetId"]).iterate_items())
        artist_entries = [s for s in chart_data if artist_name in s["artist"]]

        snapshot = {
            "timestamp": datetime.now().isoformat(),
            "entries": len(artist_entries),
            "best_rank": min([s["rank"] for s in artist_entries]) if artist_entries else None,
            "songs": [{"title": s["title"], "rank": s["rank"]} for s in artist_entries]
        }
        results.append(snapshot)
        print(f"[{snapshot['timestamp']}] {artist_name}: {snapshot['entries']} songs, best rank #{snapshot['best_rank']}")

        time.sleep(check_interval_minutes * 60)

    return results

# Usage: Monitor TWICE comeback
monitor_comeback("TWICE", check_interval_minutes=60, duration_hours=48)
Enter fullscreen mode Exit fullscreen mode

What you can build:

  • Slack/Discord bot that alerts when your favorite artist enters TOP 10
  • Label intelligence dashboard tracking competitor comebacks
  • "First 24 hours" chart performance predictor

Use Case 3: Music Recommendation System Data Collection

Goal: Build a content-based recommendation system using Melon's rich metadata.

def build_music_dataset():
    """Collect comprehensive K-pop dataset for recommendation system training."""

    all_songs = []

    # Collect across multiple time periods for diversity
    modes = ["top100", "weekly", "monthly"]

    for mode in modes:
        run = client.actor("oxygenated_quagmire/melon-chart-scraper").call(
            run_input={
                "mode": mode,
                "fetchDetails": True,  # Include genre, lyrics, release date
                "maxResults": 100
            }
        )
        songs = list(client.dataset(run["defaultDatasetId"]).iterate_items())
        all_songs.extend(songs)

    # Deduplicate by songId
    seen = set()
    unique_songs = []
    for song in all_songs:
        if song["songId"] not in seen:
            seen.add(song["songId"])
            unique_songs.append(song)

    df = pd.DataFrame(unique_songs)

    # Feature engineering for recommendation
    df["has_lyrics"] = df["lyrics"].notna()
    df["is_dance"] = df["genre"].str.contains("댄스", na=False)
    df["is_ballad"] = df["genre"].str.contains("발라드", na=False)
    df["chart_score"] = 101 - df["rank"].fillna(100)  # Higher = better rank

    return df

dataset = build_music_dataset()
print(f"Collected {len(dataset)} unique songs")
print(dataset[["title", "artist", "genre", "chart_score"]].head(20))
Enter fullscreen mode Exit fullscreen mode

What you can build:

  • "If you like X artist, you'll like Y" recommendation engine
  • Genre-based playlist generator for Korean music
  • Training data for K-pop music classification models

5. Data Structure

Here's what a full response looks like with fetchDetails: true:

{
  "rank": 1,
  "songId": "601237102",
  "title": "BANG BANG",
  "artist": "IVE (아이브)",
  "albumTitle": "REVIVE+",
  "albumId": "12845274",
  "albumImageUrl": "https://cdnimg.melon.co.kr/cm2/album/images/128/45/274/12845274_20260223113048_500.jpg/melon/resize/120/quality/80/optimize",
  "songUrl": "https://www.melon.com/song/detail.htm?songId=601237102",
  "genre": "댄스",
  "releaseDate": "2026.02.09",
  "lyrics": "It's a new scene It's aggressive...",
  "flacInfo": "Flac 16/24bit",
  "chartType": "top100",
  "scrapedAt": "2026-02-28T04:30:00.000000"
}
Enter fullscreen mode Exit fullscreen mode

Key Fields Explained

  • rank: Chart position (null for search results)
  • songId: Melon's unique song identifier — use this to track the same song across multiple scrapes
  • genre: Korean genre tags (댄스=Dance, 발라드=Ballad, 힙합=Hip-hop, R&B=R&B)
  • releaseDate: Format: YYYY.MM.DD
  • lyrics: Full Korean lyrics — valuable for NLP, sentiment analysis, or language learning apps
  • scrapedAt: UTC timestamp — important for time-series analysis

Quick Schema for Database Storage

CREATE TABLE melon_chart_snapshots (
  id SERIAL PRIMARY KEY,
  scraped_at TIMESTAMP,
  chart_type VARCHAR(20),
  rank INTEGER,
  song_id VARCHAR(50),
  title VARCHAR(200),
  artist VARCHAR(200),
  album_title VARCHAR(200),
  genre VARCHAR(100),
  release_date DATE,
  UNIQUE(scraped_at::DATE, chart_type, song_id)
);
Enter fullscreen mode Exit fullscreen mode

6. Conclusion

Melon sits at the intersection of two massive trends: the global K-pop wave and the data-driven music industry. Whether you're building fan tools, doing academic research, or trying to predict the next breakout K-pop act, Melon chart data gives you a direct window into Korea's music consumption in real time.

The Melon Chart Scraper makes this data accessible in minutes — no API negotiation, no complex authentication, no browser automation overhead.

Start exploring K-pop data today:

  1. 🚀 Try the Melon Chart Scraper — first run free
  2. 📊 Build your first chart visualization with the Python snippets above
  3. 💬 Share what you build — K-pop data visualizations consistently go viral on r/dataisbeautiful and K-pop fan communities

Want more K-pop data tools? Check out the full suite of Korean platform scrapers:


📋 Publishing Checklist

  • [ ] Final proofread
  • [ ] Add 2-3 screenshots (Actor console, sample output, example visualization)
  • [ ] Cross-post links prepared (Medium → LinkedIn → Reddit r/kpop + r/dataisbeautiful)
  • [ ] Tags: kpop, data-science, python, music, web-scraping, apify
  • [ ] CTA links verified
  • [ ] Internal linking to Naver Place + Naver News guides

📊 SEO Keywords

  • melon chart api
  • kpop chart data python
  • melon music scraper
  • k-pop trend analysis
  • korean music chart data
  • apify kpop

🔗 Cross-posting Strategy

  1. Medium: Full article with code snippets
  2. LinkedIn: Shortened version (500 words) + link to Medium
  3. Reddit r/dataisbeautiful: Visualization-focused post + link
  4. Reddit r/kpop: Fan-friendly post focusing on comeback tracker use case
  5. Dev.to: Technical version focusing on Python code examples

Top comments (0)