Weibo Scraper: Posts, Search, User Profiles & Comments
Pricing
$4.00 / 1,000 item returneds
Weibo Scraper: Posts, Search, User Profiles & Comments
Export Weibo posts by keyword, a user's profile and posts, single posts by URL, and their comments, from the logged-out m.weibo.cn and weibo.com web APIs. Full text for long posts, pictures, video URLs. No Weibo login or cookies needed.
Pricing
$4.00 / 1,000 item returneds
Rating
0.0
(0)
Developer
Changefeeds Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
A Weibo scraper from Changefeeds Tools. Search Weibo (新浪微博) by keyword,
export a user's profile and posts, fetch single posts by URL, and pull the
comments on any of them. It reads the same m.weibo.cn and weibo.com web
APIs a logged-out browser uses, with the anonymous visitor cookie Weibo hands
every visitor. No Weibo account, no cookies from you, no login.
Who it's for: brand and market researchers tracking Chinese social media, analysts watching a public figure's or company's account, and anyone who needs Weibo posts as clean JSON without maintaining a Weibo client of their own.
What you get
- Posts with full text (long posts that Weibo truncates are expanded with one extra request), the original HTML, repost/comment/like counts, picture URLs, the video URL and cover, the author, a summary of the reposted post, the posting client and the region Weibo shows ("发布于 上海").
- User profiles with exact follower/following/post counts, verification and its reason, gender, location, description and avatar.
- Comments (top-level, Weibo's hot order) with author, likes, reply count, floor number and region.
Input
You can mix the three kinds of input in one run.
| Field | Type | Default | What it does |
|---|---|---|---|
searchKeywords | list of strings | none | Each keyword returns up to maxItems posts from Weibo search. |
users | list of strings | none | Each user returns one profile row plus up to maxItems of their posts. Accepts 1669879400, weibo.com/u/<uid>, weibo.com/<uid>, weibo.com/<custom domain>, weibo.com/n/<screen name>, m.weibo.cn/u/<uid>, m.weibo.cn/profile/<uid>, @<screen name>. |
postUrls | list of strings | none | Each returns one post row. Accepts weibo.com/<uid>/<bid>, m.weibo.cn/detail/<mid>, m.weibo.cn/status/<bid>, weibo.com/detail/<mid>, or a bare mid (5348645916642028) or bid (Rkpv9rRTu). The two id forms are converted into each other for you. |
includeComments | boolean | false | Also return comments for every post the run returns. |
maxItems | integer | 50 | Max posts per keyword and per user (1 to 1,000). |
maxComments | integer | 20 | Max comments per post (1 to 1,000). |
proxy | proxy settings | Apify residential | See Limits. Proxy traffic is included in the price. |
{ "users": ["1669879400"], "maxItems": 10 }
{ "searchKeywords": ["华为"], "maxItems": 100 }
{ "postUrls": ["https://weibo.com/1669879400/Rkpv9rRTu"], "includeComments": true, "maxComments": 45 }
Sample output
From a live run on 2026-09-30 (long text and URLs shortened here). A post
row:
{"type": "post","id": "5348645916642028","mid": "5348645916642028","bid": "Rkpv9rRTu","url": "https://weibo.com/1669879400/Rkpv9rRTu","createdAt": "2026-09-29T16:40:22.000Z","text": "#烈士纪念日#,铭记历史,缅怀先烈,吾辈自强!","textHtml": "<a href=\"https://m.weibo.cn/search?containerid=231522type...","isLongText": false,"fullTextFetched": false,"reposts": 11291,"comments": 13213,"likes": 87099,"countsCapped": false,"pics": [],"videoUrl": null,"videoCover": null,"user": { "id": "1669879400", "screenName": "Dear-迪丽热巴", "followers": null, "followersText": "8255万", "verified": true },"retweeted": {"id": "5348560276032588","bid": "Rknh1pjlO","url": "https://weibo.com/2803301701/Rknh1pjlO","createdAt": "2026-09-29T11:00:03.000Z","text": "【#烈士纪念日#,发条微博,缅怀先烈】9月30日,#国庆节的前一天是烈士纪念日#。...","user": { "id": "2803301701", "screenName": "人民日报" },"reposts": 523038,"comments": 5884,"likes": 34643},"source": null,"region": "法国","input": "https://weibo.com/1669879400/Rkpv9rRTu","inputType": "post","scrapedAt": "2026-09-30T05:25:53.969Z"}
A user row:
{"type": "user","id": "1669879400","screenName": "Dear-迪丽热巴","url": "https://weibo.com/u/1669879400","description": "一只喜欢默默表演的小透明。工作联系jaywalk@jaywalk.com.cn 🍒","followers": 82550167,"followersText": "8255万","following": 294,"statusesCount": 1934,"verified": true,"verifiedType": 0,"verifiedReason": "嘉行传媒签约演员","gender": "f","location": "上海","avatar": "https://tvax1.sinaimg.cn/crop.0.0.1080.1080.1024/63885668ly8geyrcrw0zjj20u00u0mz6.jpg?...","customDomain": null,"input": "1669879400","scrapedAt": "2026-09-30T05:23:12.391Z"}
A comment row:
{"type": "comment","id": "5348546372437370","postId": "5348478804824358","postBid": "Rkl9Ckf2e","createdAt": "2026-09-29T10:04:49.000Z","text": "我怎么我今天去线下,promax是12g开头啊🙀","textHtml": "我怎么我今天去线下,promax是12g开头啊🙀","likes": 1,"replies": 5,"floor": 11,"region": "浙江","user": { "id": "7875740762", "screenName": "共鸣198108", "followers": 73, "verified": false },"scrapedAt": "2026-09-30T05:24:40.125Z"}
A failed input gets one free status row instead, and the run carries on:
{ "type": "status", "input": "Qa1b2c3d4", "inputType": "post", "status": "not_found", "error": "Post not found (deleted, private, or never existed).", "checkedAt": "2026-09-30T05:26:04.091Z" }
status is not_found, invalid (not a uid, URL or id this actor
recognises), blocked (Weibo still asked for a login after a fresh visitor
cookie and every proxy rotation), or error (any other failure).
The key-value store record OUTPUT summarises the run: rows by type, the
charged count, stopped_reason, HTTP requests, proxy rotations, response
bytes, and a truncated list naming every keyword, user or post that returned
fewer rows than you asked for, with the reason (logged_out_limit,
max_total_charge_reached, repeated_cursor or error). Every run leaves at
least one dataset row.
A few field notes:
user.followerson post rows isnullwhen Weibo only gives a rounded figure there ("8255万"); the rounded string is infollowersText. Theuserprofile row has the exact count.countsCapped: truemeans Weibo reported reposts or comments as exactly 1,000,000, its "100万+" display cap: the real count is at least that.- Picture and avatar URLs are Weibo's CDN links; video URLs are signed and expire after a few hours, so download promptly if you need the files.
Pricing
Pay per event, nothing else: $0.004 per item returned ($4 per 1,000
post, user or comment rows). Proxy traffic is included in the price.
Failed inputs (not_found, invalid, blocked, error) are never charged.
If you set a maximum total charge for the run, the actor stops before fetching
pages it could not sell, and says so in OUTPUT.stopped_reason
("max_total_charge_reached").
Limits, stated plainly
- Logged-out Weibo only shows so much, and this actor never logs in. Weibo
serves the first page of each feed to visitors and asks for a login from
page 2 on. So:
- Search returns at most what the first page of six search tabs (top, latest, hot, pictures, videos, one more) contain, merged and de-duplicated. For "华为" that was 87 distinct posts; niche keywords give fewer.
- User posts come from the first page of the user's timeline and profile
tabs (roughly the newest 10 to 25 posts of any kind), then from their
video wall, which does paginate logged-out. Beyond the first couple of
dozen posts you therefore get video posts only; older text-only and
photo posts are not reachable without a login. The run reports this in
OUTPUT.truncatedaslogged_out_limit. - Comments come from weibo.com's paginated comments endpoint (top-level
comments, hot order). Replies to comments are not returned as rows (the
repliesfield counts them). If that endpoint fails, the actor falls back to the mobile hot-comments feed, which gives only its first page.
- Reposted posts are summarised from what Weibo sends with the repost; a long original is not expanded.
- Rate limits and login walls. Weibo issues its visitor cookie per IP and
rate-limits by IP. When it answers "login required" (
ok: -100, a redirect to passport.weibo.com, "请登录后使用") or HTTP 418, the actor gets a fresh visitor cookie, then moves to a new proxy session with a new cookie, up to 8 times for that request, and only then gives up that input with a freeblockedrow. Residential proxy is the default for that reason. - Counts are a snapshot, and Weibo itself caps displayed reposts and
comments at 1,000,000 (see
countsCapped). - Polite by design: about 400 ms between requests, at most two inputs in flight, HTTP 429/5xx retried with backoff (Retry-After honoured up to 60 s, 3 retries), 20 s timeouts, and a normal desktop Chrome User-Agent with the site's own Referer. No CAPTCHA solving, no accounts.
- Public data only. Private accounts, deleted posts and anything that needs a login are out of scope.
FAQ
Do I need a Weibo account or cookie? No. The actor gets Weibo's anonymous visitor cookie itself, the same way a browser does on its first visit.
Why did a keyword return fewer posts than maxItems? Logged-out Weibo
search only serves the first page of each tab. OUTPUT.truncated says so.
Can I get a user's full history? Their newest posts plus their full video history, yes. Older text and photo posts need a logged-in session, which this actor does not use.
What is the difference between mid and bid? The same post id in two
encodings: mid is numeric (5348645916642028), bid is the base62 form in
weibo.com URLs (Rkpv9rRTu). Both are on every post row.
Local development
pnpm --filter @mmnm/weibo test # unit tests, no networkpnpm --filter @mmnm/weibo build
node src/main.ts runs the actor locally with Apify's local storage
(APIFY_LOCAL_STORAGE_DIR);
ACTOR_TEST_PAY_PER_EVENT=true ACTOR_MAX_TOTAL_CHARGE_USD=1