# Douban Reviews Scraper (`stackrelay/douban-reviews-scraper`) Actor

Scrape Douban (豆瓣) ratings, reviews & comments with sentiment tags for movies, TV, books, music & groups. Clean JSON for NLP/LLM training & analysis.

- **URL**: https://apify.com/stackrelay/douban-reviews-scraper.md
- **Developed by:** [StackRelay](https://apify.com/stackrelay) (community)
- **Categories:** AI, Social media, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 long review (full body + sentiment)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Douban Reviews Scraper

Scrape public **Douban (豆瓣)** ratings, long-form reviews and short comments — each tagged with a **positive / neutral / negative sentiment** label — for movies, TV, books, music and groups. Built for media & entertainment researchers, publishers, recommendation-engine teams and AI-training-data buyers who need structured Chinese cultural-opinion data.

### What you get

Paste one or more Douban subject URLs and get a clean dataset with three record types:

- **`subject`** — the title, year, overall rating, rating count and genres.
- **`comment`** — short user comments (high volume) with star rating + sentiment.
- **`review`** — long-form reviews with full body text, star rating + sentiment.

Group URLs produce **`group_topic`** records (discussion topics with reply counts).

Sentiment is derived from the author's own Douban star rating — no guesswork, no ML black box: 5–4★ = `positive`, 3★ = `neutral`, 2–1★ = `negative`, unrated = `null`.

### Supported URLs

| Type | Example |
|---|---|
| Movie / TV | `https://movie.douban.com/subject/1292052/` |
| Book | `https://book.douban.com/subject/1084336/` |
| Music | `https://music.douban.com/subject/1407217/` |
| Group | `https://www.douban.com/group/beethoven/` |

### Example input

```json
{
    "startUrls": [
        { "url": "https://movie.douban.com/subject/1292052/" }
    ],
    "scrapeShortComments": true,
    "scrapeLongReviews": true,
    "maxCommentsPerSubject": 200,
    "maxReviewsPerSubject": 50,
    "fetchFullReviewText": true,
    "tagSentiment": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

### Example output

A short comment record:

```json
{
    "record_type": "comment",
    "id": "comment:1234567890",
    "subject_id": "1292052",
    "subject_type": "movie",
    "subject_title": "肖申克的救赎 The Shawshank Redemption",
    "author": "影迷小王",
    "author_url": "https://www.douban.com/people/12345/",
    "rating_stars": 5,
    "rating_label": "力荐",
    "sentiment": "positive",
    "content": "希望让人自由。每看一次都有新的感动。",
    "useful_count": 1842,
    "created_at": "2021-03-14T21:05:00+08:00",
    "source_url": "https://movie.douban.com/subject/1292052/comments?status=P&start=0&limit=20&sort=new_score",
    "scraped_at": "2026-06-15T09:12:00.000Z"
}
```

Field notes:

- `id` is stable across runs (built from Douban's comment/review id) — use it to deduplicate on your side.
- `rating_stars` / `sentiment` are `null` when the user left a comment without a rating.
- `created_at` is the original Douban timestamp in China Standard Time (UTC+8); `scraped_at` is ISO-8601 UTC.
- For long reviews, `content_truncated: false` means the full essay body was captured (`fetchFullReviewText` enabled).

### Popular use cases

Ready-to-run example tasks — pre-filled inputs you can duplicate and run with one click, grouped by content type:

**Film & TV**

- [Shawshank Redemption Douban sentiment dataset](https://apify.com/stackrelay/douban-reviews-scraper/examples/shawshank-redemption-douban-sentiment-dataset)
- [Mine positive Douban review quotes for film marketing](https://apify.com/stackrelay/douban-reviews-scraper/examples/shawshank-positive-review-quotes-marketing)
- [Measure Chinese audience reception of a foreign film](https://apify.com/stackrelay/douban-reviews-scraper/examples/foreign-film-chinese-audience-reception-shawshank)
- [Farewell My Concubine (霸王别姬) full review corpus](https://apify.com/stackrelay/douban-reviews-scraper/examples/farewell-my-concubine-douban-reviews-corpus)
- [Compare Western vs Chinese classic film reception](https://apify.com/stackrelay/douban-reviews-scraper/examples/compare-western-chinese-classic-film-reception)
- [Wandering Earth opening-weekend comment buzz on Douban](https://apify.com/stackrelay/douban-reviews-scraper/examples/wandering-earth-douban-comment-buzz)
- [Quick Douban rating snapshot for a sci-fi blockbuster](https://apify.com/stackrelay/douban-reviews-scraper/examples/wandering-earth-douban-rating-snapshot)
- [Mine negative Douban reviews for studio feedback](https://apify.com/stackrelay/douban-reviews-scraper/examples/wandering-earth-negative-review-mining)
- [Sentiment dataset from Empresses in the Palace](https://apify.com/stackrelay/douban-reviews-scraper/examples/empresses-in-the-palace-sentiment-dataset)
- [Full long reviews from Empresses in the Palace](https://apify.com/stackrelay/douban-reviews-scraper/examples/empresses-in-the-palace-long-reviews)
- [Fan-community sentiment stream: Empresses in the Palace](https://apify.com/stackrelay/douban-reviews-scraper/examples/empresses-in-the-palace-fan-sentiment-stream)
- [Quick rating benchmark for a Chinese palace drama](https://apify.com/stackrelay/douban-reviews-scraper/examples/empresses-in-the-palace-rating-benchmark)
- [Compare cuts of Empresses in the Palace on Douban](https://apify.com/stackrelay/douban-reviews-scraper/examples/empresses-in-the-palace-cut-comparison)
- [High-volume comment harvesting: Chinese TV drama](https://apify.com/stackrelay/douban-reviews-scraper/examples/empresses-in-the-palace-high-volume-comments)
- [Mine critical Douban reviews for TV remake risk QA](https://apify.com/stackrelay/douban-reviews-scraper/examples/empresses-in-the-palace-critical-review-mining)
- [AI-training sentiment corpus: Chinese palace drama](https://apify.com/stackrelay/douban-reviews-scraper/examples/palace-drama-ai-training-sentiment-corpus)

**Books**

- [Sentiment dataset from The Three-Body Problem reviews](https://apify.com/stackrelay/douban-reviews-scraper/examples/three-body-problem-douban-sentiment-dataset)
- [Short-comment stream for The Three-Body Problem](https://apify.com/stackrelay/douban-reviews-scraper/examples/three-body-problem-douban-comment-stream)
- [Mine negative reviews for translation-quality feedback](https://apify.com/stackrelay/douban-reviews-scraper/examples/three-body-problem-negative-review-mining)
- [Full long-review corpus from To Live reviews](https://apify.com/stackrelay/douban-reviews-scraper/examples/to-live-yu-hua-douban-review-corpus)
- [Quick Douban rating snapshot for a literary title](https://apify.com/stackrelay/douban-reviews-scraper/examples/to-live-douban-rating-snapshot)
- [Mine positive Douban review quotes from a classic](https://apify.com/stackrelay/douban-reviews-scraper/examples/to-live-positive-review-quotes-publisher)
- [Full pipeline scrape of a literary classic](https://apify.com/stackrelay/douban-reviews-scraper/examples/to-live-full-pipeline-book-club-research)
- [Compare sci-fi vs literary-fiction reception on Douban](https://apify.com/stackrelay/douban-reviews-scraper/examples/compare-scifi-literary-fiction-douban-reception)

**Music**

- [Sentiment dataset from Jay Chou's debut album reviews](https://apify.com/stackrelay/douban-reviews-scraper/examples/jay-chou-debut-album-sentiment-dataset)
- [Full long-review corpus from a C-pop debut album](https://apify.com/stackrelay/douban-reviews-scraper/examples/jay-chou-debut-album-long-reviews)
- [Mine positive quotes for an album reissue campaign](https://apify.com/stackrelay/douban-reviews-scraper/examples/jay-chou-debut-album-positive-quotes-marketing)
- [Fan comment buzz tracker for a Jay Chou album](https://apify.com/stackrelay/douban-reviews-scraper/examples/jay-chou-kuashidai-comment-buzz)
- [Quick Douban rating snapshot for a C-pop album](https://apify.com/stackrelay/douban-reviews-scraper/examples/jay-chou-kuashidai-rating-snapshot)
- [Mine critical comments from a C-pop album for A\&R](https://apify.com/stackrelay/douban-reviews-scraper/examples/jay-chou-kuashidai-negative-comment-mining)
- [Compare reception across a Jay Chou discography](https://apify.com/stackrelay/douban-reviews-scraper/examples/jay-chou-discography-reception-comparison)
- [AI-training sentiment corpus from C-pop album reviews](https://apify.com/stackrelay/douban-reviews-scraper/examples/cpop-album-ai-training-sentiment-corpus)

**Groups**

- [Monitor entertainment-gossip group discussions](https://apify.com/stackrelay/douban-reviews-scraper/examples/douban-gossip-group-topic-monitoring)
- [Build a mention-alert feed from a Douban gossip group](https://apify.com/stackrelay/douban-reviews-scraper/examples/douban-gossip-group-mention-alert-feed)
- [Track Shanghai rental-market discussions on Douban](https://apify.com/stackrelay/douban-reviews-scraper/examples/shanghai-rental-group-discussion-tracking)
- [Batch-monitor multiple Douban interest groups](https://apify.com/stackrelay/douban-reviews-scraper/examples/multi-group-douban-topic-monitoring)
- [Benchmark community activity across two Douban groups](https://apify.com/stackrelay/douban-reviews-scraper/examples/douban-group-activity-benchmark)
- [Export Douban group topics for academic research](https://apify.com/stackrelay/douban-reviews-scraper/examples/douban-group-topics-academic-research-export)
- [High-concurrency group topic harvesting](https://apify.com/stackrelay/douban-reviews-scraper/examples/high-concurrency-douban-group-harvesting)
- [Low-concurrency safe group scrape for researchers](https://apify.com/stackrelay/douban-reviews-scraper/examples/low-concurrency-douban-group-scrape)

See the full list under the actor's **Examples** tab on the Apify Store.

### Pricing

Pay-per-event — you pay per item actually extracted, so cost scales with value:

| Event | Price |
|---|---|
| Long review (full body + sentiment) | $0.025 |
| Short comment | $0.005 |
| Subject info | $0.006 |
| Group topic | $0.012 |
| Actor start | $0.00005 |

(Final prices are shown on the Apify Store listing.)

### Limitations

- Douban serves a JavaScript proof-of-work anti-bot challenge, so this actor runs a **real headless browser** (Playwright + Chromium) to clear it. Recommended run settings: **4 GB memory** and **residential Apify Proxy**. The browser solves the challenge automatically and retries on a fresh session if it doesn't clear.
- Douban limits how deep short-comment pagination goes for logged-out access (typically the first few hundred). Set `maxCommentsPerSubject` realistically.
- A minority of titles (often sensitive ones) gate their **short comments** behind login entirely for logged-out visitors; for those, the actor still returns the subject info and long reviews, but short comments come back empty. Long reviews and ratings are not gated.
- Keep `maxConcurrency` modest (default 3). Under heavy concurrency Douban occasionally soft-throttles a page, which can make a single comment page come back empty; lower concurrency avoids this.
- Some music/book subject pages expose fewer fields (e.g. no genres); those come back `null`.
- Public data only — the actor never logs in or scrapes login-walled content.

### FAQ

**Which content should I scrape?** Toggle `scrapeShortComments`, `scrapeLongReviews` and `scrapeSubjectInfo` independently. Short comments are cheapest and highest-volume; long reviews are richer for sentiment / NLP work.

**Can I run this on a schedule?** Yes — use Apify Schedules. Reviews are evergreen, so weekly is usually plenty.

**How do I export to my DB / Google Sheets?** Use Apify Integrations or the Dataset API — every field above is available via `/items?format=json|csv|xlsx`. The dataset also ships pre-built **Short comments** and **Long reviews** table views.

**Why is sentiment sometimes null?** The user rated nothing, so there's no star signal to map. The raw `content` is still captured.

# Actor input Schema

## `startUrls` (type: `array`):

One or more Douban URLs. Supported: movie & TV (movie.douban.com/subject/ID/), book (book.douban.com/subject/ID/), music (music.douban.com/subject/ID/) and group (douban.com/group/ID/). Paste the main subject page — the actor finds its reviews and comments automatically.

## `scrapeSubjectInfo` (type: `boolean`):

Output one record per subject with its title, year, overall rating, rating count and genres.

## `scrapeShortComments` (type: `boolean`):

Scrape short user comments (the high-volume rating + one-liner stream). Cheapest, highest-volume content.

## `scrapeLongReviews` (type: `boolean`):

Scrape long-form reviews (full essays). Higher value, richer text for sentiment / AI-training use.

## `maxCommentsPerSubject` (type: `integer`):

Hard cap on short comments scraped per subject. Douban paginates 20 per page.

## `maxReviewsPerSubject` (type: `integer`):

Hard cap on long reviews scraped per subject. Douban paginates 20 per page.

## `fetchFullReviewText` (type: `boolean`):

Long-review list pages only show a preview. When enabled, the actor opens each review to capture the full body. Costs one extra request per review.

## `tagSentiment` (type: `boolean`):

Derive a positive / neutral / negative sentiment label from the author's Douban star rating (5–4 = positive, 3 = neutral, 2–1 = negative, no rating = null).

## `proxyConfiguration` (type: `object`):

Douban blocks datacenter IPs. Residential Apify Proxy is strongly recommended for reliable runs.

## `maxConcurrency` (type: `integer`):

Parallel headless-browser slots. Keep low — each uses a real Chromium instance and Douban rate-limits aggressively. Values above 2 reliably trigger 403s and zero-item soft-throttles. Raise actor memory if you increase this.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://movie.douban.com/subject/1292052/"
    }
  ],
  "scrapeSubjectInfo": true,
  "scrapeShortComments": true,
  "scrapeLongReviews": true,
  "maxCommentsPerSubject": 200,
  "maxReviewsPerSubject": 50,
  "fetchFullReviewText": true,
  "tagSentiment": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 2
}
```

# Actor output Schema

## `results` (type: `string`):

The full dataset — subjects, short comments, long reviews and group topics mixed together, ordered as scraped.

## `subjects` (type: `string`):

One record per scraped subject: title, year, overall rating, rating count and genres.

## `comments` (type: `string`):

High-volume short user comments with star ratings and sentiment tags.

## `reviews` (type: `string`):

Full-form review essays with star ratings and sentiment tags.

## `groupTopics` (type: `string`):

Douban group discussion topics with author, reply count and last-reply time.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://movie.douban.com/subject/1292052/"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stackrelay/douban-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://movie.douban.com/subject/1292052/" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("stackrelay/douban-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://movie.douban.com/subject/1292052/"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call stackrelay/douban-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stackrelay/douban-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bmXRNbDbrBpW54zKa/builds/V9sr4PREeoym4vW1l/openapi.json
