# Douban Scraper 豆瓣 — Movie & Book Reviews, Comments \[From $2] (`memo23/douban-scraper`) Actor

Douban (豆瓣) scraper with no login: full-text movie, book and music reviews with stars, short comments with votes, and title search with scores, directors, cast and authors. Reviews $10 and comments $2 per 1,000.

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

## Pricing

from $10.00 / 1,000 reviews

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 豆瓣: Movie, Book & Music Reviews, Comments and Search

Scrape **Douban (豆瓣)**, China's largest site for movie, book and music ratings: full-text **reviews** (影评 / 书评 / 乐评) with stars and author, **short comments** (短评) with stars and helpful votes, and **title search** with the Douban score, year, directors, cast and authors. Paste a Douban link or type a title. No login, no cookies, no Chinese phone number.

![How the Douban Scraper works](https://api.apify.com/v2/key-value-stores/jWGzwFsnpZO6PEVdq/records/how-it-works-douban.png)

```json
{
  "subjectUrls": ["https://movie.douban.com/subject/1291546/", "https://book.douban.com/subject/2567698/"],
  "includeReviews": true,
  "includeComments": true
}
```

| Input | Rows |
|---|---|
| Movie, book or music link | About 20 of the most helpful reviews, full text |
| Book or music link | Up to 200 short comments with stars and votes |
| Search keyword | Matching titles with score, year, people and cover (books show up best; for a movie, paste its link) |
| Search keyword + `maxSubjectsFromSearch` | The titles, then reviews and comments of the top N |

### Why Use This Scraper?

- **Full review text.** Reviews come whole, not as a teaser: a median of 3,000 to 5,000 characters, the longest over 30,000.
- **Pay per row, low price.** $10 per 1,000 reviews and $2 per 1,000 short comments or search results. Empty answers are not charged.
- **No account needed.** Douban asks visitors for a login and a slider check; this actor needs neither.
- **Clean, typed rows.** Stars as 1-5 numbers with Douban's own label (力荐, 推荐, 还行, 较差, 很差), votes and reply counts as numbers, dates in ISO format.

### Use Cases

- **Audience research** for films, series, books and albums before a launch or a release in China.
- **Sentiment and opinion mining**: thousands of rated short comments per book, ready for NLP.
- **Competitive and brand monitoring** of how Chinese readers and viewers rate a title.
- **Training and evaluation data** for Chinese-language review models.
- **Academic research** on Chinese popular culture and reception.

### How It Works

1. Links in **Douban links** are read first: reviews and short comments, as switched on.
2. Each **search keyword** returns matching titles. With **Reviews and comments for the top search results** above 0, the top titles of each keyword get their reviews and comments too.
3. Three titles are worked on at once. Reviews take 45-90 seconds per title, comments 15-30 seconds.
4. Every row is charged as it is delivered, and the run stops cleanly at your spending limit.

### Input Configuration

| Field | Type | Description |
|---|---|---|
| `subjectUrls` | array | Douban movie, book or music links (desktop or m.douban.com). `movie:1292052` also works. |
| `includeReviews` | boolean | Long-form reviews. Default on. |
| `maxReviewsPerSubject` | integer | Default 20. Douban serves about 20 per title. |
| `includeComments` | boolean | Short comments. Default on. |
| `maxCommentsPerSubject` | integer | Default 100, maximum 200. |
| `searchKeywords` | array | Title search, Chinese or English. |
| `subjectType` | string | `all`, `movie`, `book` or `music`. Filters search results. |
| `maxResultsPerKeyword` | integer | Default 20. |
| `maxSubjectsFromSearch` | integer | Reviews and comments for the top N titles of each keyword. Default 0. |
| `maxItems` | integer | Cap on all rows. Default 1,000; free-plan runs return up to 100. |

#### Example input

Reviews and comments for a book, plus the top 3 movies for a keyword:

```json
{
  "subjectUrls": ["https://book.douban.com/subject/2567698/"],
  "searchKeywords": ["流浪地球"],
  "subjectType": "movie",
  "maxSubjectsFromSearch": 3,
  "maxCommentsPerSubject": 200
}
```

### Output Samples

A review:

```json
{
  "type": "review",
  "reviewId": "1342728",
  "url": "https://book.douban.com/review/1342728/",
  "subjectId": "2567698",
  "subjectType": "book",
  "subjectTitle": "三体",
  "title": "《三体》：当代史的科幻书写",
  "text": "评论刘慈欣的《三体》是件困难的事情，因为可以选择的角度太多……",
  "textLength": 3265,
  "stars": 4,
  "ratingLabel": "推荐",
  "replyCount": 268,
  "authorName": "胤祥",
  "authorUrl": "https://www.douban.com/people/yinxiang/",
  "postedAt": "2008-04-02T19:20:04+00:00"
}
```

A short comment:

```json
{
  "type": "comment",
  "commentId": "851912743",
  "subjectTitle": "三体",
  "subjectType": "book",
  "text": "论文笔的重要性。。。如何讲砸一个好故事。。。",
  "stars": 3,
  "ratingLabel": "还行",
  "votes": 980,
  "authorName": "张熊熊",
  "postedAt": "2014-10-07T09:02:08+00:00"
}
```

A search result:

```json
{
  "type": "subject",
  "subjectId": "26647087",
  "subjectType": "movie",
  "title": "三体",
  "rating": 8.7,
  "ratingScale": 10,
  "directors": ["杨磊"],
  "cast": ["张鲁一", "于和伟", "陈瑾", "王子文", "林永健"],
  "url": "https://movie.douban.com/subject/26647087/",
  "searchKeyword": "三体"
}
```

### Key Output Fields

| Field | Meaning |
|---|---|
| `type` | `subject`, `review` or `comment` |
| `stars` | 1-5, as shown on Douban; null when the writer gave none |
| `ratingLabel` | Douban's word for the stars: 力荐 5, 推荐 4, 还行 3, 较差 2, 很差 1 |
| `rating` | The title's Douban score out of 10 (search rows) |
| `votes` | "Helpful" votes on a short comment |
| `textLength` | Characters in the review text |
| `source` | `url` or `search`; search rows also carry `searchKeyword` |

### FAQ

**How many reviews do I get per title?**
About 20, the ones Douban ranks as most helpful. Asking for more does not return more.

**Why are there no short comments for movies?**
Douban is not serving movie short comments right now. Book and music comments work. Movies return reviews; their empty comment calls are not charged, and the run log says so. They will come back on their own when Douban serves them again.

**Does search find movies?**
Not reliably. Douban's search answers books best: a movie title often returns only the book of the same name, and English titles return nothing. For a movie or an album, paste its Douban link (the number in movie.douban.com/subject/<number>/), which always works.

**Can I search by director or actor?**
No, search matches titles only.

**Do I need a Douban account or cookies?**
No.

**Are empty results charged?**
No. You pay only for rows delivered.

### Pricing

| Event | When | Price |
|---|---|---|
| Actor start | Once per run (per GB of memory, 256 MB default) | $0.005 |
| Review | Each long-form review | $0.01 |
| Short comment | Each short comment | $0.002 |
| Search result | Each title from a search | $0.002 |

Example: reviews and 100 comments for 10 books cost about 10 × (20 × $0.01 + 100 × $0.002) = $4.00.

### Support

Found a bug or need a field? Open an issue on the actor's Issues tab and include the run link.

### Explore More Scrapers

More Chinese platforms from the same author: Weibo, Zhihu, Bilibili, Xiaohongshu (RedNote), Douyin, WeChat articles and WeChat Channels.

### ⚠️ Disclaimer

This actor reads public pages of Douban. It is not affiliated with or endorsed by Douban. You are responsible for using the data in line with Douban's terms, copyright and the privacy laws that apply to you, including China's PIPL and the GDPR where relevant. Reviews and comments are written by Douban users and remain their work.

### SEO Keywords

Douban scraper, 豆瓣爬虫, Douban API, Douban reviews, 豆瓣影评, 豆瓣书评, 豆瓣短评, Douban movie reviews scraper, Douban book reviews, Douban comments, Chinese movie ratings, Chinese book reviews, Douban rating data, Douban sentiment analysis, Douban data export

# Actor input Schema

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

Movie, book or music pages: `https://movie.douban.com/subject/1292052/`, `https://book.douban.com/subject/2567698/`, `https://music.douban.com/subject/1403307/` (mobile m.douban.com links work too). Each returns its reviews and short comments.

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

Long-form reviews with the full text, title, 1-5 stars, author and date. Douban serves about 20 of the most helpful reviews per title.

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

Douban serves about 20 per title, so higher values rarely return more.

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

Short comments with 1-5 stars, helpful votes, author and date. Books and music: up to 200 per title. Movie short comments are not available right now; they are skipped and not charged.

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

Default 100, maximum 200. Free-plan runs read up to 50.

## `searchKeywords` (type: `array`):

Find titles by name, in Chinese. Books show up best; movie and music titles often return only the book of the same name, so for a movie or an album paste its link above instead. Each keyword returns the Douban score, year, directors, cast and authors.

## `subjectType` (type: `string`):

Keep only this kind of title in search results.

## `maxResultsPerKeyword` (type: `integer`):

Default 20.

## `maxSubjectsFromSearch` (type: `integer`):

Also read reviews and comments (as switched on above) for this many top titles of each keyword. 0 returns the titles only.

## `maxItems` (type: `integer`):

Cap on all rows together (titles, reviews, comments). Free-plan runs return up to 100.

## Actor input object example

```json
{
  "subjectUrls": [
    "https://movie.douban.com/subject/1291546/",
    "https://book.douban.com/subject/2567698/"
  ],
  "includeReviews": true,
  "maxReviewsPerSubject": 20,
  "includeComments": true,
  "maxCommentsPerSubject": 100,
  "searchKeywords": [
    "三体"
  ],
  "subjectType": "all",
  "maxResultsPerKeyword": 20,
  "maxSubjectsFromSearch": 0,
  "maxItems": 1000
}
```

# Actor output Schema

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

Rows told apart by `type`: `subject`, `review` and `comment`.

# 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 = {
    "subjectUrls": [
        "https://movie.douban.com/subject/1291546/",
        "https://book.douban.com/subject/2567698/"
    ],
    "searchKeywords": [
        "三体"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "subjectUrls": [
        "https://movie.douban.com/subject/1291546/",
        "https://book.douban.com/subject/2567698/",
    ],
    "searchKeywords": ["三体"],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "subjectUrls": [
    "https://movie.douban.com/subject/1291546/",
    "https://book.douban.com/subject/2567698/"
  ],
  "searchKeywords": [
    "三体"
  ]
}' |
apify call memo23/douban-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/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/wrTZizjSAWHx9ZdyY/builds/eOhsWsrqYglS70c2U/openapi.json
