# Douban Scraper – Movies, Books, Ratings, Comments & Reviews (`openharvest/douban-scraper`) Actor

Douban scraper for movies, TV shows and books without login: ratings and star distribution, short comments, full reviews, Top 250 and real-time hot lists, keyword search, cast, authors and publishers. Pay per result, no user profiles.

- **URL**: https://apify.com/openharvest/douban-scraper.md
- **Developed by:** [Enes Bulanık](https://apify.com/openharvest) (community)
- **Categories:** Social media, Videos, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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, Ratings, Comments & Reviews

Douban scraper for movies, TV shows and books, no login needed. It returns ratings with the 1–5 star distribution, short comments (短评), full-text reviews (影评 / 书评), the Top 250 and real-time hot lists, and keyword search results. Use it instead of a general web crawler when you need structured data from Douban (豆瓣): the desktop site sends crawlers to a `sec.douban.com` challenge page, and this Actor reads Douban's public mobile JSON instead.

**Price: $3 per 1,000 subjects, $2 per 1,000 reviews, $1 per 1,000 short comments.** You are never charged for errors.

### What data do you get?

- **Movies & TV**: title, original title, year, directors, cast, genres, countries, languages, release dates, runtime, also-known-as titles, episode count, intro, cover image
- **Books**: title, subtitle, authors, translators, publisher, publish date, pages, price, author intro, table of contents
- **Ratings**: Douban score (0–10), number of ratings, **percentage of 5/4/3/2/1-star ratings**, and how many users watched/read it, are watching/reading it, or want to
- **Chart positions**: e.g. `豆瓣电影Top250 #1`, plus the rank on any hot list you scrape
- **Short comments (短评)**: text, the commenter's star rating, helpful votes, date, and status (watched / watching / want to watch), most helpful first
- **Reviews (影评 / 书评)**: headline, full plain-text body, star rating, useful/useless votes, replies, reshares, reads, spoiler flag, date, URL
- **Hot lists**: real-time hot movies and TV, weekly best, now showing, coming soon, Top 250 movies, Top 250 books, popular / fiction / non-fiction / bestselling books, Chinese, US, Korean and Japanese series, animation and variety shows
- **Search**: keyword search for movies & TV or books

**No user data:** the Actor never saves usernames, user IDs, avatars, profile links or locations. Comments and reviews contain only the text, the rating and engagement counts.

### Use cases

- **Film & publishing market research**: track how Chinese audiences rate a title, compare star distributions, and watch the hot charts every hour or every day.
- **Sentiment analysis**: score the most helpful short comments and reviews of a movie, series or book, split by star rating.
- **Localization & distribution decisions**: see what is trending in Chinese cinemas, TV and bookstores before licensing or translating.
- **Recommendation & catalog enrichment**: add Douban scores, genres, cast and Top 250 positions to your own movie or book catalog.
- **Academic research**: build small, documented datasets of public reviews for media studies. This Actor is not meant for bulk LLM-corpus harvesting.

### How to scrape Douban

1. Click **Try for free** / **Start**.
2. Paste Douban links into **Douban subjects** (`https://movie.douban.com/subject/1292052/`, `https://book.douban.com/subject/1084336/`), and/or pick **Hot lists & charts**, and/or type **Search keywords**.
3. Set how many **short comments** and **reviews** you want per subject.
4. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or use them through the Apify API and integrations.

### Input

| Field | Type | Description |
|---|---|---|
| `subjects` | array of strings | Douban movie, TV or book links, or IDs (`1292052`, `book:1084336`, `tv:36449295`). |
| `hotLists` | array of enums | Charts such as `movie_real_time_hotest`, `movie_top250`, `tv_real_time_hotest`, `book_top250`, `book_hot`. |
| `searchQueries` | array of strings | Keywords, in Chinese or English. |
| `searchType` | `movie` | `book` | What the search looks for. `movie` also returns TV shows. Default `movie`. |
| `maxSubjectsPerList` | integer | Subjects taken from each hot list or search. Default `10`. |
| `fetchDetails` | boolean | Full details and star distribution for list/search results. Default `true`. |
| `maxCommentsPerSubject` | integer | Short comments per subject, most helpful first. Default `20`, `0` = none. |
| `maxReviewsPerSubject` | integer | Reviews per subject, most helpful first. Default `5`, `0` = none. |
| `fullReviewText` | boolean | Download the complete review body, not just the abstract. Default `true`. |
| `requestDelaySecs` | integer | Pause between requests. Default `2`. |
| `proxyConfiguration` | object | Optional. Use Apify Proxy (residential) for large runs. |

Example input:

```json
{
    "subjects": ["https://movie.douban.com/subject/1292052/", "https://book.douban.com/subject/1084336/"],
    "hotLists": ["movie_real_time_hotest"],
    "maxSubjectsPerList": 10,
    "maxCommentsPerSubject": 20,
    "maxReviewsPerSubject": 3
}
```

If you leave every field empty, the Actor scrapes the real-time hot movie chart as a quick demo.

### Output

Every dataset row has a `type`: `subject`, `comment`, `review` or `error`. These are real rows from a test run (long texts shortened):

**Subject (movie)**

```json
{
    "type": "subject",
    "subjectId": "1292052",
    "subjectType": "movie",
    "title": "肖申克的救赎",
    "originalTitle": "The Shawshank Redemption",
    "year": "1994",
    "url": "https://movie.douban.com/subject/1292052/",
    "rating": 9.7,
    "ratingCount": 3348791,
    "star5Percent": 85.4,
    "star4Percent": 13,
    "star3Percent": 1.4,
    "star2Percent": 0.1,
    "star1Percent": 0.1,
    "doneCount": 5750921,
    "doingCount": 95,
    "wishCount": 519936,
    "commentCount": 667875,
    "reviewCount": 14972,
    "genres": ["剧情", "犯罪"],
    "honors": ["豆瓣电影Top250 #1"],
    "directors": ["弗兰克·德拉邦特"],
    "actors": ["蒂姆·罗宾斯", "摩根·弗里曼", "鲍勃·冈顿", "..."],
    "countries": ["美国"],
    "languages": ["英语"],
    "durations": ["142分钟"],
    "aka": ["月黑高飞(港)", "刺激1995(台)", "..."],
    "intro": "一场谋杀案使银行家安迪（蒂姆·罗宾斯 Tim Robbins 饰）蒙冤入狱……",
    "coverUrl": "https://img3.doubanio.com/view/photo/m_ratio_poster/public/p2934829882.jpg",
    "detailsFetched": true,
    "source": "subject"
}
```

**Subject (book)**: the same rating fields, plus `authors`, `translators`, `publisher` (`人民文学出版社`), `pages` (`97`), `price` (`22.00元`), `authorIntro` and `catalog`.

**Short comment**

```json
{
    "type": "comment",
    "subjectId": "1292052",
    "subjectType": "movie",
    "subjectTitle": "肖申克的救赎",
    "commentId": "32514679",
    "stars": 5,
    "text": "恐惧让你沦为囚犯，希望让你重获自由。——《肖申克的救赎》",
    "createdAt": "2008-02-27T13:43:23.000Z",
    "voteCount": 26503,
    "status": "done",
    "url": "https://movie.douban.com/subject/1292052/"
}
```

**Review**

```json
{
    "type": "review",
    "subjectId": "1292052",
    "subjectTitle": "肖申克的救赎",
    "reviewId": "1000369",
    "title": "十年·肖申克的救赎",
    "stars": 5,
    "abstract": "距离斯蒂芬·金（Stephen King）和德拉邦特（Frank Darabont）们缔造这部伟大的作品已经有十年了……",
    "text": "距离斯蒂芬·金（Stephen King）和德拉邦特（Frank Darabont）们缔造这部伟大的作品已经有十年了。……(full text)",
    "isFullText": true,
    "spoiler": false,
    "createdAt": "2005-05-12T12:44:13.000Z",
    "usefulCount": 18954,
    "uselessCount": 735,
    "commentsCount": 1082,
    "resharesCount": 2202,
    "readCount": 1428502,
    "url": "https://movie.douban.com/review/1000369/"
}
```

**Error (free)**

```json
{
    "type": "error",
    "input": "99999999",
    "errorCode": "NOT_FOUND",
    "error": "Douban subject 99999999 was not found (deleted, restricted, or not a movie/TV/book subject)."
}
```

Possible `errorCode` values: `INVALID_INPUT`, `NOT_FOUND`, `LIST_NOT_FOUND`, `NO_RESULTS`, `BLOCKED`, `SCRAPE_FAILED`.

All dates are ISO 8601 in UTC. Douban's own timestamps are China Standard Time (UTC+8) and are converted. The dataset has ready-made views: **Overview**, **Movies, TV & books**, **Short comments** and **Reviews**.

### Pricing

This Actor uses **pay-per-event** pricing, so you pay only for the rows you get. Platform usage is included.

| Event | Price | When it is charged |
|---|---|---|
| `subject` | **$0.003** per subject ($3 / 1,000) | Each movie, TV show or book row |
| `review` | **$0.002** per review ($2 / 1,000) | Each review row (full text included) |
| `comment` | **$0.001** per short comment ($1 / 1,000) | Each short-comment row |
| Errors | **Free** | Invalid links, missing subjects, blocked requests |

Examples:

| Job | Cost |
|---|---|
| 2 subjects + 20 short comments + 3 reviews each | 2 × $0.003 + 40 × $0.001 + 6 × $0.002 = **$0.058** |
| Douban Top 250 movies with full details | 250 × $0.003 = **$0.75** |
| 100 hot books, 40 reviews each | $0.30 + 4,000 × $0.002 = **$8.30** |

Tip: set **Max cost per run** in the run options. The Actor stops cleanly when your budget is reached.

### Use with AI agents (MCP)

AI agents can use this Actor as a tool through the Apify MCP server. Add it as `openharvest/douban-scraper` in the Apify MCP server's tool list, or let the agent find it by searching the Apify Store for "douban".

Example input an agent can send to answer "How do Chinese viewers rate the movie Interstellar, and what do they say about it?":

```json
{
    "searchQueries": ["星际穿越"],
    "searchType": "movie",
    "maxSubjectsPerList": 1,
    "maxCommentsPerSubject": 30,
    "maxReviewsPerSubject": 3
}
```

The agent then reads `rating`, the `star*Percent` fields and the comment `text` / `stars`. A run like this takes about 20 seconds and costs about $0.04.

### FAQ

**Do I need a Douban account or cookies?**
No. The Actor uses only public data that Douban's mobile site shows to visitors who are not logged in.

**How many short comments and reviews can I get per subject?**
Douban limits what logged-out visitors can see. In our tests that was roughly the **150 most helpful short comments per movie or TV show (about 100 per book)** and the **40 most helpful reviews** per subject, even for titles with hundreds of thousands. The newest-first order needs a login, so it is not offered. If you ask for more, the Actor returns all that Douban shows and charges only for those.

**Does it support TV shows?**
Yes. TV series and variety shows are returned with `subjectType: "tv"` and `episodesCount`. Use `tv:<id>` or a `m.douban.com/tv/subject/<id>/` link, or a normal `movie.douban.com/subject/<id>/` link.

**Why is the rating null for some titles?**
Douban hides the score until a title has enough ratings. Those rows have `rating: null` and, when Douban provides one, a `ratingNote`.

**Will I get blocked?**
Douban bans IPs that send requests too fast. The Actor sends one request at a time, waits 2 seconds between requests by default, and backs off and slows down automatically when Douban starts throttling. For large runs (hundreds of subjects or thousands of comments), enable **Apify Proxy → Residential**. If Douban keeps blocking, the Actor stops early with a free `BLOCKED` row, so you don't pay for an empty run.

**How long does a run take?**
About 2 seconds per request. One subject with details is 2 requests. Short comments take 1 request per 50, reviews 1 request per 20, and each full review text is 1 more request.

**Can I run it on a schedule?**
Yes. Use Apify Schedules, for example every hour with `hotLists: ["movie_real_time_hotest"]` to track the real-time chart.

### Is it legal to scrape Douban?

This Actor only reads **publicly available** information that Douban shows to anyone without logging in. It does not log in, bypass captchas or access private content, and it **does not collect personal data**: usernames, user IDs, avatars and locations are removed. Douban's terms of service restrict automated access, and comments and reviews are copyrighted by their authors. Use the data for analysis and research rather than republishing, keep volumes moderate, and make sure your use complies with Douban's terms and with the laws that apply to you (for example China's PIPL and the GDPR). If you are unsure, consult a lawyer.

### Related actors

Other actors by the same developer:

- Bilibili Scraper – Videos, Search, Rankings, Comments & Danmaku
- Steam Reviews & Games Scraper – Prices, Players & Top Sellers
- Google Play Reviews Scraper – Apps, Search & Top Charts
- App Store Reviews Scraper – iOS Apps, Search & Top Charts
- Telegram Channel Scraper – Posts, Messages & Views, No Login

### Support & feedback

Found a bug or a missing field? Open an issue in the **Issues** tab with the Douban link.

# Actor input Schema

## `subjects` (type: `array`):

Movie, TV or book pages. Accepted formats: <code>https://movie.douban.com/subject/1292052/</code>, <code>https://book.douban.com/subject/1084336/</code>, <code>https://m.douban.com/movie/subject/1292052/</code>, <code>book:1084336</code> or a plain ID like <code>1292052</code> (movie is tried first, then book).

## `hotLists` (type: `array`):

Douban rankings to scrape: real-time hot movies/TV, weekly best, now showing, Top 250 movies and books, hot books and more. Each subject on the list becomes one result.

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

Optional. Search Douban by keyword (Chinese or English titles, names). Each query returns up to <i>Max subjects per list / search</i> results.

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

What the keyword search looks for. <code>movie</code> also returns TV shows.

## `maxSubjectsPerList` (type: `integer`):

Maximum number of subjects taken from each hot list and each search keyword. Top 250 lists have 250 entries.

## `fetchDetails` (type: `boolean`):

On: every subject from a hot list or search gets full details (cast, directors, authors, publisher, intro, aka, star distribution, wish/done counts) - 2 extra requests each. Off: only the fields shown on the list (title, rating, cover, short info). Subjects given by link always get full details.

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

Short comments (one-line reviews with star rating and helpful votes), most helpful first. 0 = none. Without login Douban only shows roughly the top 150 per movie/TV show and about 100 per book.

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

Long reviews, most helpful first. 0 = none. Without login Douban only shows roughly the top 40 per subject.

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

On: download the complete text of every review (1 extra request per review). Off: only the ~150-character abstract.

## `requestDelaySecs` (type: `integer`):

Pause between requests to Douban. Douban bans IPs that go too fast - the default 2 seconds is safe; raise it if you see BLOCKED errors. With a rotating proxy you can lower it to 1.

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

Optional. Small runs work without a proxy. For large runs, or if you see BLOCKED errors, enable Apify Proxy (RESIDENTIAL, ideally country CN or HK/TW).

## Actor input object example

```json
{
  "subjects": [
    "https://movie.douban.com/subject/1292052/",
    "https://book.douban.com/subject/1084336/",
    "tv:36449295"
  ],
  "hotLists": [
    "movie_real_time_hotest",
    "book_top250"
  ],
  "searchQueries": [
    "三体",
    "Interstellar"
  ],
  "searchType": "movie",
  "maxSubjectsPerList": 10,
  "fetchDetails": true,
  "maxCommentsPerSubject": 20,
  "maxReviewsPerSubject": 5,
  "fullReviewText": true,
  "requestDelaySecs": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped items in the default dataset (JSON, CSV, Excel and more via the dataset export).

## `files` (type: `string`):

Records saved in the default key-value store, e.g. the run summary.

# 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 = {
    "subjects": [
        "https://movie.douban.com/subject/1292052/",
        "https://book.douban.com/subject/1084336/"
    ],
    "maxCommentsPerSubject": 20,
    "maxReviewsPerSubject": 3,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("openharvest/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 = {
    "subjects": [
        "https://movie.douban.com/subject/1292052/",
        "https://book.douban.com/subject/1084336/",
    ],
    "maxCommentsPerSubject": 20,
    "maxReviewsPerSubject": 3,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("openharvest/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 '{
  "subjects": [
    "https://movie.douban.com/subject/1292052/",
    "https://book.douban.com/subject/1084336/"
  ],
  "maxCommentsPerSubject": 20,
  "maxReviewsPerSubject": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call openharvest/douban-scraper --silent --output-dataset

```

## MCP server setup

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