Weibo Scraper: Posts, Comments & Hot Search
Pricing
from $8.00 / 1,000 post scrapeds
Weibo Scraper: Posts, Comments & Hot Search
Scrape public Weibo (微博) posts by keyword or account, full comment threads with commenter region and floor number, public profiles and the live hot search list. Video play counts, edit counts, AI labels and expanded links included. No login. Export CSV, Excel or JSON.
Pricing
from $8.00 / 1,000 post scrapeds
Rating
0.0
(0)
Developer
CHEN-SHU-CHEN
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
What is Weibo Scraper?
Weibo (微博) is where Chinese public opinion moves first, and its web pages are built for scrolling, not for counting. Copying posts, comments and numbers into a spreadsheet by hand stops working after a few dozen.
This Actor reads public Weibo data without a login and gives you clean rows:
- Posts by keyword — Weibo's real-time search, newest first.
- Posts by account — an account's recent posts, plus its public profile.
- Posts by URL, with their comments — every comment with the commenter's region (来自 X), its floor number, its like count and whether the post's author liked it, plus replies if you want them.
- The hot search list (微博热搜) — the live top 50 with heat values, labels and the pinned entry.
Every post row carries what makes Weibo data useful beyond the text: video play counts, how many times the post was edited, AI-generated / reposted content labels, t.cn short links expanded to where they point, all picture sizes and video files, hashtags, mentions, the province it was posted from, and the full original when it is a repost.
Because it runs on Apify, you can schedule a daily keyword or hot-search snapshot, call it from the API, connect it to Make, Zapier or Google Sheets, and export as CSV, Excel or JSON.
How to scrape Weibo
- Open the Input tab. Fill in any of the sections; they all work together in one run.
- Search keywords:
瑞幸咖啡,#新能源汽车#, a brand name. - Accounts:
1669879400,https://weibo.com/u/1669879400or@Dear-迪丽热巴. - Post URLs:
https://weibo.com/1669879400/RlZog45URorhttps://m.weibo.cn/detail/5352408760976057. - Hot search: tick the box.
- Search keywords:
- Set how many posts and comments you want. Each row is charged, so the limits are also your budget.
- Click Start. The prefilled example (10 posts, one post with 10 comments, the hot search list) finishes in about half a minute.
- Open the Output tab. There is one view per row type: Posts, Comments, Profiles, Hot search, and Inputs with no rows. A view picks the columns, not the rows: rows of other types appear in it with those columns empty, so filter on
typewhen you export.
What data does it return?
Every row has a type (post, comment, profile, trend or status), the input that produced it, and scrapedAt. Times are ISO-8601 in Beijing time (2026-10-18T11:35:55+08:00). Counts are numbers. A value Weibo does not show is null, never a made-up 0.
Posts (type: "post")
| Field | Notes |
|---|---|
mid, bid, url | Numeric ID, short ID and link |
createdAt | When it was posted |
text, textHtml | Plain text and Weibo's HTML |
isLongText, textExpanded | Long posts are cut short in feeds; with Expand long posts on, the full text is fetched |
repostsCount, commentsCount, likesCount | Exact numbers |
countsCapAt, cappedCounts | Weibo stops counting publicly at 1,000,000 ("100万+"). A count at the cap is listed in cappedCounts, so you know it is a lower bound |
videoPlayCount, videoPlayCountText | Video plays as a number, and Weibo's text ("10.5万次观看") |
videos | Every video: title, duration, play count, cover, every quality's file URL |
pics | Every picture with all sizes Weibo serves (thumbnail to mw2000), live-photo videos included |
editCount, isEdited | How many times the author edited it |
aiTags | Weibo's labels such as "博主声明:该内容使用AI生成技术" (AI-generated) or "内容为转载" (reposted content) |
contentLabels | Declarations such as "自主创作" (original work) |
links | Every link with the t.cn short link, the expanded long URL and its title |
hashtags, topics, superTopic, mentions | |
regionName, regionRaw | "河北" from "发布于 河北": the province the post was published from |
source | Device or client, e.g. "iPhone 18 Pro" |
card, audio | Attached topic, live stream or web card; attached audio |
isRepost, retweetedStatus | The original post, with all the same fields |
isAd, isPaid, coAuthors | |
author | uid, screenName, profileUrl, avatarUrl, verified, verifiedType, verifiedReason, memberRank, followersCount (see below) |
Feeds do not include an author's follower count, so author.followersCount is null unless you turn on Add author profiles to posts.
Comments (type: "comment")
| Field | Notes |
|---|---|
id, postMid, postUrl | |
level, rootId, replyToCommentId, replyToUser | level 0 is a comment, 1 a reply |
createdAt, text, textHtml | Emoticons kept as [name] |
likesCount, repliesCount | |
region, regionRaw | "福建" from "来自 福建": where the commenter posted from |
floorNumber | The comment's floor (楼) under the post |
isLikedByMblogAuthor | Whether the post's author liked this comment |
picUrls, links | Pictures attached to the comment, links in it |
previewReplies | The first replies Weibo shows under a comment, nested (free) |
author | The commenter's public account fields, as for posts |
Profiles (type: "profile")
uid, screenName, profileUrl, customUrl, avatarUrl, coverImageUrl, description, location, ipLocation, followersCount (+ followersCountText such as "8255.1万"), followingCount, postsCount, totalInteractions, totalLikes, totalComments, totalReposts, verified, verifiedType, verifiedReason, memberRank, isSvip, website, registeredAt, sunshineCredit, and Weibo's influence labels ("V指数 文娱 87.49分", "近30天视频播放量240.2万").
Hot search (type: "trend")
rank, position, word, note, query, url (the search page), hotValue, label (新, 热, 沸, 爆), category, isTopic, isAd, isPinned, isGovernment, capturedAt. Ads in the list are kept, marked isAd, and have no rank.
Inputs with no rows (type: "status")
Every input is accounted for. An input that produced no rows, or stopped early, gets a free row with status and a plain error:
no_results, not_found, invalid_input, duplicate_input, blocked, partial, parse_error, not_processed. The key-value store record INPUT_SUMMARY lists every input with its status and row count.
How much does it cost to scrape Weibo?
You pay per row, and nothing for time spent waiting on Weibo.
| Event | Price | Per 1,000 |
|---|---|---|
Post (post-scraped) | $0.008 | $8 |
Comment or reply (comment-scraped) | $0.004 | $4 |
Profile (profile-scraped) | $0.008 | $8 |
Hot search entry (trend-scraped) | $0.002 | $2 |
Run start (apify-actor-start, per GB of memory) | $0.001 | — |
Examples: 500 keyword posts cost $4. One post with 1,000 comments costs $4.008. A daily hot-search snapshot (about 52 entries) costs about $0.10.
Status rows, posts or comments Weibo served in a broken shape (skipped and counted in the input's error), expanded long text, the preview replies nested under each comment, reposts you chose to skip and residential proxy traffic are free. A post that appears under two keywords is written, and charged, once.
How do I cap what a run can spend?
Set a maximum cost per run in the run options. Before each page it checks that the limit can still pay for a row, and rows are written and charged together, so a page that only partly fits writes and charges just the rows that fit. Inputs it did not get to come back as not_processed rows. If writing or charging fails, the run stops instead of working unpaid, and the charge is not sent a second time.
You are never charged for a row that is not in your dataset. If Apify moves the run to another server mid-way, the restarted run checks its dataset and does not write or charge a row a second time.
Input example
{"keywords": ["瑞幸咖啡"],"maxPostsPerKeyword": 100,"users": ["1669879400"],"maxPostsPerUser": 20,"postUrls": ["https://weibo.com/1669879400/RlZog45UR"],"maxCommentsPerPost": 200,"commentsSort": "hot","includeHotSearch": true}
Limits worth knowing
- Keyword search reaches about 1,000 posts per keyword, newest first: about 24 pages. For a busy keyword that is the last few hours. Weibo's own "hot" and date filters live on s.weibo.com, which refuses logged-out visitors, so there is no sort option; use Only posts published on or after to cut old posts.
- Account posts can have gaps. Logged out, Weibo refuses the account timeline itself, so posts come from Weibo's search index of that account. It returns about 50 posts a page and goes back years, but it can skip posts: for one account we tested, the index held 1,018 of its 1,937 posts. Use it for recent activity and trends, not as a complete archive.
- Reposts of a post (转发列表) are not available logged out; the repost count is.
- Custom profile addresses (weibo.com/name) cannot be resolved logged out. Use the numeric ID or @screen name.
- Counts of 1,000,000 or more are lower bounds, because Weibo shows "100万+". They are flagged in
cappedCounts. - The original inside a repost is not expanded when it is long:
retweetedStatus.textis Weibo's preview. Pass itsurlunder Post URLs for the full text. - Picture and video URLs are signed and expire after a while (the
Expiresparameter). Download files you need soon after the run. - Weibo throttles visitors. When it answers "前方有点拥堵", the Actor waits, takes a new IP and a new visitor cookie, and retries. If datacenter IPs keep getting refused, it moves to residential IPs for the rest of the run, at no extra cost to you. Failures are reported per input rather than crashing the run.
- This reads undocumented web JSON, which Weibo can change without notice. If a response no longer has the expected shape, the input is reported as
parse_errorrather than writing wrong data.
Privacy and responsible use
This Actor reads only what Weibo shows any logged-out visitor. It does not log in, and takes no cookies or credentials.
To keep personal data to what an analysis needs:
- Post and comment authors come with their public account fields only: name, link, avatar, verification and follower count. No gender, bio or location for people who are not the subject of your request.
- Email addresses and phone numbers are removed from all text (posts, comments, bios) and replaced with
[email removed]/[phone removed]. This is the input Mask emails and phone numbers (maskContactInfo), on by default. Turn it off only if you have a lawful basis to process contact details; the text is then kept exactly as posted. - Exact GPS coordinates that Weibo attaches to some posts are dropped; only the province label ("发布于 河北") is kept.
- Profiles carry account information only: no gender, birthday, school or employer.
Public posts and comments are still personal data under laws such as China's PIPL and the EU's GDPR. You are responsible for having a lawful basis for collecting and using this data, for how long you keep it, and for respecting Weibo's terms. This is not legal advice.
FAQ
Why did an input come back blocked?
Weibo refused every retry, on fresh IPs and visitor cookies. It happens in waves; run it again later. If many inputs in a row are refused, the run stops early (see Stop after this many refused inputs in a row) and the rest come back not_processed, free.
Why is a post not_found?
It was deleted, made private, or restricted by Weibo; or the link is mistyped. Weibo's own message is in error.
Can I get comments for posts found by keyword?
Run the keyword search first, then pass the url of the posts you care about into Post URLs in a second run. This keeps keyword runs cheap.
Why is memory limited to 1 GB?
The Actor reads JSON over plain HTTP and needs little memory; 512 MB is the default. More would not make it faster, only more expensive.
Something broke or a number looks wrong
Open an issue on the Issues tab with the input and the run link.