# Douban Movie Scraper: Reviews (`maximedupre/douban-scraper`) Actor

Collect public Douban data without a Douban login or API key. Search movie, TV, or book subjects by keyword, or add public URLs for media, people, collections, and group topics, then collect metadata, reviews, or comments. Save available ratings, authors, dates, links, and available replies.

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

## Pricing

from $2.15 / 1,000 subject metadata

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 data for media research

For media researchers and data teams, Douban Scraper collects public Douban data as structured dataset rows. Choose one keyword or add public URLs, then work with subject metadata, people profiles, long-form reviews, short comments, collections, current lists, and group topics. Available ratings, dates, authors, source links, and replies give you useful rows for Chinese media and public discussion research.

The Actor reads public pages only. It does not bypass private or login-walled content. Returned text stays in the source language.

**Use it to:**

- Use **[Douban trending scraper](https://apify.com/maximedupre/douban-scraper/examples/douban-trending-scraper)** to review current movie and TV hot or ranking lists.
- Use **[Douban metadata scraper](https://apify.com/maximedupre/douban-scraper/examples/douban-metadata-scraper)** to collect identity, ratings, and source links for supported media subjects.
- Use **[Douban comments scraper](https://apify.com/maximedupre/douban-scraper/examples/douban-comments-scraper)** to save short comments with ratings and author context.
- Use **[Douban reviews scraper](https://apify.com/maximedupre/douban-scraper/examples/douban-reviews-scraper)** to save long-form reviews with text, ratings, and engagement data.
- Use **[Douban TV scraper](https://apify.com/maximedupre/douban-scraper/examples/douban-tv-scraper)** to collect TV subject rows and available metadata.
- Use **[Douban book scraper](https://apify.com/maximedupre/douban-scraper/examples/douban-book-scraper)** to collect book subject rows and available metadata.
- Use **[Douban movie scraper](https://apify.com/maximedupre/douban-scraper/examples/douban-movie-scraper)** to collect movie subject rows with ratings and source links.

#### 📦 What this Douban scraper returns

The dataset uses one row for each successful public source item. A run can return subject, person, review, comment, or group topic rows. Fields can be absent when the public page does not provide them.

**Record types**

| Record type | Use it for | Main data |
| --- | --- | --- |
| `subject` | Movie, TV, book, or music subjects | Identity, ratings, engagement, credits, awards, and source links |
| `person` | Public people profiles | Names, aliases, birth details, occupations, biography, followers, and known-for titles |
| `review` | Long-form reviews | Source-language text, ratings, author context, engagement, and publication time |
| `comment` | Short comments | Source-language text, ratings, author context, engagement, and publication time |
| `groupTopic` | Public group discussions | Topic text, author, times, reply totals, and available replies |

When the same source item appears through another submitted value, only the first eligible occurrence is saved. When present, `discoverySource` shows the one keyword or URL that caused that row to be saved. Later matches do not rewrite that row.

#### ▶️ Run a Douban collection

**Quick start**

1. Choose a target such as Search media subjects, Subject metadata, Long-form reviews, or Group topics.
2. Fill in the fields for that target. Add one keyword for subject search, or add the matching public Douban URLs.
3. Set a positive `maxItems` value for a bounded run, or leave it empty to return all available results until the public source is exhausted.
4. Run the Actor, open the dataset, and export the rows or use the dataset link in your workflow.

Only fields for the selected target are used. A failed or unavailable public target is not turned into a made-up successful row.

#### ⚙️ Input

Choose one target. The fields below list every public input field, including the URL field inside each URL list.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Choose one target: Search media subjects, Subject metadata, Collections and charts, Hot and ranking lists, People profiles, Long-form reviews, Short comments, or Group topics. |
| `keyword` | string | For Search media subjects, enter one keyword. Douban can return movie, TV, or book subjects. Other targets ignore this field. |
| `mediaType` | string | For Search media subjects, choose `all`, `movie`, `tv`, or `book`. Other targets ignore this field. |
| `collectionUrls` | array of objects | For Collections and charts, add one or more public Douban collection or chart URLs. Other targets ignore this list. |
| `collectionUrls[].url` | string | One public Douban collection or chart URL. |
| `listType` | string | For Hot and ranking lists, choose `movieHot`, `movieRanking`, `tvHot`, or `tvRanking`. Other targets ignore this field. |
| `personUrls` | array of objects | For People profiles, add one or more public Douban person profile URLs. Other targets ignore this list. |
| `personUrls[].url` | string | One public Douban person profile URL. |
| `includeFullText` | boolean | For Long-form reviews, include the complete review body when this is on. Other targets ignore this setting. |
| `groupTopicUrls` | array of objects | For Group topics, add one or more public Douban group topic URLs. The Actor also returns available replies. Other targets ignore this list. |
| `groupTopicUrls[].url` | string | One public Douban group topic URL. |
| `subjectUrls` | array of objects | For Subject metadata, Long-form reviews, or Short comments, add one or more public Douban subject URLs. The Actor returns the data for the selected target. Other targets ignore this list. |
| `subjectUrls[].url` | string | One public Douban movie, TV, book, or music subject URL. |
| `reviewCommentOrder` | string | For Long-form reviews, only `popular` is supported. For Short comments, choose `popular`, `useful`, or `newest`. Other targets ignore this field. |
| `onlyNewItems` | boolean | On repeat runs, return only records not seen before for the same target and submitted values. Leave this off to return all available records. |
| `maxItems` | integer | Optional work limit for results. Leave it empty to return all available results until the public source is exhausted. If set, the Actor stops after that many results. This is a work limit, not a page number. |

The target is prefilled with `searchSubjects`. The search media type defaults to `all`. Full review text and new-item-only mode are off by default.

**Example input**

This is the public input from a successful run using the prefilled search target.

```json
{
  "target": "searchSubjects",
  "keyword": "流浪地球",
  "mediaType": "all",
  "includeFullText": false,
  "onlyNewItems": false
}
```

#### 🧾 Output

The `results` output link opens the dataset view for successful rows from the run. The dataset can contain more than one record type when the selected target produces different public source items.

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | string | Link to the successful Douban rows in the run dataset. |

**Subject rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `subject` for this shape. |
| `subjectId` | string | Stable Douban ID for the subject. |
| `subjectUrl` | string | Canonical public Douban URL for the subject. |
| `subjectKind` | string | Subject kind: `movie`, `tv`, `book`, or `music`. |
| `title` | string | Public title of the subject. |
| `originalTitle` | string | Original title when Douban provides one. |
| `aliases` | array of strings | Other titles listed by Douban. |
| `releaseDate` | string | Release date when Douban provides one. |
| `releaseYear` | integer | Release year when Douban provides one. |
| `coverUrl` | string | Public cover image URL when available. |
| `genres` | array of strings | Genres listed by Douban. |
| `countries` | array of strings | Countries or regions listed by Douban. |
| `runtimeMinutes` | integer | Running time in minutes when available. |
| `rating` | object | Available subject rating data. |
| `rating.value` | number | Average rating value listed by Douban. |
| `rating.scale` | number | Maximum value of the rating scale. |
| `rating.count` | integer | Total number of ratings listed by Douban. |
| `rating.distribution` | object | Available five-star rating distribution. |
| `rating.distribution.oneStar` | number | Value for one-star ratings. |
| `rating.distribution.twoStar` | number | Value for two-star ratings. |
| `rating.distribution.threeStar` | number | Value for three-star ratings. |
| `rating.distribution.fourStar` | number | Value for four-star ratings. |
| `rating.distribution.fiveStar` | number | Value for five-star ratings. |
| `engagement` | object | Audience totals listed by Douban. |
| `engagement.commentCount` | integer | Total comments listed by Douban. |
| `engagement.reviewCount` | integer | Total long-form reviews listed by Douban. |
| `engagement.watchedCount` | integer | Watched total listed by Douban when available. |
| `engagement.wishToWatchCount` | integer | Wish-to-watch total listed by Douban when available. |
| `credits` | array of objects | Directors, writers, cast, and other crew listed by Douban. |
| `credits[].creditType` | string | Credit type: `director`, `writer`, `cast`, or `crew`. |
| `credits[].name` | string | Credited person's name. |
| `credits[].personId` | string | Douban ID for the credited person when available. |
| `credits[].personUrl` | string | Public Douban profile URL for the credited person when available. |
| `credits[].role` | string | Role text listed by Douban when available. |
| `credits[].character` | string | Character name for a cast credit when available. |
| `awards` | array of objects | Awards and nominations listed by Douban. |
| `awards[].ceremony` | string | Award ceremony name when available. |
| `awards[].category` | string | Award category when available. |
| `awards[].nominee` | string | Nominee text listed by Douban when available. |
| `awards[].status` | string | `win` or `nomination`. |
| `awards[].year` | integer | Award year when available. |
| `imdbId` | string | IMDb identifier when the public Douban record provides one. |
| `imdbUrl` | string | IMDb page URL when the public Douban record provides one. |
| `listContext` | object | Collection or list that produced the subject when applicable. |
| `listContext.name` | string | Collection or list name when available. |
| `listContext.url` | string | Public collection or list URL. |
| `listContext.rank` | integer | Subject rank in the collection or list when available. |
| `listContext.listType` | string | List kind: `collection`, `chart`, `hot`, or `ranking`. |
| `discoverySource` | string | The one submitted keyword or URL that caused this subject row to be saved. |

**Example subject row**

This is a shortened real subject row from a successful run. The source row has 58 credit objects and 28 award objects, shown here as `"..."`.

```json
{
  "recordType": "subject",
  "subjectId": "26266893",
  "subjectUrl": "https://movie.douban.com/subject/26266893/",
  "subjectKind": "movie",
  "title": "流浪地球",
  "aliases": [
    "流浪地球：飞跃2020特别版",
    "The Wandering Earth",
    "The Wandering Earth: Beyond 2020 Special Edition"
  ],
  "releaseDate": "2019-02-05(中国大陆)",
  "releaseYear": 2019,
  "coverUrl": "https://img3.doubanio.com/view/photo/m_ratio_poster/public/p2545472803.jpg",
  "genres": [
    "科幻",
    "冒险",
    "灾难"
  ],
  "countries": [
    "中国大陆"
  ],
  "rating": {
    "value": 7.9,
    "scale": 10,
    "count": 2055925
  },
  "engagement": {
    "commentCount": 741729,
    "reviewCount": 21654
  },
  "credits": "...",
  "awards": "..."
}
```

**Person rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `person` for this shape. |
| `personId` | string | Stable Douban ID for the person when available. |
| `personUrl` | string | Canonical public Douban profile URL. |
| `name` | string | Public name of the person. |
| `aliases` | array of strings | Other names listed by Douban. |
| `birthDate` | string | Birth date when Douban provides one. |
| `birthPlace` | string | Birth place when Douban provides one. |
| `occupations` | array of strings | Occupations listed by Douban. |
| `biography` | string | Public biography text when available. |
| `followerCount` | integer | Follower total listed by Douban. |
| `knownForTitles` | array of objects | Subjects linked to this person as known-for titles. |
| `knownForTitles[].title` | string | Public subject title. |
| `knownForTitles[].subjectId` | string | Stable subject ID when available. |
| `knownForTitles[].subjectUrl` | string | Public subject URL when available. |
| `knownForTitles[].subjectKind` | string | Subject kind: `movie`, `tv`, `book`, or `music`. |
| `knownForTitles[].year` | integer | Subject year when available. |
| `knownForTitles[].role` | string | The person's role in the subject when available. |
| `imdbId` | string | IMDb identifier when the public Douban profile provides one. |
| `imdbUrl` | string | IMDb page URL when the public Douban profile provides one. |

**Example person row**

```json
{
  "recordType": "person",
  "personUrl": "https://www.douban.com/personage/27260209",
  "name": "凯特·布兰切特",
  "personId": "27260209",
  "biography": "演员 配音 制片人 / 本杰明·巴顿奇事 指环王1：护戒使者 指环王3：王者无敌",
  "followerCount": 95429,
  "aliases": [
    "姬蒂·白兰芝(港) / 凯特·布兰琪(台) / 大魔王(昵称)",
    "Catherine Elise Blanchett (本名)"
  ],
  "imdbId": "nm0000949",
  "birthDate": "1969年5月14日",
  "birthPlace": "澳大利亚,维多利亚,墨尔本"
}
```

**Long-form review rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `review` for this shape. |
| `reviewId` | string | Stable Douban ID for the review. |
| `reviewUrl` | string | Canonical public Douban URL for the review. |
| `title` | string | Review title when available. |
| `text` | string | Review text in the source language. |
| `textScope` | string | `full` for complete text or `preview` for a source preview. |
| `subject` | object | The Douban subject being reviewed. |
| `subject.subjectId` | string | Subject ID when available. |
| `subject.url` | string | Canonical public subject URL. |
| `subject.title` | string | Public subject title. |
| `subject.subjectKind` | string | Subject kind: `movie`, `tv`, `book`, or `music`. |
| `author` | object | Public context about the review author when available. |
| `author.authorId` | string | Stable author ID when available. |
| `author.authorUrl` | string | Public author profile URL when available. |
| `author.name` | string | Public author name when available. |
| `author.region` | string | Province or region shown by Douban when available. |
| `rating` | object | Star rating given by the review author when available. |
| `rating.stars` | integer | One-to-five star rating. |
| `rating.value` | number | Numeric rating value when available. |
| `rating.scale` | number | Maximum rating scale when available. |
| `sentiment` | string | Rating-derived label: `positive`, `neutral`, or `negative`. |
| `engagement` | object | Engagement totals listed by Douban for the review. |
| `engagement.usefulCount` | integer | Useful vote total when available. |
| `engagement.likeCount` | integer | Like total when available. |
| `engagement.commentCount` | integer | Comment total for the review when available. |
| `publishedAt` | string | Review publication time from Douban. |

**Example long-form review row**

This is a shortened real review row. Its source text is 14,378 characters, so the text is shown as `"..."`.

```json
{
  "recordType": "review",
  "reviewId": "9943996",
  "reviewUrl": "https://movie.douban.com/review/9943996/",
  "title": "【球2再次成功，笑看某些人破防】全面驳斥《流浪地球不及格》",
  "text": "...",
  "textScope": "full",
  "subject": {
    "subjectId": "26266893",
    "subjectKind": "movie",
    "title": "流浪地球",
    "url": "https://movie.douban.com/subject/26266893/"
  },
  "author": {
    "authorId": "12445988",
    "authorUrl": "https://www.douban.com/people/12445988/",
    "name": "某猪·坑坑洼洼",
    "region": "深圳"
  },
  "rating": {
    "stars": 5,
    "value": 5,
    "scale": 5
  },
  "sentiment": "positive",
  "engagement": {
    "usefulCount": 36088,
    "likeCount": 36088,
    "commentCount": 7292
  },
  "publishedAt": "2019-02-06 23:25:32"
}
```

**Short comment rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `comment` for this shape. |
| `commentId` | string | Stable Douban ID for the comment. |
| `commentUrl` | string | Canonical public Douban URL for the comment. |
| `text` | string | Comment text in the source language. |
| `subject` | object | The Douban subject being discussed. |
| `subject.subjectId` | string | Subject ID when available. |
| `subject.url` | string | Canonical public subject URL. |
| `subject.title` | string | Public subject title. |
| `subject.subjectKind` | string | Subject kind: `movie`, `tv`, `book`, or `music`. |
| `author` | object | Public context about the commenter when available. |
| `author.authorId` | string | Stable author ID when available. |
| `author.authorUrl` | string | Public author profile URL when available. |
| `author.name` | string | Public author name when available. |
| `author.region` | string | Province or region shown by Douban when available. |
| `rating` | object | Star rating given by the commenter when available. |
| `rating.stars` | integer | One-to-five star rating. |
| `rating.value` | number | Numeric rating value when available. |
| `rating.scale` | number | Maximum rating scale when available. |
| `sentiment` | string | Rating-derived label: `positive`, `neutral`, or `negative`. |
| `engagement` | object | Engagement totals listed by Douban for the comment. |
| `engagement.likeCount` | integer | Like total when available. |
| `engagement.replyCount` | integer | Reply total for the comment when available. |
| `publishedAt` | string | Comment publication time from Douban. |

**Example short comment row**

```json
{
  "recordType": "comment",
  "commentId": "1656169114",
  "commentUrl": "https://www.douban.com/movie/26266893/interest/1656169114",
  "text": "1.从特效和技术上讲，这应该是迄今为止此类中国电影的巅峰了。磅礴恢宏，细节营造用心。2.故事层面比较糟糕，很好奇到底出于什么原因，造成几乎超过40%的台词都是后配的，而且对不上口型，明显是片子成型后彻底改词重配的。这严重影响故事质量。3.作为类型片，很多讲述方式有明显问题，比如人物特征不鲜明，交代不清楚，刘启变成“刘户口”，这种启字的拆解为什么不交代?李一一变成“李长条”留给谁去猜?4.很多地方增加众多根本无意义的插科打诨，自以为幽默但毫无笑点非常尴尬。5.这个全球化的项目中，中俄合作，稍稍出现一句法语，两句日语，美国闪现一次国旗。6.科幻特效技术有了巨大进步，但技术这只是科幻电影的一部分。",
  "subject": {
    "subjectId": "26266893",
    "subjectKind": "movie",
    "title": "流浪地球",
    "url": "https://movie.douban.com/subject/26266893/"
  },
  "author": {
    "authorId": "1233038",
    "authorUrl": "https://www.douban.com/people/1233038/",
    "name": "frozenmoon",
    "region": "北京"
  },
  "publishedAt": "2019-02-05 16:29:48",
  "rating": {
    "stars": 3,
    "value": 3,
    "scale": 5
  },
  "sentiment": "neutral",
  "engagement": {
    "likeCount": 6501
  }
}
```

**Group topic rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `groupTopic` for this shape. |
| `topicId` | string | Stable Douban ID for the group topic. |
| `topicUrl` | string | Canonical public Douban URL for the topic. |
| `title` | string | Topic title when available. |
| `body` | string | Topic body in the source language when available. |
| `group` | object | Douban group that contains the topic. |
| `group.groupId` | string | Stable group ID when available. |
| `group.url` | string | Public Douban group URL. |
| `group.name` | string | Public group name when available. |
| `author` | object | Public context about the topic author when available. |
| `author.authorId` | string | Stable author ID when available. |
| `author.authorUrl` | string | Public author profile URL when available. |
| `author.name` | string | Public author name when available. |
| `author.region` | string | Province or region shown by Douban when available. |
| `createdAt` | string | Topic creation time from Douban. |
| `updatedAt` | string | Latest topic update time when available. |
| `replyCount` | integer | Total reply count listed by Douban. |
| `replies` | array of objects | Replies collected when Douban makes them available. |
| `replies[].replyId` | string | Stable reply ID when available. |
| `replies[].replyUrl` | string | Public reply URL when available. |
| `replies[].text` | string | Reply text in the source language. |
| `replies[].author` | object | Public context about the reply author. |
| `replies[].author.authorId` | string | Stable reply author ID when available. |
| `replies[].author.authorUrl` | string | Public reply author URL when available. |
| `replies[].author.name` | string | Public reply author name when available. |
| `replies[].author.region` | string | Province or region shown by Douban when available. |
| `replies[].createdAt` | string | Reply creation time when available. |
| `replies[].likeCount` | integer | Reply like total when available. |

**Example group topic row**

This is a shortened real group topic row. Its body has 3,948 characters and it has 37 replies, shown here as `"..."`.

```json
{
  "recordType": "groupTopic",
  "topicId": "477072736",
  "topicUrl": "https://www.douban.com/topic/477072736/?_spm_id=MjYzMzY3NTc1",
  "title": "豆瓣电影Top250四年间排名变动",
  "body": "...",
  "author": {
    "authorId": "263367575",
    "authorUrl": "https://www.douban.com/people/LKS112/",
    "name": "悟乄空",
    "region": "青岛"
  },
  "createdAt": "2026-02-23 20:20:41",
  "updatedAt": "2026-08-22 17:51:40",
  "replyCount": 37,
  "replies": "..."
}
```

Optional fields are present only when the public source provides them. Review and comment sentiment is derived from the available star rating. Text is not translated.

#### 💳 Pricing

This Actor uses pay-per-event pricing. A matching event applies when a successful paid row is saved, and the exact tiered price is shown by Apify for your account.

| Buyer-facing event | When it applies |
| --- | --- |
| Subject metadata | One public subject with core identity and available rating data is saved to your dataset. |
| Long-form review | One public long-form review is saved with available text, rating, author, engagement, and source link. |
| Short comment | One public short comment is saved with available text, rating, author, engagement, and source link. |

No separate buyer-facing event is listed for person, collection, trending, or group-topic rows. No paid event is described here for empty or non-result work.

#### 🔌 Integrations

**Apify dataset and API**

Open the dataset from the `results` link in the run output. You can also retrieve the saved rows through the Apify API.

**Run tutorial**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Which target should I use for direct media data?

Use Subject metadata with a public movie, TV, book, or music subject URL. Use Search media subjects when you want movie, TV, or book subjects from one keyword.

##### Can I search for music by keyword?

Music keyword discovery is not promised. Use a public music subject URL or a supported collection when you have a direct target.

##### What happens when a public target is unavailable?

The Actor does not invent a successful row. It reports a clear non-result and leaves unavailable source data out of the successful shapes above.

##### How does full review text work?

Turn on Include full review text for Long-form reviews. The review row can then include the complete body when the public source provides it. Otherwise, the text can be a source preview.

##### How does Return only new items work?

On repeat runs, it compares the same target and submitted values and returns only records it has not seen before. Leave it off when you want all available records for that run.

##### What happens if I leave Maximum items empty?

The Actor returns all available results until the public source is exhausted. Set a positive value when you want a work limit.

##### Is the returned text translated?

No. Text stays in the language used by the public Douban source.

##### Do I need a Douban login or API key?

No for public content. Private or login-walled pages are not collected or bypassed.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~douban-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[Goodreads Scraper](https://apify.com/maximedupre/goodreads-scraper)**: Compare public Goodreads book ratings and review rows with Douban media research.
- **[Douban Pro Scraper — Reviews, Discussions & Subject Data](https://apify.com/zhorex/douban-scraper)**: Use it when long-form reviews, comments, and group discussions are your main Douban target.
- **[Douban Movie Scraper — Ratings, Reviews & Hot Lists](https://apify.com/sian.agency/douban-movie-scraper)**: Use it for Douban movie and TV ratings, cast, reviews, comments, and hot lists.
- **[Douban Reviews Scraper](https://apify.com/stackrelay/douban-reviews-scraper)**: Use it for Douban ratings, reviews, comments, and rating-derived sentiment labels.
- **[Douban Scraper - Movies, TV, Books, Music & Reviews](https://apify.com/scrapesage/douban-scraper)**: Use it for Douban media subjects, ratings, reviews, comments, and people profiles.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose one type of Douban data to collect. Use the matching fields below. Fields for other targets are ignored.

## `keyword` (type: `string`):

For Search media subjects, enter one keyword. Douban can return movie, TV, or book subjects. Other targets ignore this field.

## `mediaType` (type: `string`):

For Search media subjects, choose movies, TV, books, or all supported types. Other targets ignore this field.

## `collectionUrls` (type: `array`):

For Collections and charts, add one or more public Douban collection or chart URLs. Other targets ignore this list.

## `listType` (type: `string`):

For Hot and ranking lists, choose a current Douban movie or TV list. Other targets ignore this field.

## `personUrls` (type: `array`):

For People profiles, add one or more public Douban person profile URLs. Other targets ignore this list.

## `includeFullText` (type: `boolean`):

For Long-form reviews, include the complete review body when this is on. Other targets ignore this setting.

## `groupTopicUrls` (type: `array`):

For Group topics, add one or more public Douban group topic URLs. The Actor also returns available replies. Other targets ignore this list.

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

For Subject metadata, Long-form reviews, or Short comments, add one or more public Douban subject URLs. The Actor returns the data for the selected target. Other targets ignore this list.

## `reviewCommentOrder` (type: `string`):

For Long-form reviews, only Most popular is supported. For Short comments, choose Most popular, Most useful, or Newest. Other targets ignore this field.

## `onlyNewItems` (type: `boolean`):

On repeat runs, return only records not seen before for the same target and submitted values. Leave this off to return all available records.

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

Optional work limit for results. Leave it empty to return all available results until the public source is exhausted. If set, the Actor stops after that many results. This is a work limit, not a page number.

## Actor input object example

```json
{
  "target": "searchSubjects",
  "keyword": "流浪地球",
  "mediaType": "all",
  "includeFullText": false,
  "onlyNewItems": false
}
```

# Actor output Schema

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

Dataset of successful Douban rows from this run.

# 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 = {
    "target": "searchSubjects"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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 = { "target": "searchSubjects" }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/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 '{
  "target": "searchSubjects"
}' |
apify call maximedupre/douban-scraper --silent --output-dataset

```

## MCP server setup

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