# Douban Scraper - 豆瓣 Movie & Book Reviews, Comments, No Login (`reportable_broth/douban-scraper`) Actor

Analyze Chinese audience opinion on movies, TV, books and music. Douban (豆瓣) scraper, no login: short comments with star ratings, full-text long reviews with author and date, subject info and search. Paste subject URLs or search. From $4.49 per 1,000 comments.

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

## Pricing

from $4.49 / 1,000 short comments

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 Reviews, Comments, No Login

Scrape **Douban (豆瓣)**, China's biggest movie, TV, book and music review community, without a login, cookies or an account. Paste subject URLs or search, and get short comments with star ratings, **full-text long reviews**, subject info and search results as clean JSON, CSV or Excel.

### Quick start

Runs as-is with this input (the same input Apify tests daily):

```json
{
  "subjectUrls": [
    "https://movie.douban.com/subject/1292052/"
  ]
}
```

Main output fields: `subjectTitle`, `stars`, `text`, `votes`, `createdAt`, `ipLocation`, `user`, `type`, `title`, `usefulCount`, `url`, `query`, `rank`, `year`, `rating`, `ratingCount`, `subjectType`.

Price: Short comment: $4.49 per 1,000; Long review: $24.99 per 1,000; Search result: $4.49 per 1,000. Pay only for results delivered.

Run it from code and get the results in one call: `POST https://api.apify.com/v2/acts/reportable_broth~douban-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input above as the JSON body.

### What does Douban Scraper do?

- **Short comments (短评)** for movies, TV series, books and music: text, 1-5 stars, likes, date, IP location and user. **Movies included.**
- **Long reviews (影评 / 书评) in full**, not just the excerpt: title, complete text (often 1,000-5,000 characters), stars, useful votes, reply count, date and author.
- **Subject info**: title, original title, year, Douban rating and rating count, genres, countries, directors, actors, authors, publisher, intro, and Douban's total comment and review counts. Free.
- **Search** movies/TV or books by title, person or keyword, then optionally pull comments and reviews for the top results in the same run.
- **Review URLs** too: paste a `…/review/123/` link and get that review's full text.
- **Monitor mode**: `onlyNew` remembers what you already got, so a scheduled run returns only new comments and reviews.

### What can I use it for?

- Chinese audience reaction to a film, series or book release
- Star-rated Chinese text for sentiment analysis and LLM fine-tuning
- Brand and IP research in the Chinese market
- Comparing how Chinese and Western audiences rate the same titles

### How do I use it?

1. Paste one or more Douban URLs into **Douban URLs**, for example `https://movie.douban.com/subject/1292052/` or `https://book.douban.com/subject/2567698/`. Or type a title into **Search queries**.
2. Set how many short comments and long reviews you want per subject.
3. Run it, then export the dataset as JSON, CSV or Excel.

### Input example

```json
{
  "subjectUrls": ["https://movie.douban.com/subject/1292052/"],
  "searchQueries": ["三体"],
  "searchType": "movie",
  "scrapeTopSearchResults": 2,
  "maxComments": 100,
  "maxReviews": 20,
  "fullReviewText": true
}
```

### Input

| Field | Default | What it does |
|---|---|---|
| `subjectUrls` | | Movie, TV, book or music URLs, or review URLs |
| `searchQueries` | | Titles, people or keywords to search |
| `searchType` | `movie` | `movie` (includes TV) or `book` |
| `maxSearchResults` | `20` | Results per query |
| `scrapeTopSearchResults` | `0` | Also pull comments/reviews for the top N results |
| `maxComments` | `100` | Short comments per subject (0 = skip) |
| `maxReviews` | `20` | Long reviews per subject (0 = skip) |
| `fullReviewText` | `true` | Full review text instead of the excerpt |
| `includeSubjectInfo` | `true` | One free info row per subject |
| `onlyNew` | `false` | Skip items returned in earlier runs with the same input |
| `proxyConfiguration` | residential | Responses are small JSON, so proxy usage is tiny |

### What data do I get?

Every row has a `type`: `subject`, `comment`, `review` or `search_result`.

Short comment:

```json
{
  "type": "comment",
  "subjectTitle": "肖申克的救赎",
  "text": "恐惧让你沦为囚犯，希望让你重获自由。——《肖申克的救赎》",
  "stars": 5,
  "votes": 26484,
  "status": "done",
  "createdAt": "2008-02-27 21:43:23",
  "user": {"name": "如小果", "id": "...", "location": "..."}
}
```

Long review:

```json
{
  "type": "review",
  "subjectTitle": "肖申克的救赎",
  "title": "十年·肖申克的救赎",
  "text": "距离斯蒂芬·金（Stephen King）和德拉邦特（Frank Darabont）们缔造这部伟大的作品已经有十年了……",
  "isFullText": true,
  "stars": 5,
  "usefulCount": 18953,
  "commentsCount": 1082,
  "createdAt": "2005-05-12 20:44:13",
  "url": "https://movie.douban.com/review/1000369/"
}
```

`status` on comments is `done` (watched/read), `doing` (watching/reading) or `mark` (wants to). `stars` is `null` when the user didn't rate.

### How much does it cost?

Pay per result:

| Result | Price |
|---|---|
| Short comment | $4.49 per 1,000 |
| Long review (full text) | $24.99 per 1,000 |
| Search result | $4.49 per 1,000 |
| Subject info row | free |

100 short comments plus 20 full reviews for one film costs about $0.95.

### Limits

- **Douban shows logged-out visitors about 100-150 short comments and about 40 long reviews per subject**, sorted by popularity. That's what you get. Newest-first sorting needs a login on Douban, so it isn't offered.
- Some restricted subjects need a Douban login and are skipped with a note in the log.
- Group (小组) discussions mostly sit behind Douban's login wall and aren't supported.

### FAQ

#### Do I need a Douban account or cookies?

No. Nothing to log in, nothing to get banned.

#### Why only ~150 comments when the film has 600,000?

Douban only serves the most popular ~150 short comments and ~40 reviews to visitors who aren't logged in. The scraper returns all of those.

#### Can I run it on a schedule?

Yes. Turn on `onlyNew` and schedule it in Apify, and each run returns only new comments and reviews.

#### Can I call it from the API, Make, n8n or an AI agent?

Yes, like any Apify actor: REST API, Python and JavaScript clients, webhooks, Make, n8n, Zapier and MCP.

### Other scrapers I made

- [WeChat Official Account Scraper](https://apify.com/reportable_broth/wechat-official-account-scraper) - 公众号 articles, full text
- [Weibo Scraper](https://apify.com/reportable_broth/weibo-scraper)
- [Bilibili Scraper](https://apify.com/reportable_broth/bilibili-scraper)
- [Douyin Scraper](https://apify.com/reportable_broth/douyin-scraper)

# Actor input Schema

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

Movie, TV, book or music pages (e.g. https://movie.douban.com/subject/1292052/, https://book.douban.com/subject/2567698/). Review URLs (…/review/1000369/) return that review's full text.

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

Search Douban by title, person or keyword, e.g. 三体, 宫崎骏, 村上春树.

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

Movies (includes TV series) or books.

## `maxSearchResults` (type: `integer`):

Each result is one row with title, year, rating, rating count and link.

## `scrapeTopSearchResults` (type: `integer`):

0 = search results only. 3 = also pull comments and reviews (per the settings below) for the first 3 results of each query.

## `maxComments` (type: `integer`):

Short comments (短评) with star rating, likes, date and user, sorted by Douban's 'hot' order. Douban shows logged-out visitors about 100-150 per subject. 0 = skip.

## `maxReviews` (type: `integer`):

Long reviews (影评/书评). Douban shows logged-out visitors about 40 per subject. 0 = skip.

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

Open each review for the complete text (often 1,000-5,000 characters) instead of the short excerpt. One extra request per review.

## `includeSubjectInfo` (type: `boolean`):

One free row per movie/book with title, rating, rating count, genres, directors/authors, intro and Douban's total comment/review counts.

## `onlyNew` (type: `boolean`):

Remember comments and reviews from earlier runs with the same input and skip them. Use with a schedule to track new reactions to a film or book.

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

Residential recommended. Responses are small JSON, so proxy traffic is tiny.

## `requestGapSecs` (type: `string`):

Politeness delay. Raise it if you see many retries in the log.

## Actor input object example

```json
{
  "subjectUrls": [
    "https://movie.douban.com/subject/1292052/"
  ],
  "searchType": "movie",
  "maxSearchResults": 20,
  "scrapeTopSearchResults": 0,
  "maxComments": 100,
  "maxReviews": 20,
  "fullReviewText": true,
  "includeSubjectInfo": true,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "requestGapSecs": "0.8"
}
```

# Actor output Schema

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

No description

# 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/1292052/"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("reportable_broth/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/1292052/"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("reportable_broth/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/1292052/"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call reportable_broth/douban-scraper --silent --output-dataset

```

## MCP server setup

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