# Weibo Scraper: Posts, Comments & Profiles, No Login (`cliqtomedia/weibo-scraper`) Actor

Scrape public Weibo (微博) data with no login: keyword search with date ranges, user profiles with their latest posts, post details by link and comments. Text, likes, reposts, comments, images, video, hashtags and region in clean rows, with a free status row for not-found inputs.

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

## Pricing

from $1.90 / 1,000 result rows

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

Scrape public Weibo data with no login. Search posts by keyword and date, read users' profiles and latest posts, or get full details for post links, with up to 40 comments per post. Each item is one clean row with full text, likes, reposts, comments, images, video, hashtags and region. A typical run with 10 rows takes about 8 seconds and costs $0.034 on the Free plan.

Use it for brand monitoring, trend research and audience studies on [Weibo](https://weibo.com/) (微博), the Chinese microblogging platform. Start with the keyword `苹果` and 10 results.

![Weibo keywords, post links and user IDs to post, comment and profile rows](https://api.apify.com/v2/key-value-stores/xdaSQTC3dlwyClYwR/records/hero.png)

### Table of contents

- [What it does](#what-it-does)
- [Quick start](#quick-start)
- [Input](#input)
- [Output](#output)
- [Pricing and limits](#pricing-and-limits)
- [Use cases](#use-cases)
- [Scheduling and monitoring](#scheduling-and-monitoring)
- [API, export and integrations](#api-export-and-integrations)
- [Limitations and partial results](#limitations-and-partial-results)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

The Actor has three modes. You pick one mode per run.

| Mode     | You give                            | You get                                                                 |
| -------- | ----------------------------------- | ----------------------------------------------------------------------- |
| `search` | Up to 20 keywords or hashtags       | Post rows, newest first, up to 5,000 per keyword, with an optional date range |
| `user`   | Up to 100 user IDs or profile links | One profile row per user, plus their latest posts (about 10)            |
| `post`   | Up to 250 post links or IDs         | One post row with full details for each post                            |

In every mode you can turn on **Include comments** to add up to 40 comments per post (hot comments first, then the latest).

It reads the public guest pages of Weibo. It does not sign in, does not need your cookies, and does not read private or follower-only posts.

#### Data you get

- **Posts:** post ID, short ID, URL, full text (long posts are expanded), created time, likes, reposts, comments, image URLs, video URL, cover and length, hashtags, mentions, region, source app, the original post of a repost, and the author's ID, name, verified flag and followers.
- **Comments:** comment ID, post ID, text, created time, likes, reply count, region and the commenter's public name and ID.
- **Profiles:** user ID, name, URL, public bio, followers, following, post count, verified flag and reason, location and avatar URL.
- **Status:** one free row that lists inputs that were not found, invalid, duplicate or not processed, with a reason for each.

### Quick start

1. Open **Input**.
2. Keep **What to scrape** as `search`, **Search keywords** as `苹果` and **Max posts per keyword or user** as `10`.
3. Click **Start**.
4. Open the **Posts** tab of the Output to see the rows. Open **Run summary** to check each input.

The example returns 10 post rows in about 8 seconds. Search results are live and change every minute.

### Input

Only `mode` is required. Each mode also needs its list: `keywords` for search, `userIds` for user, `postIds` for post. The new form prefills `mode: "search"`, `keywords: ["苹果"]` and `maxPosts: 10`. The default build is `latest`.

| Field                | Type             | Default / prefill         | Allowed values                              | What it changes / advice |
| -------------------- | ---------------- | ------------------------- | ------------------------------------------- | ------------------------ |
| `mode`               | string           | `search` / same           | `search`, `user`, `post`                    | What to scrape. Only the list for this mode is used. |
| `keywords`           | array of strings | none / `["苹果"]`         | 1–20 keywords                               | Search mode. Chinese or English words, or hashtags like `#topic#`. Exact duplicates are merged. |
| `userIds`            | array of strings | none                      | 1–100                                       | User mode. Numeric user ID (`1669879400`), `https://weibo.com/u/1669879400` or `https://m.weibo.cn/u/1669879400`. Custom names like `weibo.com/name` are not supported. |
| `postIds`            | array of strings | none                      | 1–250                                       | Post mode. `https://m.weibo.cn/detail/<id>`, `https://weibo.com/<uid>/<short id>`, a numeric ID (`5343871682741457`) or a short ID (`RipiMbvb3`). Short `t.cn` links are not supported. |
| `maxPosts`           | integer          | `100` / `10`              | 1–5,000                                     | Search: posts per keyword. User: posts per user; Weibo shows guests only about the latest 10. Not used in post mode. |
| `startDate`          | string           | empty                     | `YYYY-MM-DD`                                | Search mode. Oldest day to include, Beijing time. |
| `endDate`            | string           | empty                     | `YYYY-MM-DD`                                | Search mode. Newest day to include (the whole day), Beijing time. Empty means up to now. |
| `includeComments`    | boolean          | `false`                   | `true`, `false`                             | Also save comments of each post. Each comment is one paid row. |
| `maxCommentsPerPost` | integer          | `20`                      | 1–40                                        | With `includeComments`. Weibo shows guests up to about 40 comments per post. |
| `includeProfile`     | boolean          | `true`                    | `true`, `false`                             | User mode. `false` returns only the users' posts. |
| `proxyConfiguration` | object           | `{"useApifyProxy": true}` | Apify Proxy settings                        | Apify Proxy datacenter IPs work for Weibo. Keep the default. |

#### How settings work together

- `startDate` and `endDate` apply only in search mode. With a date range, the run walks back in time from `endDate` until `startDate` or `maxPosts`, whichever comes first.
- `maxPosts` counts posts only. Comments and profile rows are extra rows on top of it.
- In user mode, `includeComments` adds comments for each of the user's posts.

#### Input examples

Posts about two brands in October 2026:

```json
{ "mode": "search", "keywords": ["华为", "比亚迪"], "maxPosts": 250, "startDate": "2026-10-01", "endDate": "2026-10-14" }
```

Returns up to 250 post rows per keyword from that date range, newest first, with `keyword` set on each row.

Profiles and latest posts of two users:

```json
{ "mode": "user", "userIds": ["1669879400", "https://weibo.com/u/1195230310"], "maxPosts": 10 }
```

Returns two profile rows and about 10 post rows per user.

One post with its comments:

```json
{ "mode": "post", "postIds": ["https://m.weibo.cn/detail/5343871682741457"], "includeComments": true, "maxCommentsPerPost": 40 }
```

Returns one post row and up to 40 comment rows.

### Output

All rows go to the default Dataset. The `type` field tells the row kind: `post`, `comment`, `profile` or `status`.

#### Output examples

A post row (video and avatar links shortened; signed CDN links expire, see [Limitations](#limitations-and-partial-results)):

```json
{
  "type": "post",
  "postId": "5343871682741457",
  "bid": "RipiMbvb3",
  "url": "https://m.weibo.cn/detail/5343871682741457",
  "userId": "6529876887",
  "userName": "老师好我叫何同学",
  "userVerified": true,
  "userFollowers": 3909000,
  "text": "iPhone 18 Pro系列的首发体验视频来了！希望大家喜欢！#何同学##iPhone18上手评测##苹果发布会##苹果发布会有何亮点# 老师好我叫何同学的微博视频",
  "textTruncated": false,
  "createdAt": "2026-09-16T20:29:16+08:00",
  "reposts": 550,
  "comments": 323,
  "likes": 4430,
  "countsCapped": false,
  "images": [],
  "video": {
    "url": "https://f.video.weibocdn.com/o0/KqY4XIfNlx08AQGVnw3S010412092Cjm0E040.mp4?label=mp4_720p&…",
    "cover": "https://wx4.sinaimg.cn/orj480/0077UHgXly1ih5sd4iqooj31hc0u0hdt.jpg",
    "durationSec": 1316
  },
  "hashtags": ["何同学", "iPhone18上手评测", "苹果发布会", "苹果发布会有何亮点"],
  "mentions": [],
  "region": "浙江",
  "sourceApp": "微博视频号",
  "repostOf": null,
  "keyword": null,
  "input": "5343871682741457",
  "fetchedAt": "2026-10-15T04:06:33.763Z"
}
```

A comment row (commenter shortened):

```json
{
  "type": "comment",
  "commentId": "5343902530801751",
  "postId": "5343871682741457",
  "userId": "1783…",
  "userName": "李…",
  "text": "何同学还是稳啊，每年都能搞出新名堂，今年还搭了个实景边转场边讲解，很牛逼。[good]",
  "createdAt": "2026-09-16T22:31:51+08:00",
  "likes": 83,
  "replies": 2,
  "region": "广东",
  "replyToCommentId": null,
  "input": "5343871682741457",
  "fetchedAt": "2026-10-15T04:06:36.224Z"
}
```

A profile row:

```json
{
  "type": "profile",
  "userId": "1669879400",
  "userName": "Dear-迪丽热巴",
  "url": "https://weibo.com/u/1669879400",
  "description": "一只喜欢默默表演的小透明。工作联系[email removed] 🍒",
  "followers": 82550492,
  "following": 294,
  "postsCount": 1937,
  "verified": true,
  "verifiedReason": "嘉行传媒签约演员",
  "location": "上海",
  "avatar": "https://tvax1.sinaimg.cn/crop.0.0.1080.1080.1024/63885668ly8geyrcrw0zjj20u00u0mz6.jpg?KID=imgbed,tva&…",
  "input": "1669879400",
  "fetchedAt": "2026-10-15T04:09:45.307Z"
}
```

#### Post fields

| Field           | Type             | Null? | Meaning / example |
| --------------- | ---------------- | ----- | ----------------- |
| `postId`        | string           | no    | Numeric post ID, e.g. `5343871682741457`. |
| `bid`           | string           | yes   | Short post ID used in weibo.com links, e.g. `RipiMbvb3`. |
| `url`           | string           | no    | Public post URL. |
| `userId`        | string           | yes   | Author user ID. |
| `userName`      | string           | yes   | Author public name. |
| `userVerified`  | boolean          | yes   | `true` for a verified account. |
| `userFollowers` | integer          | yes   | Author followers. Exact in user mode; search and post mode can be rounded by Weibo (e.g. `3909000`). |
| `text`          | string           | no    | Post text, HTML removed. Can be `""` for a post with only images or video. |
| `textTruncated` | boolean          | no    | `true` when Weibo did not serve the full text of a long post and the row has the preview. |
| `createdAt`     | string           | yes   | Post time, ISO with Beijing offset `+08:00`. |
| `reposts`       | integer          | yes   | Repost count. |
| `comments`      | integer          | yes   | Comment count. |
| `likes`         | integer          | yes   | Like count. |
| `countsCapped`  | boolean          | no    | `true` when Weibo shows a counter as "1,000,000+" (the field is then `1000000`). |
| `images`        | array of strings | no    | Image URLs, largest size. `[]` when none. |
| `video`         | object           | yes   | `url`, `cover`, `durationSec`. Null for posts without video. |
| `hashtags`      | array of strings | no    | Hashtags without `#`. |
| `mentions`      | array of strings | no    | Mentioned user names without `@`. |
| `region`        | string           | yes   | "Posted from" region shown by Weibo, e.g. `浙江`. |
| `sourceApp`     | string           | yes   | Client or source label, e.g. `微博视频号`. |
| `repostOf`      | object           | yes   | For a repost: the original `postId`, `bid`, `userId`, `userName` and `text`. Null otherwise. |
| `keyword`       | string           | yes   | The search keyword in search mode, else null. |
| `input`         | string           | no    | The input line that produced the row. |
| `fetchedAt`     | string           | no    | UTC fetch time, ISO format. |

#### Comment fields

| Field              | Type    | Null? | Meaning / example |
| ------------------ | ------- | ----- | ----------------- |
| `commentId`        | string  | no    | Comment ID. |
| `postId`           | string  | no    | The post the comment belongs to. |
| `userId`           | string  | yes   | Commenter user ID. |
| `userName`         | string  | yes   | Commenter public name. |
| `text`             | string  | no    | Comment text, HTML removed; emoji codes stay as `[good]`. |
| `createdAt`        | string  | yes   | Comment time, ISO `+08:00`. |
| `likes`            | integer | yes   | Likes on the comment. |
| `replies`          | integer | yes   | Number of replies. Replies themselves are not collected. |
| `region`           | string  | yes   | Commenter region shown by Weibo. |
| `replyToCommentId` | string  | yes   | Parent comment ID when Weibo gives it; usually null. |
| `input`            | string  | no    | The input line. |
| `fetchedAt`        | string  | no    | UTC fetch time. |

#### Profile fields

| Field            | Type    | Null? | Meaning / example |
| ---------------- | ------- | ----- | ----------------- |
| `userId`         | string  | no    | User ID, e.g. `1669879400`. |
| `userName`       | string  | no    | Public name. |
| `url`            | string  | no    | Profile URL. |
| `description`    | string  | yes   | Public bio. E-mail addresses and phone numbers are replaced with `[email removed]` / `[phone removed]`. |
| `followers`      | integer | yes   | Exact follower count. |
| `following`      | integer | yes   | Accounts the user follows. |
| `postsCount`     | integer | yes   | Total posts on the profile. |
| `verified`       | boolean | yes   | `true` for a verified account. |
| `verifiedReason` | string  | yes   | Verification text, e.g. `嘉行传媒签约演员`. |
| `location`       | string  | yes   | Location from the profile. |
| `avatar`         | string  | yes   | Avatar image URL (signed, expires). |
| `input`          | string  | no    | The input line. |
| `fetchedAt`      | string  | no    | UTC fetch time. |

#### Status row

When some inputs give no new data, the run adds one free `type: "status"` row. It has a `message` (for example `2 input(s) returned no new data: 1 not found, 1 duplicate, 0 failed or not processed. Free row.`) and an `inputs` list. Each entry has `input`, `status` (`not_found`, `error`, `duplicate` or `not_processed`), `code` and `reason`.

#### Output tabs

The Output has **Posts**, **Profiles** and **Comments** tabs and a **Run summary**. The Dataset also has a **Skipped, not found and errors** view for status rows. Each view shows the columns for its row kind. Apify Dataset views cannot filter rows, so every view lists all rows of the run, and rows of other kinds show empty cells. For clean exports, filter by `type` or use the JSON export.

**Run summary** is the `RUN_SUMMARY` record in the default key-value store. It has `status`, `partialReason`, `message`, `counts` (rows by kind, charged rows, inputs complete, partial, not found, errors, not processed), per-input `inputs`, `http` (requests, retries, blocks) and `timing`.

| Situation                               | Dataset                          | Run result |
| --------------------------------------- | -------------------------------- | ---------- |
| Results found                           | Data rows                        | Succeeded, `COMPLETE`. |
| Keyword matches nothing                 | Empty                            | Succeeded, `NO_RESULTS`. Not an error. |
| Post or user does not exist or is hidden | Status row lists it             | Succeeded. `NOT_FOUND` when nothing at all was found. |
| Same post or user given twice           | One data row; status `duplicate` | Succeeded. The repeat is not charged. |
| Your maximum cost per run reached       | Rows that fit the budget         | Succeeded, partial `CHARGE_LIMIT`. Other inputs are `not_processed`. |
| Run time almost over                    | Rows saved so far                | Succeeded, partial `TIME_LIMIT`. The status message tells you to raise the timeout or split the input. |
| Weibo refuses or fails repeatedly       | Rows saved so far stay           | Failed, partial `SOURCE_ERROR`. Not the same as "no results". |
| Invalid input                           | Empty                            | Failed before any Weibo request. |

#### Coming from another Weibo scraper

Field names are this Actor's own, and counters are numbers, not strings. The common fields map like this:

| Other Weibo scrapers               | This Actor |
| ---------------------------------- | ---------- |
| `weiboId`, `id`                    | `postId` |
| `bid`                              | `bid` |
| `userId`, `user_id`                | `userId` |
| `screenName`, `screen_name`        | `userName` |
| `repostCount`, `reposts_count`     | `reposts` |
| `commentCount`, `comments_count`   | `comments` |
| `attitudeCount`, `attitudes_count` | `likes` |
| `postedAt`, `created_at`           | `createdAt` (ISO `+08:00`) |
| `topics`                           | `hashtags` |
| `atUsers`                          | `mentions` |
| `regionName`, `region_name`        | `region` (without `发布于`) |
| `picUrls`, `pics`                  | `images` |
| `weiboPageUrl`                     | `url` |
| `followersCount`, `followers_count` | `followers` |
| `friendsCount`, `friends_count`    | `following` |
| `statusesCount`, `statuses_count`  | `postsCount` |

### Pricing and limits

Pay per event: a start fee per run plus each saved data row (post, comment or profile). The status row is free. Platform compute and proxy traffic are included.

| Plan                      | Start fee per run | Per data row | Per 1,000 rows, excluding start |
| ------------------------- | ----------------: | -----------: | ------------------------------: |
| Free                      |            $0.009 |      $0.0025 |                           $2.50 |
| Bronze                    |            $0.009 |      $0.0023 |                           $2.30 |
| Silver                    |            $0.009 |      $0.0021 |                           $2.10 |
| Gold / Platinum / Diamond |            $0.009 |      $0.0019 |                           $1.90 |

The start fee is charged once per run (the Actor runs with up to 512 MB). It also applies when nothing is found. Duplicates, not-found inputs and invalid inputs are not charged as rows. Partial and failed runs charge only the start fee and the rows that were saved.

| Saved rows | Free-plan total | Gold-plan total |
| ---------: | --------------: | --------------: |
| 0          |          $0.009 |          $0.009 |
| 1          |         $0.0115 |         $0.0109 |
| 10         |          $0.034 |          $0.028 |
| 100        |          $0.259 |          $0.199 |
| 1,000      |          $2.509 |          $1.909 |
| 5,000      |         $12.509 |          $9.509 |

These are price calculations, not promised result counts. Set **Maximum cost per run** to control spending. The run stops cleanly when it reaches your limit.

**Limits per run:** 20 keywords and up to 5,000 posts per keyword, 100 users, 250 posts in post mode, 40 comments per post. Measured on Apify with 256 MB: 10 search rows in about 8 s, 500 rows in 130 s, 2,000 rows in 425 s, 5,000 rows in about 20 minutes (timeout raised to 2,400 s). 12 users with their posts (112 rows) in 19 s, 7 posts with 76 comments in 10 s. The default timeout is 300 seconds, which fits about 1,300 search rows; raise it for larger runs. A run stops at 30 minutes of work at the latest and saves what it has. Search runs that ask for more than 2,000 posts in total get 512 MB automatically; other runs use 256 MB.

### Use cases

| Task                          | Input                                           | Useful fields                                      | Next step |
| ----------------------------- | ----------------------------------------------- | -------------------------------------------------- | --------- |
| Monitor a brand or product    | `search`, brand keywords, `startDate`           | `text`, `likes`, `reposts`, `createdAt`, `region`  | Track mentions and engagement by day. |
| Follow a trending hashtag     | `search`, `#topic#`, `maxPosts: 1000`           | `hashtags`, `mentions`, `userFollowers`            | Find the accounts that drive the topic. |
| Study audience reactions      | `post` with post links, `includeComments`       | comment `text`, `likes`, `region`                  | Run sentiment or keyword analysis. |
| Benchmark creators and brands | `user` with user IDs                            | `followers`, `postsCount`, `verifiedReason`, posts | Compare accounts and their latest posts. |

### Scheduling and monitoring

You can save the input as an Apify task and schedule it, for example daily for the same keywords with `startDate` set to yesterday. Each run is a new snapshot and is charged normally. There is no "only new items" mode. Compare snapshots in your own system by `postId`, `commentId` or `userId` and `fetchedAt`.

### API, export and integrations

Start the Actor with the [Apify API](https://docs.apify.com/api/v2/act-runs-post) using the same JSON input. When the run ends, read the default Dataset and the `RUN_SUMMARY` record. Export as JSON, CSV, Excel or XML from the Dataset. `images`, `hashtags` and `mentions` are lists; in CSV they become several columns.

Apify webhooks, Make, Zapier and n8n can start runs and pass the Dataset ID on. Use `postId` as the key for posts, `commentId` for comments and `userId` for profiles.

#### Use with AI agents (MCP)

Add `https://mcp.apify.com?tools=cliqtomedia/weibo-scraper` to your MCP client. A small input:

```json
{ "mode": "search", "keywords": ["苹果"], "maxPosts": 10 }
```

Read `text`, `url`, `likes`, `reposts`, `comments`, `hashtags` and `createdAt`. This run took about 8 seconds and costs $0.034 on the Free plan. Check `RUN_SUMMARY.status` before you treat a partial run as complete.

### Limitations and partial results

- Weibo search is live: the same keyword gives different posts minutes later. Use `startDate` and `endDate` for repeatable windows.
- Weibo shows guests only about the latest 10 posts of a user. For older posts of an account, search by its name or topic with dates.
- Guests see up to about 40 comments per post (hot first, then latest). Replies to comments are counted in `replies` but not collected.
- Counters over one million are shown by Weibo as "100万+"; the row then has `1000000` and `countsCapped: true`.
- Video and avatar links are signed by Weibo's CDN and stop working after about 1–3 hours. Download media soon after the run if you need it. Image links do not expire.
- Posts that are deleted, private, follower-only or hidden from guests get status `not_found`.
- The Actor waits about 1 second between requests on each of 3 guest sessions to stay polite.
- Bios can hold contact details. E-mail addresses and phone numbers are removed from bios and texts of profiles; treat the rest of the data as personal data.
- This Actor is not affiliated with or endorsed by Weibo or Sina. It reads public data only, without login. Use the data in line with [Weibo terms](https://weibo.com/signup/v5/protocol) and local law, and respect the privacy of users and commenters.

### Troubleshooting

| Symptom                              | Possible reason                                     | Check                               | Action |
| ------------------------------------ | --------------------------------------------------- | ----------------------------------- | ------ |
| Run fails with "Invalid input"       | Missing list for the mode, or a value over a limit  | The message in the run log          | Use an example above and change one field at a time. |
| `NO_RESULTS`                         | No posts for the keyword in the date range          | Search the keyword on weibo.com     | Widen the dates or change the keyword. |
| `NOT_FOUND`, no data rows            | Posts or users do not exist or are hidden from guests | The status row                    | Open the link in a browser while logged out. |
| `INVALID_INPUT` for a user name link | `weibo.com/name` links are not supported            | The status row                      | Open the profile and copy the numeric ID from `weibo.com/u/<id>`. |
| Partial `CHARGE_LIMIT`               | Your maximum cost per run was reached               | `counts.chargedRows` in Run summary | Raise the limit if you need more rows. |
| Partial `TIME_LIMIT`                 | Too much work for the run timeout                   | Status message                      | Raise the timeout or split the input into several runs. |
| Partial `SOURCE_ERROR`               | Weibo refused or failed repeatedly                  | `http.blocked` in Run summary       | Run again later; keep the default Apify Proxy. |
| Video link gives 403                 | The signed CDN link expired                         | `fetchedAt` of the row              | Run again and download the video right away. |

### FAQ

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

No. The Actor uses public guest access. Do not add your cookies.

#### Can I get posts older than the latest 10 of a user?

Not in user mode, because Weibo hides them from guests. Search mode with `startDate` and `endDate` reaches older posts by keyword.

#### Are short IDs and numeric IDs both supported?

Yes. `RipiMbvb3`, `5343871682741457` and the full link point to the same post, and the Actor saves and charges it once.

#### Why did a search return fewer rows than `maxPosts`?

Weibo had fewer posts for that keyword in the date range.

#### Do empty runs cost money?

Only the start fee of $0.009. Inputs that are not found do not create paid rows.

#### Is the data the same as on the website?

Yes, it comes from the same public pages. Counters change quickly, so values can differ a little minutes later.

### Related Actors

- [Bluesky Scraper](https://apify.com/cliqtomedia/bluesky-scraper) — public Bluesky posts, profiles, feeds and threads.
- [YouTube Comments Scraper](https://apify.com/cliqtomedia/youtube-comments-scraper) — public comments for YouTube videos.
- [YouTube Subtitles & Transcript Scraper](https://apify.com/cliqtomedia/youtube-transcript-scraper) — transcripts for selected YouTube videos.

### Support

Use the Actor's **Issues** tab for questions or bugs. Include the run ID and the error code from the Run summary. Do not send API tokens or cookies.

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/weibo-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

search: posts for keywords, newest first, with an optional date range. user: profiles and their latest posts. post: details of posts by link or ID.

## `keywords` (type: `array`):

Used in search mode. Up to 20 keywords or hashtags, Chinese or English (苹果, 华为, #topic#).

## `userIds` (type: `array`):

Used in user mode. Up to 100 numeric user IDs (1669879400) or https://weibo.com/u/<id> / https://m.weibo.cn/u/<id> links. Custom names like weibo.com/name are not supported.

## `postIds` (type: `array`):

Used in post mode. Up to 250 entries: https://m.weibo.cn/detail/<id>, https://weibo.com/<uid>/<short id>, a numeric ID (5354246193283620) or a short ID (RmLbRdMdC). Short t.cn links are not supported.

## `maxPosts` (type: `integer`):

Search: posts per keyword (up to 5,000). User: posts per user; Weibo shows guests only the latest ~10 posts of a user. Not used in post mode.

## `startDate` (type: `string`):

Search mode only. Oldest day to include, YYYY-MM-DD, in Beijing time. Empty means no lower limit.

## `endDate` (type: `string`):

Search mode only. Newest day to include (the whole day), YYYY-MM-DD, in Beijing time. Empty means up to now.

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

Also save comments of each post: the hot comments first, then the latest. Each comment is one result row.

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

Used with Include comments. Weibo shows guests up to about 40 comments per post.

## `includeProfile` (type: `boolean`):

User mode: save one profile row per user with exact follower, following and post counts.

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

Apify Proxy datacenter IPs work for Weibo. Change only if you see blocks.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "苹果"
  ],
  "maxPosts": 10,
  "includeComments": false,
  "maxCommentsPerPost": 20,
  "includeProfile": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `posts` (type: `string`):

Post rows as a table.

## `profiles` (type: `string`):

Profile rows as a table.

## `comments` (type: `string`):

Comment rows as a table.

## `runSummary` (type: `string`):

Status, per-input results, counts and request statistics.

# 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 = {
    "mode": "search",
    "keywords": [
        "苹果"
    ],
    "maxPosts": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/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 = {
    "mode": "search",
    "keywords": ["苹果"],
    "maxPosts": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/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 '{
  "mode": "search",
  "keywords": [
    "苹果"
  ],
  "maxPosts": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cliqtomedia/weibo-scraper --silent --output-dataset

```

## MCP server setup

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