Weibo Scraper: Posts and Profiles by User ID
Pull Weibo posts and profile data by numeric user ID: text, repost and like counts, images, follower stats. Why a China residential IP is mandatory, not optional.
The actor referenced in this article. Pay only for results delivered.
Weibo is the main Chinese microblogging platform, and for brand monitoring, KOL tracking and competitor watching in the China market it is where the public conversation happens. The problem is that almost every scraping guide for it is wrong in the same way, and the failure mode misleads you.
Weibo blocks non China IP addresses at the connection level. Not with a 403, not with a captcha, and not with a login wall. The connection simply times out before Weibo’s application layer ever sees the request. So a script that works perfectly in principle produces timeouts, and the natural conclusion is that your parser is broken or that you have been detected as a bot. Neither is true. You are just not in China.
Try it live: Weibo Scraper: Posts and Profiles by User ID. Pay only for results delivered, no result no charge.
The Weibo Scraper handles the routing as part of the run, so the interesting part is left to you.
What you get
Two row types, distinguished by record_type.
post-scraped, one per post:
| Field | Notes |
|---|---|
post_id | Stable post identifier |
text | Post body |
published_at | Publication timestamp |
source_client | The device or client string Weibo attaches, for example iPhone or Android |
reposts_count, comments_count, likes_count | The three engagement metrics Weibo exposes |
image_urls | Attached images, as an array |
profile-scraped, optional, one per user: display name, follower count, verification status and bio. Off by default because it costs one extra request per user, and most monitoring runs only need the posts.
Finding a user ID
Open the profile in a browser. The URL contains the numeric ID:
https://weibo.com/u/1699432410
^^^^^^^^^^ this is what you pass
Store the numeric ID rather than the handle. Display names on Weibo change, the numeric ID does not.
Tracking engagement over time
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/weibo-scraper").call(run_input={
"profileIds": ["1699432410"],
"maxPostsPerProfile": 50,
"includeProfileInfo": True,
"proxyConfiguration": {
"useApifyProxy": True,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "CN",
},
})
posts = []
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row.get("record_type") == "profile-scraped":
print(f"{row.get('screen_name')}: {row.get('followers_count'):,} followers")
elif row.get("record_type") == "post-scraped":
posts.append(row)
posts.sort(key=lambda p: p.get("likes_count") or 0, reverse=True)
for p in posts[:5]:
print(f"{p['likes_count']:>7} likes {p['text'][:70]}")
Run this on a schedule and store by post_id. Because engagement counts move after publication, re-reading the same posts over several days tells you how a post actually performed rather than how it started.
Cost reality
This is the one actor in this batch that needs a paid proxy tier, because China residential routing is not optional. That makes it more expensive to run than a no proxy actor, and the pricing reflects it. It is still far cheaper than a browser based approach, because the actor talks to JSON endpoints rather than rendering pages.
If a run returns nothing, check the proxy first. A timeout with zero posts and no error is the signature of a request that never reached China, not of a parsing problem.
Pricing
Pay per result delivered, from $2.25 per 1,000 on higher Apify plans and $3.00 per 1,000 on the free plan. Posts and profile rows are priced identically. A profile that yields nothing is not charged.
Use it from an AI agent
https://mcp.apify.com/?tools=themineworks/weibo-scraper
Related
- Bilibili Scraper for Chinese long form video and creator data
- Threads Scraper for the equivalent western microblog conversation
- Twitter/X Scraper for cross platform brand monitoring
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Why does scraping Weibo need a China IP? +
Weibo refuses connections from outside China before the request reaches its application layer. You do not get a 403 or a captcha, you get a timeout, which is why non China attempts look like a broken scraper rather than a geo block. The actor routes through China residential IPs so requests actually land.
What do I pass in, a username or an ID? +
The numeric user ID, not the display name. Weibo profile URLs contain it, for example weibo.com/u/1699432410 where 1699432410 is the ID. Numeric IDs are stable across display name changes.
Can I search Weibo by keyword? +
This actor works from user IDs, which is the reliable path for tracking known accounts such as competitors, KOLs or your own brand. Keyword search on Weibo is heavily rate limited and gives inconsistent coverage, so it is not something to build a monitoring product on.
GitHub Repo Intelligence: Vet Any Dependency Before You Add It
Pull stars, forks, contributors, commit recency, latest release and full README for any public GitHub repo in one call. No token required, MCP-ready for agents doing dependency checks.
Bilibili Scraper: Video, Creator and Search Data in Python
Pull Bilibili videos by keyword, URL or creator ID: titles, view and like counts, duration, author stats. Plain HTTP, no cookies, no login required.
SEEK Jobs Scraper: Australian Job Listings in Python
How to pull SEEK.com.au job listings by keyword, location, work type and salary band in Python: title, company, salary range, apply link, no login or API key.