# Douban Scraper 豆瓣 — Movies, Books, Music, Comments & Reviews (`china-data/douban-scraper`) Actor

Scrape Douban (豆瓣) without login: search movies, TV, books and music; full details and 1–5 star rating breakdown; hot short comments (incl. movies) and full-text reviews; Top 250 and 18 more charts. From $1 per 1,000 rows.

- **URL**: https://apify.com/china-data/douban-scraper.md
- **Developed by:** [China Data](https://apify.com/china-data) (community)
- **Categories:** Social media, Videos, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 subjects

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Douban Scraper 豆瓣 — Movies, Books, Music, Comments & Reviews

Scrape public data from [Douban](https://www.douban.com) (豆瓣), China's biggest site for rating and reviewing movies, TV series, books and music, **without logging in and without cookies**.

- 🔎 **Keyword search** for movies and TV series, books or music, page after page — everything Douban returns for a keyword (for example 271 books for 三体, 428 albums for 周杰伦).
- 🎬 **Subject details**: rating, number of ratings, the **1–5 star rating breakdown**, watched / watching / want-to-watch counts, directors, cast, authors, translators, publishers, singers, track lists, genres, countries, release dates, running time, episodes, pages, price, synopsis and honours such as "豆瓣电影Top250 #1".
- 💬 **Short comments (短评)** for movies, TV series, books **and** music: text, stars, votes, date, IP location and user.
- 📝 **Reviews (影评 / 书评 / 乐评)** with the **full text**, title, stars, helpful votes, read count, spoiler flag and author.
- 🏆 **20 charts**: Movie Top 250, Book Top 250, movies in cinemas now, coming soon, best of the week, popular and trending movies, TV series (Chinese, US, Korean, Japanese, animation, variety shows), bestselling and most followed books, popular albums and singles.

Typical uses: audience sentiment for films, series and books in China, box-office and release research, market research for publishers and streaming platforms, recommendation and NLP datasets in Chinese.

### How to use

1. Add one or more of: search keywords, subject URLs, charts.
2. Optionally turn on **Full details and rating breakdown**, **Short comments** and/or **Reviews**.
3. Click **Start**, then download the results as JSON, CSV, Excel or via the API.

#### Input examples

Search books, with full details:

```json
{
    "searchQueries": ["三体", "刘慈欣"],
    "searchType": "book",
    "maxResultsPerQuery": 100,
    "includeDetails": true
}
```

Comments and full reviews of specific subjects (`m.douban.com` links and numeric movie IDs also work):

```json
{
    "subjectUrls": [
        "https://movie.douban.com/subject/1292052/",
        "https://book.douban.com/subject/2567698/"
    ],
    "includeComments": true,
    "maxCommentsPerSubject": 150,
    "includeReviews": true,
    "maxReviewsPerSubject": 20
}
```

The whole Movie Top 250 and today's popular TV series, with details:

```json
{
    "charts": ["movie_top250", "tv_hot"],
    "maxPerChart": 250,
    "includeDetails": true
}
```

### Output

Each movie, TV series, book or album is one row with `"type": "subject"`. Comments and reviews are separate rows with `"type": "comment"` and `"type": "review"` and the `subjectId` of their subject, so CSV and Excel exports stay flat. The **Subjects**, **Comments** and **Reviews** tabs of the dataset show each kind as a table.

Subject row (from a real run, synopsis and lists shortened):

```json
{
    "type": "subject",
    "subjectType": "movie",
    "id": "1292052",
    "url": "https://movie.douban.com/subject/1292052/",
    "title": "肖申克的救赎",
    "originalTitle": "The Shawshank Redemption",
    "year": "1994",
    "rating": 9.7,
    "ratingCount": 3361408,
    "ratingStars": 5.0,
    "ratingNote": null,
    "ratingDistribution": { "star1": 0.1, "star2": 0.1, "star3": 1.4, "star4": 13.0, "star5": 85.4 },
    "doneCount": 5779566,
    "doingCount": 95,
    "wishCount": 521973,
    "genres": ["剧情", "犯罪"],
    "countries": ["美国"],
    "languages": ["英语"],
    "directors": ["弗兰克·德拉邦特"],
    "actors": ["蒂姆·罗宾斯", "摩根·弗里曼", "鲍勃·冈顿", "威廉·赛德勒"],
    "authors": null,
    "translators": null,
    "singers": null,
    "publishers": null,
    "releaseDates": ["2026-08-28(中国大陆)"],
    "durations": ["142分钟"],
    "episodesCount": null,
    "pages": null,
    "price": null,
    "aka": ["月黑高飞(港)", "刺激1995(台)", "地狱诺言"],
    "subtitle": null,
    "intro": "一场谋杀案使银行家安迪（蒂姆·罗宾斯 Tim Robbins 饰）蒙冤入狱，谋杀妻子及其情人的指控将囚禁他终生。…",
    "authorIntro": null,
    "tracks": null,
    "coverUrl": "https://img3.doubanio.com/view/photo/m_ratio_poster/public/p2936346968.jpg",
    "cardSubtitle": "1994 / 美国 / 剧情 犯罪 / 弗兰克·德拉邦特 / 蒂姆·罗宾斯 摩根·弗里曼",
    "commentCount": 671148,
    "reviewCount": 15034,
    "honors": ["豆瓣电影Top250 #1"],
    "chartNote": null,
    "source": "url",
    "rank": null,
    "scrapedAt": "2026-11-01T21:23:12Z"
}
```

`ratingDistribution` is the share of ratings with 1 to 5 stars, in percent. `doneCount`, `doingCount` and `wishCount` are the numbers of users who marked the subject as watched / read / listened, in progress and wanted. Books fill `authors`, `translators`, `publishers`, `pages`, `price`, `subtitle` and `authorIntro`; albums fill `singers`, `publishers` and `tracks`.

Comment row:

```json
{
    "type": "comment",
    "subjectType": "movie",
    "subjectId": "1292052",
    "subjectTitle": "肖申克的救赎",
    "subjectUrl": "https://movie.douban.com/subject/1292052/",
    "commentId": "32514679",
    "text": "恐惧让你沦为囚犯，希望让你重获自由。——《肖申克的救赎》",
    "stars": 5,
    "status": "done",
    "votes": 26538,
    "createdAt": "2008-02-27T21:43:23+08:00",
    "ipLocation": null,
    "userId": "1289463",
    "userName": "如小果",
    "userUrl": "https://www.douban.com/people/1289463/",
    "rank": 1,
    "scrapedAt": "2026-11-01T21:23:20Z"
}
```

Review row (text shortened):

```json
{
    "type": "review",
    "subjectType": "book",
    "subjectId": "2567698",
    "subjectTitle": "三体",
    "subjectUrl": "https://book.douban.com/subject/2567698/",
    "reviewId": "1342728",
    "url": "https://book.douban.com/review/1342728/",
    "title": "《三体》：当代史的科幻书写",
    "text": "评论刘慈欣的《三体》是件困难的事情，因为可以选择的角度太多。…",
    "isFullText": true,
    "stars": 4,
    "usefulCount": 1794,
    "uselessCount": 350,
    "commentsCount": 268,
    "resharesCount": 215,
    "readCount": 347478,
    "spoiler": false,
    "createdAt": "2008-04-03T03:20:04+08:00",
    "ipLocation": null,
    "userId": "1228445",
    "userName": "胤祥",
    "userUrl": "https://www.douban.com/people/1228445/",
    "rank": 1,
    "scrapedAt": "2026-11-01T21:19:10Z"
}
```

`source` tells you where a subject came from (`search:<keyword>`, `chart:<name>` or `url`) and `rank` is its position there. `ipLocation` is the province or country that Douban shows on comments and reviews posted since 2022.

Which subject fields are filled depends on the source:

| Field | Search or chart | Subject URL or "Full details" |
|---|---|---|
| title, rating, number of ratings, cover, summary line | ✅ | ✅ |
| chart tagline (`chartNote`) | charts only | — |
| honours such as "豆瓣电影Top250 #1" | charts only | ✅ |
| rating breakdown, watched / want counts | — | ✅ |
| people, genres, countries, dates, running time, pages, tracks | — | ✅ |
| synopsis, comment and review counts | — | ✅ |

### Pricing

Pay only for what you get — no monthly rental:

| What | Price |
|---|---|
| Subject (movie, TV series, book or album) | **$2.00 per 1,000** ($0.002 each) |
| Short comment | **$1.00 per 1,000** ($0.001 each) |
| Review | **$3.00 per 1,000** ($0.003 each) |

Set a maximum cost per run in the run options; the actor stops cleanly when it is reached and keeps everything scraped so far.

### Tips and limits

- **Speed**: a test run with 5 subjects, 949 comments and 191 reviews took 73 seconds. Search and charts return 20–50 subjects per request; full details add two requests per subject and full review text one request per review.
- **Comments**: Douban shows visitors who are not logged in only the most popular short comments — in our tests 150 per movie or TV series, 100 per book and about 400 per album. The newest comments need a login and are not included.
- **Reviews**: visitors see the 40 or so most helpful reviews per subject; the newest reviews need a login.
- **Tags (标签)** are not shown to visitors, so they are not included.
- **Numeric IDs** are treated as movies or TV series. For books and music, use the full `book.douban.com` or `music.douban.com` link.
- **Cover images**: Douban blocks image hotlinking, so `coverUrl` only loads with the header `Referer: https://www.douban.com/`.
- **Dates** (`createdAt`) are Beijing time (UTC+8).
- **Proxy**: Douban limits how many pages one IP address can open, so Apify Proxy is on by default and the actor switches to a new IP when Douban slows it down.

### 中文说明

免登录、免 Cookie 采集豆瓣公开数据：电影/电视剧、图书、音乐关键词搜索（自动翻页），条目详情（评分、评分人数、1–5 星分布、看过/在看/想看人数、导演演员、作者译者出版社、歌手曲目、类型、国家、上映日期、片长、集数、简介、荣誉），热门短评（电影、剧集、图书、音乐都支持，含 IP 属地），长评全文，以及豆瓣电影 Top250、读书 Top250 等 20 个榜单。按条计费：条目 $2/千条，短评 $1/千条，长评 $3/千条，可设置单次运行费用上限。

### Is it legal?

The actor only collects data that Douban shows publicly to visitors who are not logged in. Comment and review rows include the public Douban user name and profile link of their author; if you do not need them, drop the `userId`, `userName` and `userUrl` fields. Make sure your use of the data complies with the laws that apply to you (for example GDPR or China's PIPL) and with Douban's terms.

# Actor input Schema

## `searchQueries` (type: `array`):

Search Douban for these keywords, in Chinese or English. Each keyword returns up to 'Max results per keyword' subjects of the type chosen below.

## `searchType` (type: `string`):

Douban searches movies and TV series together.

## `maxResultsPerQuery` (type: `integer`):

Douban stops at a few hundred results for most keywords.

## `subjectUrls` (type: `array`):

Full details of specific movies, TV series, books or albums. Accepts movie.douban.com/subject/…, book.douban.com/subject/…, music.douban.com/subject/… and m.douban.com links. A bare numeric ID is treated as a movie or TV series.

## `charts` (type: `array`):

Get the current entries of these Douban charts and lists.

## `maxPerChart` (type: `integer`):

The Top 250 charts have 250 entries, most other lists 10–300.

## `includeDetails` (type: `boolean`):

Add directors, cast, authors, genres, countries, release dates, synopsis, comment and review counts, the 1–5 star rating breakdown and watched / want-to-watch counts to subjects from search and charts. Uses two extra requests per subject. Subjects from 'Subject URLs' always have full details.

## `includeComments` (type: `boolean`):

Save the most popular short comments of every subject as separate rows (type = comment): text, star rating, votes, date, IP location and user. Works for movies, TV, books and music. Douban shows visitors who are not logged in the top 150 or so per movie or TV series, 100 per book and up to about 400 per album.

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

Comments are charged per row, so this also caps the cost per subject.

## `includeReviews` (type: `boolean`):

Save the most helpful long reviews of every subject as separate rows (type = review): title, text, star rating, helpful votes, read count, date and author.

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

Douban shows visitors who are not logged in the 40 or so most helpful reviews per subject.

## `fullReviewText` (type: `boolean`):

Get the complete text of each review (one extra request per review). When off, reviews have Douban's short abstract.

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

Douban limits how many pages one IP address can open, so Apify Proxy is on by default and the actor switches IP when Douban slows it down.

## Actor input object example

```json
{
  "searchQueries": [
    "流浪地球"
  ],
  "searchType": "movie",
  "maxResultsPerQuery": 10,
  "maxPerChart": 50,
  "includeDetails": false,
  "includeComments": false,
  "maxCommentsPerSubject": 20,
  "includeReviews": false,
  "maxReviewsPerSubject": 10,
  "fullReviewText": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All results are saved to the default dataset. Each item has `type`: `subject`, `comment` or `review`.

# 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 = {
    "searchQueries": [
        "流浪地球"
    ],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("china-data/douban-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 = {
    "searchQueries": ["流浪地球"],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "流浪地球"
  ],
  "maxResultsPerQuery": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call china-data/douban-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,china-data/douban-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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