DEV Community

Session zero
Session zero

Posted on

Tracking the Next Squid Game: Mining Naver Webtoon Data Before It Hits Netflix

The K-Content Pipeline You Didn't Know Existed

Squid Game almost didn't happen. It sat in development for a decade. The Glory was a webtoon before it was a Netflix sensation. Hellbound, Sweet Home, All of Us Are Dead — the pattern repeats: Korean digital content goes global, and Naver Webtoon is often where the signal appears first.

There are 70+ million monthly readers on Naver Webtoon. Every one of them votes with their subscriptions and stars. That data is public and structured.

So I built a scraper that reads it.


What the Naver Webtoon Scraper Extracts

Each title record includes:

{
  "titleId": 748235,
  "title": "유미의 세포들",
  "author": "이동건",
  "genre": ["일상", "로맨스"],
  "synopsis": "유미의 머릿속 세포들이...",
  "subscriberCount": 4312000,
  "starScore": 9.82,
  "publishDays": ["mon", "fri"],
  "totalEpisodes": 520,
  "isCompleted": true,
  "isPaid": false,
  "ageRating": "ALL",
  "tags": ["힐링", "직장인", "세포"],
  "thumbnailUrl": "https://...",
  "webtoonUrl": "https://comic.naver.com/webtoon/list?titleId=748235",
  "scrapedAt": "2026-03-28T09:00:00.000Z"
}
Enter fullscreen mode Exit fullscreen mode

The actor supports four browsing modes:

  • By day: Mon–Sun serialized webtoons
  • By genre: Romance, action, thriller, fantasy...
  • By keyword search: Find by title or author
  • Episode list: Full episode metadata for a specific title

Running It

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

# Get all Monday webtoons
run_input = {
    "mode": "day",
    "day": "mon",
    "maxItems": 100
}

run = client.actor("oxygenated_quagmire/naver-webtoon-scraper").call(
    run_input=run_input
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']}{item['subscriberCount']:,} subscribers, ★{item['starScore']}")
Enter fullscreen mode Exit fullscreen mode

JavaScript/Node.js:

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('oxygenated_quagmire/naver-webtoon-scraper').call({
    mode: 'genre',
    genre: 'thriller',
    maxItems: 50
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map(i => `${i.title}: ${i.subscriberCount} subs`));
Enter fullscreen mode Exit fullscreen mode

Real Use Case: Finding the Next Adaptation Candidate

Here's a simple scoring formula for IP scouting:

import pandas as pd

# Load your scraped data
df = pd.DataFrame(items)

# Adaptation potential score
# High subscribers + high rating + drama-friendly genre + not yet adapted
drama_genres = ['로맨스', '드라마', '스릴러', '액션']

df['adaptation_score'] = (
    (df['subscriberCount'] / df['subscriberCount'].max()) * 0.5 +
    (df['starScore'] / 10) * 0.3 +
    df['genre'].apply(lambda g: 0.2 if any(dg in g for dg in drama_genres) else 0)
)

top_candidates = df.nlargest(10, 'adaptation_score')[
    ['title', 'author', 'subscriberCount', 'starScore', 'isCompleted', 'adaptation_score']
]
print(top_candidates)
Enter fullscreen mode Exit fullscreen mode

What the Data Actually Shows

Running this scoring model on a representative sample (~3,200 active titles, March 2026):

  • Average subscribers: ~284,000 per active title
  • Median rating: 9.41 ⭐
  • Genre split: Romance 34%, Fantasy 21%, Action 15%, Drama 12%, Thriller 8%
  • Completion rate: 42% completed, 58% ongoing
  • Peak day: Wednesday has ~23% more active titles than Sunday

The subscriber cliff is steep: top 10% of titles hold roughly 78% of total subscribers. If you're looking for undiscovered IP, the sweet spot is 500K–2M subscribers with 9.5+ rating — large enough to prove demand, small enough to be overlooked by major studios.


Pricing

The actor uses Pay Per Dataset Item pricing:

  • First 100 items free per run
  • /bin/zsh.60 per 1,000 additional items

For weekly monitoring of ~500 titles, that's roughly /bin/zsh.24/week — less than a coffee per month.


Links

Top comments (0)