# Weibo Scraper - Search, Accounts, Comments & Hot List (`dami_studio/weibo-scraper`) Actor

Search Weibo, read an account's latest posts, pull the comments under a post, or take the real-time hot search list. One row per post, comment or hot topic: text, author, followers, likes, reposts, pictures and place. A search gives the 50 to 90 posts Weibo shows without signing in.

- **URL**: https://apify.com/dami_studio/weibo-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (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 $1.79 / 1,000 posts

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?

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

**Search Weibo, read an account's latest posts, pull the comments under a post, or take the real-time hot search list**: one row per post, comment or hot topic, with the text, the author and their follower count, likes, comments, reposts, pictures, video links and the place Weibo says it was posted from.

Weibo shows people who aren't signed in one page of results per search tab and an account's latest few dozen posts, and this actor doesn't sign in. So a search brings back 50 to 90 posts and an account about 30, however many exist. Comments don't have that limit: one test run took 2,000 from a single post in under two minutes.

| | |
|---|---|
| **Input** | Search terms, accounts (id, profile link or screen name), post links, or the hot search list switch |
| **Output** | One row per post, comment or hot topic: text, author, follower count, likes, comments, reposts, pictures, video link, place, time |
| **Ceiling** | About 50 to 90 posts per search and about 30 per account, which is what Weibo shows without signing in; 2,000 comments per post; 100 entries in each list per run |
| **Speed** | 10 to 20 seconds a search, 5 to 11 seconds an account, about 1,100 comments a minute |
| **Account needed** | None from you |
| **Price** | $1.85 per 1,000 posts, $4.60 per 1,000 comments, $4.60 per 1,000 hot topics, flat on every plan. The free plan's $5 a month covers about 2,700 posts |

### 🔍 What Weibo Scraper does

Four jobs, and one run can do all of them. Each runs only when you fill in its field.

- **Search.** Each term is looked up across Weibo's five result tabs (top, latest, hot, video, pictures), and a post found on two tabs is kept once.
- **Accounts.** An account's latest posts, newest first. Only its own, reposts it made included.
- **Comments.** The comments under a post, newest first or in Weibo's hot order, with their replies if you want them.
- **Hot search list.** The ranked list as it stands when the run reads it: about 50 topics with Weibo's heat figure.

Weibo cuts long posts short in its lists, so the whole text is fetched for each one. Every row is checked against what you asked before it goes in. A search post has to be a result of that search, an account's post has to be that account's, a comment has to belong to that post. Anything else is left out and not charged.

### 📋 What data you get from each Weibo post

| What you get | Field |
|---|---|
| The post's id, short id and link | `id`, `bid`, `url` |
| When it was posted, in UTC | `createdAt` |
| The whole text, and whether it is whole | `text`, `textIsComplete` |
| The author, their verified label and follower count | `authorId`, `authorName`, `authorUrl`, `authorVerified`, `authorVerifiedReason`, `authorFollowers`, `authorFollowersText` |
| Likes, comments and reposts | `likes`, `comments`, `reposts`, `countsRounded` |
| Topics, @mentions and outside links in the text | `topics`, `mentions`, `links` |
| Pictures, and how many the post has | `images`, `imageCount` |
| Video link, cover, length and plays | `videoUrl`, `videoCoverUrl`, `videoDurationSeconds`, `videoPlays` |
| The post it reposts | `isRepost`, `repostOf` |
| The place Weibo prints on it, and the line beside its time | `postedFrom`, `sourceLabel` |
| Pinned, and how many times it was edited | `isPinned`, `editCount` |
| Which search or account it came from | `source`, `searchTerm`, `searchTab`, `accountInput` |
| A comment: its post, text, likes, replies, author and place | `postId`, `postUrl`, `text`, `likes`, `replies`, `parentCommentId`, `replyToName`, `authorName`, `authorFollowers`, `authorLocation`, `postedFrom` |
| A hot topic: rank, words, heat, category, label, time on the list | `rank`, `topic`, `heat`, `category`, `label`, `isPinned`, `enteredListAt`, `searchUrl` |

### ▶️ How to scrape Weibo

1. Open [Weibo Scraper](https://apify.com/dami_studio/weibo-scraper) and click **Try for free**.
2. Type words into **Search terms**, accounts into **Accounts**, post links into **Posts for comments**, or tick **Hot search list**. Any mix works.
3. Lower **Posts per search**, **Posts per account** or **Comments per post** while you're testing.
4. Click **Start**.
5. Download the rows as JSON, CSV or Excel, or read them through the Apify API.

Start it with every field empty to see the row shape first: one labelled sample post, not charged.

### 💰 How much does it cost to scrape Weibo?

**$1.85 per 1,000 posts, $4.60 per 1,000 comments and $4.60 per 1,000 hot topics.** Flat on every Apify plan, no volume tiers. A reply counts as a comment. On the free plan, the $5 Apify gives you each month covers about 2,700 posts, or about 1,050 comments.

You pay for rows that come back. The sample row and every note row are free, and so are posts the checks left out, repeats, and the promoted slot in the hot list. If you set a maximum charge for the run, it stops before the first row it couldn't pay for.

### 📥 What you give it

```json
{
  "searchTerms": ["咖啡", "华为 手机"],
  "users": ["1749127163", "https://weibo.com/rmrb"],
  "postUrls": ["https://weibo.com/2803301701/RkyFjzhSX"],
  "maxCommentsPerPost": 200,
  "hotList": true
}
```

| Field | Default | What it is |
|---|---|---|
| `searchTerms` | none, the box starts at `咖啡` | Words to search for, one per line, in any language. Up to 100. |
| `maxPostsPerSearch` | `50` | The most posts from one search, 1 to 100. Weibo rarely has more than 90 to show. |
| `matchAllWords` | `true` | Keeps only posts whose text, reposted post or topic card holds every word you searched, split on spaces. Off returns everything Weibo's search does. |
| `users` | none | Account ids, profile links (`weibo.com/u/...`, `weibo.com/n/<name>`, `weibo.com/<custom address>`, `m.weibo.cn/u/...`) or screen names. Up to 100. |
| `maxPostsPerUser` | `30` | The most posts from one account, newest first, 1 to 50. |
| `postUrls` | none | Post links (`weibo.com/<account id>/<post id>`, `m.weibo.cn/detail/<id>`) or post ids. Up to 100. |
| `maxCommentsPerPost` | `100` | The most comments from one post, 1 to 2,000. Replies come on top. |
| `commentsOrder` | `newest` | `newest` goes through every comment Weibo lists. `hot` follows Weibo's ranking, which ends near 300. |
| `includeReplies` | `false` | Also returns the replies under each comment. |
| `maxRepliesPerComment` | `20` | The most replies under one comment, 1 to 100. |
| `hotList` | `false` | Returns the real-time hot search list. |
| `fullText` | `true` | Fetches the whole text of posts Weibo cuts short. Off is quicker and leaves `textIsComplete` false on those rows. |

Two entries naming one account, an id and a screen name say, are read once. A setting outside its range stops the run before anything is fetched. An entry that isn't a Weibo link or id is skipped with a note, and the rest go ahead.

### 📤 What you get back

A real post from a search for `华为 手机` on 3 October 2026:

```json
{
  "recordType": "post",
  "id": "5350042053381127",
  "bid": "RkZOZebAj",
  "url": "https://weibo.com/1278131290/RkZOZebAj",
  "createdAt": "2026-10-03T13:08:07.000Z",
  "text": "刚刷到一家华为门店在Mate90首销日卖了231台手机[哆啦A梦吃惊][哆啦A梦吃惊]",
  "textIsComplete": true,
  "authorId": "1278131290",
  "authorName": "搞机大师兄",
  "authorUrl": "https://weibo.com/u/1278131290",
  "authorVerified": true,
  "authorVerifiedReason": "数码博主",
  "authorFollowers": 448000,
  "authorFollowersText": "44.8万",
  "reposts": 0,
  "comments": 27,
  "likes": 55,
  "countsRounded": false,
  "topics": [],
  "mentions": [],
  "links": [],
  "images": ["https://wx3.sinaimg.cn/mw2000/4c2ebc5aly1ihpgye4uzlj210o274h0k.jpg"],
  "imageCount": 1,
  "videoUrl": null,
  "videoCoverUrl": null,
  "videoDurationSeconds": null,
  "videoPlays": null,
  "isRepost": false,
  "repostOf": null,
  "isPinned": false,
  "postedFrom": "山东",
  "sourceLabel": "数码博主",
  "editCount": 0,
  "source": "search",
  "searchTerm": "华为 手机",
  "searchTab": "top",
  "accountInput": null,
  "scrapedAt": "2026-10-03T15:08:27.798Z"
}
```

A comment and a hot topic from the same afternoon:

```json
{
  "recordType": "comment",
  "id": "5350030405013535",
  "postId": "5348998178410235",
  "postUrl": "https://weibo.com/2803301701/RkyFjzhSX",
  "parentCommentId": null,
  "replyToName": null,
  "createdAt": "2026-10-03T12:21:50.000Z",
  "text": "祝祖国繁荣昌盛，国泰民安！",
  "likes": 1,
  "replies": 0,
  "authorId": "7911007775",
  "authorName": "无尽夏-Cecily",
  "authorUrl": "https://weibo.com/u/7911007775",
  "authorVerified": true,
  "authorFollowers": 2753,
  "authorLocation": "北京",
  "postedFrom": "江苏",
  "imageUrl": null,
  "commentsOrder": "newest",
  "postInput": "https://weibo.com/2803301701/RkyFjzhSX",
  "scrapedAt": "2026-10-03T15:11:40.918Z"
}
```

```json
{
  "recordType": "hotTopic",
  "rank": 1,
  "topic": "爬珠峰的人都堵了",
  "heat": 1686010,
  "category": "幽默",
  "label": "热",
  "isPinned": false,
  "enteredListAt": "2026-10-03T12:48:21.000Z",
  "searchUrl": "https://s.weibo.com/weibo?q=%23%E7%88%AC%E7%8F%A0%E5%B3%B0%E7%9A%84%E4%BA%BA%E9%83%BD%E5%A0%B5%E4%BA%86%23",
  "postUrl": null,
  "listReadAt": "2026-10-03T15:07:58.138Z",
  "scrapedAt": "2026-10-03T15:07:58.138Z"
}
```

| Field | How to read it |
|---|---|
| `authorFollowers` | Weibo rounds big accounts in its lists, so 448,000 here was "44.8万". `authorFollowersText` is the figure as Weibo printed it. |
| `countsRounded` | `true` when Weibo gave a post's likes, comments or reposts rounded, such as "100万+". |
| `postedFrom` | The province or country Weibo prints on a post or comment for where it was sent from. `null` when it prints none. |
| `authorLocation` | The place a commenter wrote on their own profile, which can differ from `postedFrom`. |
| `sourceLabel` | The line Weibo prints beside the time: the app or phone on an account's posts, the author's label in search results. |
| `imageCount` | How many pictures the post has. `images` holds the ones Weibo lists, nine at most. |
| `videoUrl` | Stops working an hour after the row was read, so download a video you want to keep. Picture links don't expire that way. |
| `searchTab` | The result tab a post was first found on: `top`, `latest`, `hot`, `video` or `pictures`. |
| `rank`, `heat` | A topic's place on the list and Weibo's heat figure. The pinned topic above the list has neither. |

### 🧾 Reading the output

| Row | How to spot it | Charged |
|---|---|---|
| A post | `recordType: "post"` | yes, as a post |
| A comment or a reply | `recordType: "comment"`; a reply has `parentCommentId` | yes, as a comment |
| A hot topic | `recordType: "hotTopic"` | yes, as a hot topic |
| The sample row | `recordType: "sample"`, `_sample: true` | no |
| A note | `recordType: "diagnostic"`, `_diagnostic: true`, an `errorCode` | no |

| `errorCode` | What happened |
|---|---|
| `NO_RESULTS` | Weibo has no posts for that search. |
| `NO_MATCHES` | Weibo found posts, but none hold every word of the search. |
| `WITHHELD` | Weibo doesn't show results for that search. |
| `USER_NOT_FOUND` | No account matches that id, link or name. |
| `USER_UNAVAILABLE` | Weibo says the account can't be viewed, usually because it was suspended. |
| `NO_POSTS` | The account shows no posts to people who aren't signed in. |
| `POST_NOT_FOUND` | The post doesn't exist or was deleted. |
| `POST_HIDDEN` | Only some readers can see the post, so its comments can't be read. |
| `NO_COMMENTS` | The post has no comments, or Weibo lists none. |
| `PARTIAL` | Weibo stopped answering partway. What came before is in the dataset. |
| `NOT_ANSWERED` | Weibo didn't answer for that entry this time. Run it again later. |
| `NOT_REACHED` | The run stopped first, at your maximum charge or its time limit. |
| `BAD_INPUT` | An entry or a setting that can't be used. |
| `MAX_CHARGE_TOO_LOW` | Your maximum charge doesn't cover one row, so nothing was fetched. |
| `SETUP` | Skipped because of a problem on our side. |

To keep only the data, filter on `recordType` being `post`, `comment` or `hotTopic`. `RUN_REPORT` in the run's key-value store lists every entry with its status and how many rows it gave.

### 💡 What people use it for

- Hearing what Chinese buyers say about a brand. Schedule a daily search for its name and keep the post ids you haven't seen.
- Following newspapers, officials or creators without the app: their latest posts with likes and comments, newest first.
- Reading the reaction under one post, a launch or a public apology, 2,000 comments deep.
- Watching what trends. Read the hot list every hour and you have each topic's rank and heat across the day.

From a trending topic to what people say about it, in three runs:

1. Tick **Hot search list** and pick topics from the `topic` column.
2. Put them into **Search terms** and sort the posts on `comments`.
3. Put the `url` of the posts you want into **Posts for comments**.

### 🚧 What it does not do

- **No full history.** An account gives its latest 30 or so posts and a search 50 to 90, because that's what Weibo shows without signing in. It doesn't sign in.
- **No date range on searches.** Weibo's own advanced search asks you to sign in. Filter on `createdAt` afterwards.
- **No follower lists, no lists of who liked or reposted.**
- **Nothing hidden from the public.** Posts limited to friends or fans stay hidden.
- **Weibo's hot order ends near 300 comments.** Newest first goes through all of them.
- **About 100 replies per comment at most**, as many as Weibo lists.

### 🧭 Which Chinese social media scraper do you need?

| If you want | Use |
|---|---|
| Weibo posts, comments and the hot search list | This one |
| Douyin's trending topics | [Douyin Hot Search Scraper](https://apify.com/dami_studio/douyin-hot-search-scraper) |
| Xiaohongshu (RedNote) notes | [RedNote Scraper](https://apify.com/dami_studio/rednote-scraper) |
| Xiaohongshu (RedNote) profiles | [RedNote Profile Scraper](https://apify.com/dami_studio/rednote-profile-scraper) |
| Bilibili videos, rankings and comments | [Bilibili Scraper](https://apify.com/dami_studio/bilibili-scraper) |
| Posts on X by keyword | [Twitter (X) Search Scraper](https://apify.com/dami_studio/twitter-search-scraper) |

### ❓ Questions people ask

#### Do I need a Weibo account to scrape Weibo?

No. It reads what Weibo shows anyone who isn't signed in, and needs no login, cookie or API key from you.

#### Why do I get fewer posts than I see in the Weibo app?

The app is signed in and keeps loading as you scroll. Someone who isn't signed in gets one page per search tab and an account's latest few dozen posts. Open m.weibo.cn in a private browser window: what you see there is what this actor can read. Counts keep moving too, so compare against `scrapedAt`.

#### Why are some follower counts round numbers?

Weibo writes big accounts as 44.8万 or 1.6亿 in its lists. `authorFollowers` turns that into a number with the same rounding, and `authorFollowersText` keeps Weibo's own text.

#### Can I call it from code or connect it to an AI assistant?

Yes. The [API tab](https://apify.com/dami_studio/weibo-scraper/api/python) has code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect `https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/weibo-scraper`. Either way it runs on your Apify account at the same price.

#### Is scraping Weibo legal?

It reads public posts, public comments and the public hot list. Names and comments are still personal data under laws such as GDPR and China's PIPL, and Weibo has its own terms of use, so have a reason and read them. Apify's [write-up on scraping and the law](https://blog.apify.com/is-web-scraping-legal/) is a starting point; we are not lawyers.

### 🆘 If something breaks

Open the **Issues** tab on the actor page and send the run ID with the entries you used. The status message and `RUN_REPORT` say which entry fell short.

# Actor input Schema

## `searchTerms` (type: `array`):

Words to search Weibo for, one per line, in Chinese or any other language. Weibo shows people who aren't signed in the first page of each of its five result tabs (top, latest, hot, video, pictures), which usually comes to 50 to 90 different posts per search. Up to 100 searches a run.

## `maxPostsPerSearch` (type: `integer`):

Stop a search after this many posts. Weibo rarely has more than about 90 to show for one search, so a higher number returns what there is.

## `matchAllWords` (type: `boolean`):

Weibo's search also returns posts that match only part of a phrase, or match on a picture. On: a post is kept only when its text, the post it reposts or its topic card contains every word you searched (words are split on spaces, so 蔚来汽车 is one word and 蔚来 汽车 is two). Off: everything Weibo's search returns. Posts left out are never charged.

## `users` (type: `array`):

Accounts to read, one per line: the numeric id (1749127163), a profile link (weibo.com/u/1749127163, weibo.com/n/雷军, weibo.com/rmrb, m.weibo.cn/u/1749127163) or the screen name, with or without @. Weibo shows people who aren't signed in an account's latest ten or so posts plus the latest of each kind (original, video, photo, article), usually 25 to 35 posts in all.

## `maxPostsPerUser` (type: `integer`):

Stop an account after this many posts, newest first.

## `postUrls` (type: `array`):

Posts whose comments you want, one per line: the post's link (weibo.com/2803301701/RkyFjzhSX, m.weibo.cn/detail/5348998178410235) or its id.

## `maxCommentsPerPost` (type: `integer`):

Stop a post after this many comments. Replies, when you ask for them, come on top of this.

## `commentsOrder` (type: `string`):

Newest first goes through every comment Weibo lists, latest at the top. Hot follows Weibo's ranking, which ends after about 300 comments.

## `includeReplies` (type: `boolean`):

Also return the replies under each comment, as comment rows with parentCommentId set. Each reply is charged as a comment.

## `maxRepliesPerComment` (type: `integer`):

Weibo lists up to about 100 replies under one comment to people who aren't signed in.

## `hotList` (type: `boolean`):

Return Weibo's real-time hot search list: about 50 ranked topics with their heat figure and category, plus the pinned topic above them. The promoted slot in the list is left out.

## `fullText` (type: `boolean`):

Weibo cuts long posts short in its lists. On: the whole text is fetched for each one. Off: those rows carry the shortened text, with textIsComplete set to false.

## Actor input object example

```json
{
  "searchTerms": [
    "咖啡"
  ],
  "maxPostsPerSearch": 50,
  "matchAllWords": true,
  "maxPostsPerUser": 30,
  "maxCommentsPerPost": 100,
  "commentsOrder": "newest",
  "includeReplies": false,
  "maxRepliesPerComment": 20,
  "hotList": false,
  "fullText": true
}
```

# Actor output Schema

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

One row per post, comment or hot topic, told apart by recordType. Free rows marked \_diagnostic say when a search found nothing, an account or post doesn't exist, Weibo didn't answer, or an entry wasn't looked up.

## `report` (type: `string`):

What happened for each entry: its status, rows returned, result tabs or post lists read, rows left out by the checks, and why the run stopped.

# 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 = {
    "searchTerms": [
        "咖啡"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/weibo-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 = { "searchTerms": ["咖啡"] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/weibo-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 '{
  "searchTerms": [
    "咖啡"
  ]
}' |
apify call dami_studio/weibo-scraper --silent --output-dataset

```

## MCP server setup

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