<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sami</title>
    <description>The latest articles on DEV Community by Sami (@sami_8858131362756585e4f4).</description>
    <link>https://dev.to/sami_8858131362756585e4f4</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3877584%2F63d2c24c-ec4e-457f-8a71-2b79bb969554.png</url>
      <title>DEV Community: Sami</title>
      <link>https://dev.to/sami_8858131362756585e4f4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sami_8858131362756585e4f4"/>
    <language>en</language>
    <item>
      <title>We asked China's most-used AI about 5 global brands. Two of them are missing from half the answers.</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Sun, 28 Jun 2026 17:14:03 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/we-asked-chinas-most-used-ai-about-5-global-brands-two-of-them-are-missing-from-half-the-answers-42a6</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/we-asked-chinas-most-used-ai-about-5-global-brands-two-of-them-are-missing-from-half-the-answers-42a6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — We asked &lt;strong&gt;DeepSeek&lt;/strong&gt; (one of the AI engines hundreds of millions of Chinese consumers now ask instead of searching) the same buyer questions you'd ask any assistant — "what are the best running shoes?", "which EV should I buy?" — for five global brands. The result: visibility on China's AI is &lt;strong&gt;wildly uneven&lt;/strong&gt;. Nike, Apple and Tesla show up in 100% of relevant answers; &lt;strong&gt;Starbucks appeared in only 50%&lt;/strong&gt;, and &lt;strong&gt;McDonald's was the top pick just 1 out of 3 times&lt;/strong&gt; (KFC keeps beating it). In every category, Chinese challengers quietly surface. If you only track ChatGPT/Gemini, you can't see any of this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why we ran this
&lt;/h2&gt;

&lt;p&gt;"GEO" — generative engine optimization, i.e. making sure AI assistants mention your brand — is the new SEO. But almost every GEO tool tracks only the Western engines (ChatGPT, Gemini, Claude). Meanwhile, in China, &lt;strong&gt;900M+ people now ask AI assistants&lt;/strong&gt; like DeepSeek, Qwen, Kimi and GLM for product recommendations. That's a blind spot for any brand selling into — or competing in — the China market.&lt;/p&gt;

&lt;p&gt;So we ran a quick pilot with our own tool, the &lt;a href="https://apify.com/zhorex/ai-brand-visibility-monitor" rel="noopener noreferrer"&gt;AI Brand Visibility Monitor&lt;/a&gt;, across five categories, asking DeepSeek the kind of questions real buyers ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Western brand&lt;/th&gt;
&lt;th&gt;Appeared in&lt;/th&gt;
&lt;th&gt;Ranked #1&lt;/th&gt;
&lt;th&gt;Sentiment&lt;/th&gt;
&lt;th&gt;Chinese rivals surfacing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sportswear&lt;/td&gt;
&lt;td&gt;Nike&lt;/td&gt;
&lt;td&gt;4/4 (100%)&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;+1.0&lt;/td&gt;
&lt;td&gt;Li-Ning, Anta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smartphones&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;4/4 (100%)&lt;/td&gt;
&lt;td&gt;3/4&lt;/td&gt;
&lt;td&gt;+0.75&lt;/td&gt;
&lt;td&gt;Huawei, Xiaomi, Oppo, Vivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electric vehicles&lt;/td&gt;
&lt;td&gt;Tesla&lt;/td&gt;
&lt;td&gt;4/4 (100%)&lt;/td&gt;
&lt;td&gt;3/4&lt;/td&gt;
&lt;td&gt;+1.0&lt;/td&gt;
&lt;td&gt;BYD, NIO, XPeng, Li Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast food&lt;/td&gt;
&lt;td&gt;McDonald's&lt;/td&gt;
&lt;td&gt;3/4 (75%)&lt;/td&gt;
&lt;td&gt;1/3&lt;/td&gt;
&lt;td&gt;+1.0&lt;/td&gt;
&lt;td&gt;KFC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coffee&lt;/td&gt;
&lt;td&gt;Starbucks&lt;/td&gt;
&lt;td&gt;2/4 (50%)&lt;/td&gt;
&lt;td&gt;1/2&lt;/td&gt;
&lt;td&gt;+1.0&lt;/td&gt;
&lt;td&gt;Luckin Coffee, Manner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Sentiment is a −1…+1 score on the mention; "Appeared in" = share of the four category prompts where the brand was named at all; "Ranked #1" = how often it was the first brand named.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three takeaways:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Being mentioned is not the same as being recommended.&lt;/strong&gt; McDonald's appeared in most answers but was the &lt;em&gt;top&lt;/em&gt; pick only once in three — KFC, the runaway fast-food leader in China, kept taking the #1 spot. Tesla and Apple each lost #1 once too, to Chinese rivals (BYD/NIO; Huawei/Xiaomi).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The real risk isn't bad sentiment — it's invisibility.&lt;/strong&gt; Sentiment was positive everywhere (+0.75 to +1.0). The problem for Starbucks isn't that DeepSeek dislikes it; it's that DeepSeek often &lt;strong&gt;doesn't bring it up at all&lt;/strong&gt; (50%), while Luckin Coffee and Manner — its Chinese challengers — do surface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chinese challengers show up in every single category.&lt;/strong&gt; A brand monitoring only Western engines would never see that, in China's AI, Li-Ning, BYD, Huawei, KFC and Luckin are part of the consideration set.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How we measured it (methodology)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engine:&lt;/strong&gt; DeepSeek (this pilot; the tool also covers Qwen, Kimi, GLM and the Western engines).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brands &amp;amp; prompts:&lt;/strong&gt; 5 categories, one focal Western brand each, 4 real buyer-intent prompts per category (category, comparison, recommendation, and direct-brand questions), with the main Chinese competitors supplied for share-of-voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What each "check" returns:&lt;/strong&gt; for one brand × one prompt × one engine — whether the brand was &lt;strong&gt;mentioned&lt;/strong&gt;, the &lt;strong&gt;sentiment&lt;/strong&gt; of that mention, its &lt;strong&gt;rank&lt;/strong&gt; versus the named competitors, &lt;strong&gt;share-of-voice&lt;/strong&gt;, and the &lt;strong&gt;sources&lt;/strong&gt; the engine cited.&lt;/li&gt;
&lt;li&gt;We report outcomes only — what the engines answer, not how the data is gathered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations (so nobody over-reads it)
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;snapshot pilot&lt;/strong&gt;: 5 brands × 4 prompts × 1 engine = 20 checks, single run. AI answers are volatile — studies suggest a large share of brand citations shift month to month — so a single run is a photo, not a movie. The point isn't statistical proof; it's a live demonstration that &lt;strong&gt;AI visibility in China diverges from what Western tools show, and that it's measurable.&lt;/strong&gt; A fuller study (more brands, more engines, weekly tracking) is the obvious next step — which is exactly what the tool is built to do on a schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  See your own brand
&lt;/h2&gt;

&lt;p&gt;Want to know whether DeepSeek, Qwen, Kimi and GLM mention &lt;em&gt;your&lt;/em&gt; brand — and who they recommend instead? The &lt;a href="https://apify.com/zhorex/ai-brand-visibility-monitor" rel="noopener noreferrer"&gt;AI Brand Visibility Monitor&lt;/a&gt; runs this for any brand and prompt set, across Chinese &lt;strong&gt;and&lt;/strong&gt; Western engines, on a schedule. Run it once with no API key for a free sample.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It's the only tool that covers the Chinese AI engines — the engines Profound gates to Enterprise and most mid-market GEO tools don't track at all.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your brand has an AI-search blind spot — and it's in China (DeepSeek, Qwen, Kimi, GLM)</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Sat, 27 Jun 2026 23:53:10 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/your-brand-has-an-ai-search-blind-spot-and-its-in-china-deepseek-qwen-kimi-glm-4heh</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/your-brand-has-an-ai-search-blind-spot-and-its-in-china-deepseek-qwen-kimi-glm-4heh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;TL;DR — When someone asks an AI &lt;em&gt;"what's the best running-shoe brand?"&lt;/em&gt;, that answer is the new shelf placement. There are good tools to track that on ChatGPT/Perplexity/Gemini. There are almost none for the &lt;strong&gt;Chinese&lt;/strong&gt; engines — DeepSeek, Qwen, Kimi, GLM — where 900M+ people now ask instead of searching. I built one that does both in a single run. &lt;a href="https://apify.com/zhorex/ai-brand-visibility-monitor" rel="noopener noreferrer"&gt;Try it on Apify.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The shelf moved into the answer
&lt;/h2&gt;

&lt;p&gt;Search is being replaced by &lt;em&gt;answers&lt;/em&gt;. People don't scroll ten blue links anymore — they ask an assistant and take the brands it names. So the question every brand now has to answer is no longer "where do I rank on Google?" but &lt;strong&gt;"do the AI engines even mention me — and how?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That discipline has a name now: &lt;strong&gt;GEO (Generative Engine Optimization)&lt;/strong&gt;. The tooling is real and growing fast. But there's a hole in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The blind spot: the Chinese engines
&lt;/h2&gt;

&lt;p&gt;Every GEO/AI-visibility tool I could find covers the Western engines — ChatGPT, Gemini, and friends. Almost &lt;strong&gt;none&lt;/strong&gt; cover the Chinese ones: DeepSeek, Qwen/Tongyi, Kimi/Moonshot, GLM/Zhipu, where hundreds of millions of people now ask product questions, and where AI already drives a big chunk of product discovery.&lt;/p&gt;

&lt;p&gt;If you sell into China — or your competitors do — that's the part of your AI visibility you literally cannot see today. That gap is the whole reason I built this.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it measures
&lt;/h2&gt;

&lt;p&gt;Give it your &lt;strong&gt;brand&lt;/strong&gt;, the &lt;strong&gt;questions your customers actually ask&lt;/strong&gt;, and the &lt;strong&gt;competitors&lt;/strong&gt; you care about. For every &lt;code&gt;prompt × engine&lt;/code&gt; it returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mentioned?&lt;/strong&gt; — is your brand named in the answer at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment&lt;/strong&gt; — positive / neutral / negative + a −1…1 score (English &lt;strong&gt;and&lt;/strong&gt; Chinese lexicon)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rank&lt;/strong&gt; — where you sit vs the competitors you listed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share of voice&lt;/strong&gt; — you vs rivals in that specific answer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cited sources&lt;/strong&gt; — the URLs the engine surfaced (for search-enabled engines)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer snippet&lt;/strong&gt; — the evidence behind the score&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One record per &lt;code&gt;brand × prompt × engine&lt;/code&gt;. Export JSON/CSV/Excel or pull it into your BI.&lt;/p&gt;

&lt;h2&gt;
  
  
  A monitor, not a one-off
&lt;/h2&gt;

&lt;p&gt;A single snapshot of "does DeepSeek mention me" is nearly worthless, because &lt;strong&gt;AI answers are volatile&lt;/strong&gt; — they move week to week. The value is the &lt;strong&gt;trend&lt;/strong&gt;: did you just drop out of Qwen's answer? did a competitor overtake you on DeepSeek this week?&lt;/p&gt;

&lt;p&gt;Turn on &lt;strong&gt;delta mode&lt;/strong&gt; and put it on a schedule, and each run returns only what &lt;strong&gt;changed&lt;/strong&gt; since last time — so a quiet week costs almost nothing and a real shift surfaces the moment it happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"brand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nike"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"engine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What are the best running shoe brands?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mentioned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sentimentScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rank"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"competitorsMentioned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Adidas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Li-Ning"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"shareOfVoice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"answerSnippet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"For running shoes, the most recommended brands are Adidas, Nike and Li-Ning..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to run it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Set &lt;strong&gt;brand&lt;/strong&gt; and a handful of &lt;strong&gt;prompts&lt;/strong&gt; (the questions your customers ask).&lt;/li&gt;
&lt;li&gt;Pick &lt;strong&gt;engines&lt;/strong&gt; and add your &lt;strong&gt;own API key&lt;/strong&gt; for each in &lt;code&gt;apiKeys&lt;/code&gt; — pure pay-as-you-go, no subscription. (Run it with &lt;strong&gt;no key&lt;/strong&gt; and you get a free labeled &lt;strong&gt;sample&lt;/strong&gt; so you can see the output shape first.)&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;competitorBrands&lt;/strong&gt;, turn on &lt;strong&gt;deltaMode&lt;/strong&gt;, attach a &lt;strong&gt;Schedule&lt;/strong&gt; → a hands-off weekly visibility feed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pricing is pay-per-event: &lt;strong&gt;$0.25 per visibility check&lt;/strong&gt; (1 brand × 1 prompt × 1 engine), small add-ons for delta + competitors. You pay your own LLM usage on your own keys. Far below the $270–$2,000/mo enterprise GEO platforms — and the only one that sees the Chinese engines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://apify.com/zhorex/ai-brand-visibility-monitor" rel="noopener noreferrer"&gt;AI Brand Visibility Monitor on Apify&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you track brand visibility across AI search, which engines/prompts would you most want covered next (Doubao? ERNIE?)? Tell me in the comments and I'll likely ship it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>marketing</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to monitor a brand across 5 Chinese social platforms with Python in 2026 — the cross-platform dedup problem and how to handle it</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Wed, 24 Jun 2026 19:52:18 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/how-to-monitor-a-brand-across-5-chinese-social-platforms-with-python-in-2026-the-cross-platform-5bpc</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/how-to-monitor-a-brand-across-5-chinese-social-platforms-with-python-in-2026-the-cross-platform-5bpc</guid>
      <description>&lt;p&gt;You want to know how a brand is being talked about in China. The catch: the conversation isn't on one platform. It's split across &lt;strong&gt;Weibo&lt;/strong&gt; (microblog), &lt;strong&gt;RedNote / Xiaohongshu&lt;/strong&gt; (product &amp;amp; lifestyle), &lt;strong&gt;Bilibili&lt;/strong&gt; (video), &lt;strong&gt;Douban&lt;/strong&gt; (long-form reviews) and &lt;strong&gt;Xueqiu&lt;/strong&gt; (retail-investor chatter). So you wire up five scrapers — and &lt;em&gt;that's&lt;/em&gt; where the real work starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody warns you about
&lt;/h2&gt;

&lt;p&gt;Pulling each platform is the easy 20%. The other 80% is turning five raw feeds into one trustworthy dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five completely different shapes.&lt;/strong&gt; A "post" on Weibo, a "note" on RedNote, a "video" on Bilibili, a "review" on Douban, a "cashtag comment" on Xueqiu — different fields, different engagement metrics, different date formats. Normalizing them into one table is a chore you redo every time a platform tweaks its response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates everywhere.&lt;/strong&gt; A KOL announces a collab and it's reposted across three platforms; creators cross-post the same clip. Count naively and your "mention volume" is inflated 2–3×, which quietly ruins every trend line and alert you build on top of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five moving targets.&lt;/strong&gt; Each platform changes how it serves public data on its own schedule. Keeping five pipelines alive is five maintenance burdens, not one — and they break on &lt;em&gt;their&lt;/em&gt; calendar, not yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform consistency.&lt;/strong&gt; Sentiment and author-reach have to mean the same thing on every platform, or your dashboard lies to you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the time you've built normalization + cross-platform dedup + sentiment + reach scoring for five platforms — and signed up to maintain it forever — you've built a data-engineering project before you've answered a single business question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shortcut: one call that returns the merged feed
&lt;/h2&gt;

&lt;p&gt;I maintain &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;&lt;strong&gt;Chinese Brand Monitor&lt;/strong&gt;&lt;/a&gt; on Apify. You give it a brand keyword; it returns brand mentions across all five platforms &lt;strong&gt;already normalized into one schema, deduplicated to one canonical record per real mention, sentiment-tagged, and reach-scored&lt;/strong&gt; — so the messy 80% is just… done. Pay-as-you-go at &lt;strong&gt;a few cents per canonical mention&lt;/strong&gt; (see the Actor page for the current rate): no subscription, no seat fee, no annual contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;完美日记&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# Chinese or English
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weibo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rednote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bilibili&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;douban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentimentAnalysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deduplication&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contentSnippet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean rows — platform, author, follower count, engagement, sentiment, URL — straight into pandas / BigQuery / Snowflake / whatever you already run. No five-pipeline zoo to babysit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prefer no code? Start from a ready-made preset
&lt;/h3&gt;

&lt;p&gt;Each common use case is published as a one-click preset — open it, swap in your brand, hit Run (or put it on a daily/hourly schedule so it runs itself):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/chinese-brand-monitor/examples/daily-brand-health" rel="noopener noreferrer"&gt;Daily Brand Health Monitor&lt;/a&gt; — five-platform pulse, once a day&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/chinese-brand-monitor/examples/crisis-watch-hourly" rel="noopener noreferrer"&gt;Crisis Watch&lt;/a&gt; — hourly early-warning when something starts blowing up&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/chinese-brand-monitor/examples/share-of-voice" rel="noopener noreferrer"&gt;Share of Voice&lt;/a&gt; — your brand vs competitors in one run&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/chinese-brand-monitor/examples/spike-watch" rel="noopener noreferrer"&gt;Spike Alert&lt;/a&gt; — flags a surge in mentions the hour it starts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;strong&gt;delta mode&lt;/strong&gt; a scheduled run returns only what's &lt;em&gt;new&lt;/em&gt; since the last one — so a quiet period costs almost nothing, and a daily monitor stays cheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can &lt;em&gt;build&lt;/em&gt; on top of it (i.e. how this makes you money)
&lt;/h2&gt;

&lt;p&gt;This is the point. Cheap, clean, cross-platform China data is a raw material — and there's real margin in turning it into a product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run a China social-listening service.&lt;/strong&gt; Agencies bill brands &lt;strong&gt;monthly&lt;/strong&gt; for "monitor my brand + 3 competitors in China." Your data cost is cents per mention; you sell the insight, the dashboard, and the recurring retainer. The data layer that used to require a &lt;strong&gt;$36K–$50K+/yr&lt;/strong&gt; enterprise tool (Synthesio, Brandwatch, Meltwater) is now a line item — the spread is yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sell an alt-data sentiment feed.&lt;/strong&gt; Funds pay for consumer/retail sentiment on Chinese names &lt;em&gt;ahead of the tape&lt;/em&gt;. Pull daily across a basket, build a &lt;strong&gt;7-day sentiment + mention-volume delta&lt;/strong&gt; per brand/ticker, and sell the series. Costs cents per name per day; replaces a five-figure alt-data subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productize competitor sweeps.&lt;/strong&gt; One-off "how is brand X perceived vs Y in China, across 5 platforms" reports are high-margin consulting deliverables built on a few dollars of data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply AI / LLM teams&lt;/strong&gt; labeled, multi-platform, sentiment-tagged Chinese-language text for training corpora and current-events grounding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every one of these, the data is the cheap input and the &lt;em&gt;insight&lt;/em&gt; is what you charge for — gross margin on the data side sits near the 96% the Actor itself runs at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest comparison (where the big tools still win)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Enterprise (Synthesio / Brandwatch / Meltwater)&lt;/th&gt;
&lt;th&gt;Chinese Brand Monitor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Managed dashboard + alerting&lt;/td&gt;
&lt;td&gt;✅ Built in&lt;/td&gt;
&lt;td&gt;❌ You bring your own BI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global TV / podcast / news&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Chinese social only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account manager / SLA&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Self-serve (issues answered, no SLA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$36K–$50K+/yr, annual contract&lt;/td&gt;
&lt;td&gt;a few cents/mention, pay-as-you-go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw data ownership&lt;/td&gt;
&lt;td&gt;Walled-garden export&lt;/td&gt;
&lt;td&gt;✅ Your dataset, full export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;China platform depth&lt;/td&gt;
&lt;td&gt;Often shallow / add-on&lt;/td&gt;
&lt;td&gt;✅ Five platforms, native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to first data&lt;/td&gt;
&lt;td&gt;Sales cycle + onboarding&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you want a turnkey managed platform with global coverage and a team behind it, buy the enterprise tool. If you want the Chinese social data — cheaply, in your own pipeline, with no contract — this is the layer to build on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realistic cost
&lt;/h2&gt;

&lt;p&gt;Rough order-of-magnitude at a few cents per mention (check the &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;Actor page&lt;/a&gt; for the live rate — the point is the magnitude, not the exact figure):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Ballpark monthly&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One brand, daily, 7-day lookback&lt;/td&gt;
&lt;td&gt;~3K mentions&lt;/td&gt;
&lt;td&gt;low hundreds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-brand agency, daily, sentiment + dedup&lt;/td&gt;
&lt;td&gt;~15K mentions&lt;/td&gt;
&lt;td&gt;mid-hundreds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-ticker fund, daily (Xueqiu + Weibo + RedNote)&lt;/td&gt;
&lt;td&gt;~22K mentions&lt;/td&gt;
&lt;td&gt;high-hundreds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off competitor sweep&lt;/td&gt;
&lt;td&gt;2,500 mentions&lt;/td&gt;
&lt;td&gt;~$100-ish&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each is a fraction of a single enterprise seat — and against what you can bill clients on top, the data cost rounds to noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's NOT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not a managed dashboard.&lt;/strong&gt; It's the data layer; you bring the visualization (that's also where your margin is).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not global coverage.&lt;/strong&gt; Chinese social platforms only — by design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not real-time streaming.&lt;/strong&gt; Cron-based polling; great for daily/hourly monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not authenticated/private content.&lt;/strong&gt; Public surface only.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you only need one platform
&lt;/h2&gt;

&lt;p&gt;The aggregator is for cross-platform monitoring. If you only need depth on a single platform, the standalone Actors go deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;Weibo Scraper&lt;/a&gt; — microblog, hot search, KOL posts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/rednote-xiaohongshu-scraper" rel="noopener noreferrer"&gt;RedNote / Xiaohongshu Scraper&lt;/a&gt; — lifestyle / product sentiment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt; — video + creator analytics&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;Xueqiu Scraper&lt;/a&gt; — retail-investor / cashtag sentiment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/douban-scraper" rel="noopener noreferrer"&gt;Douban Scraper&lt;/a&gt; — long-form reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Apify's free tier covers a first run, so you can see the output shape before committing a cent. Start here: &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;&lt;strong&gt;zhorex/chinese-brand-monitor&lt;/strong&gt;&lt;/a&gt;. If a field or platform you need isn't there, open an issue on the Actor page — I usually turn fixes around in a couple of days.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>api</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Watch your brand vs your rivals on Chinese social — automatically, every hour</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Fri, 19 Jun 2026 23:37:36 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/watch-your-brand-vs-your-rivals-on-chinese-social-automatically-every-hour-279m</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/watch-your-brand-vs-your-rivals-on-chinese-social-automatically-every-hour-279m</guid>
      <description>&lt;p&gt;If your brand sells in China — or competes with one that does — the conversation that decides your quarter is happening &lt;strong&gt;right now&lt;/strong&gt; on Weibo, RedNote (Xiaohongshu), Bilibili, Douban and Xueqiu. Not on the platforms your Western social-listening tool indexes. And it's not a one-time lookup you do before a launch: it's a moving target you need to &lt;em&gt;watch&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The problem is that "watching" five Chinese platforms by hand is a full-time job nobody wants. So most teams either fly blind, or pay $36K–$50K/year for an enterprise seat that bolts Chinese coverage onto a Western dashboard.&lt;/p&gt;

&lt;p&gt;I build Chinese-platform data tools, and the one most teams actually ask for isn't a scraper — it's a &lt;strong&gt;monitor that runs itself&lt;/strong&gt;. So that's what the &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;Chinese Brand Monitor&lt;/a&gt; now is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set it once. It watches for you.
&lt;/h2&gt;

&lt;p&gt;Give it your brand, pick a cadence, and it runs on a schedule across all five platforms — returning only &lt;strong&gt;what's new since the last run&lt;/strong&gt; (a clean brand-health delta, never a re-pull). Three things make it a real competitive-intelligence feed rather than a data dump:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. You vs your rivals, in one run.&lt;/strong&gt; Add &lt;code&gt;competitorBrands&lt;/code&gt; and every run returns a &lt;strong&gt;share-of-voice&lt;/strong&gt; rollup — mentions, share %, and reach-weighted sentiment per brand. So you don't just see "we were mentioned 200 times," you see &lt;em&gt;"we're at 38% share of voice vs Nike's 52%, and our sentiment is climbing while theirs dips."&lt;/em&gt; That's the slide your client or your CMO actually wants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Early warning, not post-mortem.&lt;/strong&gt; Turn on &lt;code&gt;velocityTracking&lt;/code&gt; and each run scores your mention volume against its own recent baseline and flags a &lt;strong&gt;spike&lt;/strong&gt;. Schedule it hourly and &lt;code&gt;spike: true&lt;/code&gt; is your trigger — a brewing crisis, a launch going viral, or a listed name heating up before earnings — caught the hour it starts, not the morning after it trends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A number, not a haystack.&lt;/strong&gt; Every mention is sentiment-scored (native Chinese, not machine-translated), reach-weighted by author influence, and cross-platform deduplicated. Each run emits a brand-health summary you can chart week over week and drop straight into a deck.&lt;/p&gt;

&lt;p&gt;Give it an English brand name and it auto-includes the Chinese one (Nike → 耐克) — most of the volume lives under the native name, and generic tooling silently misses it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that looks like in practice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brand / market-research agencies&lt;/strong&gt; — one saved task per client, scheduled daily, share-of-voice vs their competitive set. A reporting signal your client can see, across the platforms your incumbent tool can't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DTC brands entering China&lt;/strong&gt; — daily monitor on your brand + 2–3 rivals before and after launch; hourly "Crisis Watch" during the launch window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;China-focused / consumer funds&lt;/strong&gt; — Xueqiu + Weibo velocity on your tickers; the retail-sentiment ramp that quarterly filings give you 90 days late.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pay-per-result, runs serverless, no contract, no seat license. A daily single-brand monitor is cents a day; you own the raw output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go deep on one platform
&lt;/h2&gt;

&lt;p&gt;If you need full depth on a single platform — comment trees, creator analytics, review bodies, infinite scroll — each has its own dedicated scraper: &lt;a href="https://apify.com/zhorex/rednote-xiaohongshu-scraper" rel="noopener noreferrer"&gt;RedNote / Xiaohongshu&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;Weibo&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/douban-scraper" rel="noopener noreferrer"&gt;Douban&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;Xueqiu&lt;/a&gt;. Building a Chinese-language model instead? The &lt;a href="https://apify.com/zhorex/chinese-corpus-engine" rel="noopener noreferrer"&gt;Chinese AI Training Corpus Engine&lt;/a&gt; turns all five into AI-ready documents — deduplicated, quality-scored, PII-scrubbed, provenance-stamped. One vendor, normalized output, the only suite on Apify focused on Chinese-platform intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;p&gt;This reads &lt;strong&gt;public posts&lt;/strong&gt; — it's a listening / brand-intelligence tool, not affiliated with any platform, and it touches nothing behind a login. Sentiment is a model output (strong on first-person review text, noisier on hashtag spam — the dedup and reach-weighting are there to cut that noise). It tells you what the conversation looks like and when it moves; acting on it is your strategy.&lt;/p&gt;

&lt;p&gt;If China is the market where your brand's reputation is invisible to your current stack, this is how you put it on a schedule and stop guessing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Custom multi-brand setups, agency volume, or a field you need added: &lt;a href="mailto:samimassis2002@gmail.com"&gt;samimassis2002@gmail.com&lt;/a&gt; — or run the &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;Chinese Brand Monitor&lt;/a&gt; directly.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>api</category>
      <category>marketing</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>What are Chinese consumers saying about your brand? Your Western tools can't tell you</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Tue, 16 Jun 2026 03:14:13 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/what-are-chinese-consumers-saying-about-your-brand-your-western-tools-cant-tell-you-5hci</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/what-are-chinese-consumers-saying-about-your-brand-your-western-tools-cant-tell-you-5hci</guid>
      <description>&lt;p&gt;If your brand sells in China — or you're an analyst covering one that does — open your social-listening dashboard and search for your brand. Brandwatch, Sprinklr, Meltwater, Talkwalker: they'll show you X, Instagram, Reddit, TikTok. They will show you &lt;strong&gt;almost nothing from where Chinese consumers actually talk.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the conversation that decides whether your product sells in China doesn't happen on the platforms Western tools index. It happens on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RedNote (Xiaohongshu)&lt;/strong&gt; — 300M+ users posting first-person product reviews and "should I buy this?" notes. This is the single highest-intent consumer-opinion surface in China.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weibo&lt;/strong&gt; — public opinion, trending topics, the pulse of what's blowing up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilibili&lt;/strong&gt; — Gen-Z product opinion in long-form video and danmaku comments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Douban&lt;/strong&gt; — considered, long-form reviews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xueqiu&lt;/strong&gt; — retail-investor sentiment on listed consumer brands (Anta, Li-Ning, Pop Mart, BYD…).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are in your Western listening tool's index. So if you're a brand entering China, an agency running a China campaign, or an equity analyst with a thesis on a Chinese consumer stock, the most important data set is the one you can't see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is hard (and why the gap persists)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It's behind the Great Firewall and Chinese-only.&lt;/strong&gt; The platforms don't surface to Western crawlers, and the content is Chinese-language — mention detection and sentiment have to work natively, not on machine translation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's five different platforms.&lt;/strong&gt; Each has its own structure; stitching them into one comparable signal is the real work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's noisy.&lt;/strong&gt; Reposts, bots, marketing spam. Without dedup and sentiment scoring you drown.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's exactly why the Western incumbents skipped it — and why the signal is still differentiated if you can get it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you actually want
&lt;/h2&gt;

&lt;p&gt;For a brand or a thesis, you don't want a million raw posts. You want, on a schedule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mentions of your brand&lt;/strong&gt; across all five platforms, deduplicated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment&lt;/strong&gt; per mention (positive / neutral / negative), scored on Chinese text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reach-weighting&lt;/strong&gt; — a viral post from a 2M-follower account isn't one mention, it's a wave.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A brand-health roll-up&lt;/strong&gt; you can chart week over week and drop into a deck.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The turnkey version
&lt;/h2&gt;

&lt;p&gt;I build Chinese-platform data tools, and this is the one most teams ask for. The &lt;strong&gt;&lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;Chinese Brand Monitor&lt;/a&gt;&lt;/strong&gt; does the whole thing in one run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give it a brand (Latin or Chinese — it handles the localization, e.g. Nike → 耐克).&lt;/li&gt;
&lt;li&gt;It pulls mentions across &lt;strong&gt;Weibo, RedNote, Bilibili, Douban, and Xueqiu&lt;/strong&gt;, deduplicates them, scores sentiment, reach-weights, and returns a normalized brand-health roll-up.&lt;/li&gt;
&lt;li&gt;Pay-per-result, no contract, runs on a schedule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd rather go deep on one platform — full comment trees, creator analytics, review bodies — each platform has its own dedicated scraper (&lt;a href="https://apify.com/zhorex/rednote-xiaohongshu-scraper" rel="noopener noreferrer"&gt;RedNote&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;Weibo&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/douban-scraper" rel="noopener noreferrer"&gt;Douban&lt;/a&gt;, &lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;Xueqiu&lt;/a&gt;). One vendor, normalized output, the only suite on Apify focused on Chinese-platform intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's using it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brand &amp;amp; market-research teams&lt;/strong&gt; tracking how a product is received in China before/after launch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agencies&lt;/strong&gt; running China campaigns who need a reporting signal clients can see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Equity / alt-data desks&lt;/strong&gt; using Chinese consumer sentiment as a leading indicator on consumer-brand tickers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;p&gt;This measures &lt;strong&gt;public posts&lt;/strong&gt; on these platforms — it's a listening/brand-intelligence tool, not affiliated with any platform, and it reads what's publicly visible. Sentiment is a model output (strong on first-person review text, noisier on hashtag spam — the dedup and reach-weighting are there exactly to cut that noise). It tells you &lt;em&gt;what the conversation looks like&lt;/em&gt;; acting on it is still your strategy.&lt;/p&gt;

&lt;p&gt;If you're flying blind in the one market where the conversation is invisible to your current tools, this is how you turn the lights on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Questions, a custom multi-brand setup, or agency volume: &lt;a href="mailto:samimassis2002@gmail.com"&gt;samimassis2002@gmail.com&lt;/a&gt; — or run the &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;Chinese Brand Monitor&lt;/a&gt; directly.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>api</category>
      <category>marketing</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Your Chinese training data has a provenance problem — and August 2026 makes it urgent</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Thu, 11 Jun 2026 12:41:16 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/your-chinese-training-data-has-a-provenance-problem-and-august-2026-makes-it-urgent-l95</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/your-chinese-training-data-has-a-provenance-problem-and-august-2026-makes-it-urgent-l95</guid>
      <description>&lt;p&gt;If you train or fine-tune models on Chinese-language web text, there's a date you should have circled: &lt;strong&gt;August 2, 2026&lt;/strong&gt;. That's when the EU AI Act's obligations for general-purpose AI (GPAI) models start applying in earnest — including the requirement to publish a &lt;strong&gt;sufficiently detailed summary of training data&lt;/strong&gt; and to put in place a policy to &lt;strong&gt;respect TDM (text-and-data-mining) opt-outs&lt;/strong&gt; under the EU Copyright Directive.&lt;/p&gt;

&lt;p&gt;In practice, that means someone on your team will eventually be asked: &lt;em&gt;"For this corpus — where did each document come from, when was it retrieved, and did the source signal an opt-out at the time?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If your Chinese corpus is a pile of JSONL files scraped (or bought) at some point in 2023–2025 with no per-document metadata, the honest answer is: &lt;em&gt;we don't know&lt;/em&gt;. And "we don't know" is becoming an expensive answer — for EU-facing labs directly, and for everyone else indirectly, because data vendors, enterprise customers, and academic review boards are all starting to ask the same questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Chinese-language corpora are the hardest case
&lt;/h2&gt;

&lt;p&gt;Every web corpus has documentation gaps. Chinese-language corpora have them worse, for structural reasons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Scarcity drives sloppiness.&lt;/strong&gt; High-quality open Chinese text is scarce relative to English. Common Crawl's Chinese share is small and skews toward SEO spam and mirror farms. Because supply is tight, teams hoard whatever they can get — old dumps, resold datasets, "a folder someone left behind" — and documentation is the first thing sacrificed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Quality variance is extreme.&lt;/strong&gt; The interesting Chinese text lives on platforms — social discussion, video comments, finance commentary, long-form reviews, lifestyle posts. Mixed in with it: boilerplate, ads, bot chatter, template spam. Without per-document quality scoring you either keep the noise or hand-filter at a cost that kills the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Near-duplicates are endemic.&lt;/strong&gt; Chinese platforms are reposting cultures. The same viral post appears dozens of times with minor edits — added emoji, swapped hashtags, platform watermarks. Exact-hash dedup misses almost all of it. Train on it anyway and you get memorization hot spots and inflated dataset counts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. PII density is high.&lt;/strong&gt; User-generated Chinese text is full of phone numbers, national ID numbers, WeChat/QQ handles, addresses, and real names — often embedded mid-sentence. GDPR doesn't care that the data subject is in Shanghai if you're processing in the EU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Source documentation is usually zero.&lt;/strong&gt; Most Chinese web datasets in circulation — including academic ones — ship as bare text. No URLs, no timestamps, no record of what the source's robots/opt-out posture was at retrieval time. You cannot retrofit provenance. If it wasn't captured at collection time, it's gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What per-document provenance actually requires
&lt;/h2&gt;

&lt;p&gt;"Provenance" gets used loosely. For training-data documentation purposes, here's the concrete per-document record you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source URL&lt;/strong&gt; — the canonical URL of the original document, not just "Weibo".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval timestamp&lt;/strong&gt; — when this exact text was collected. Opt-out states change; the timestamp anchors your good-faith record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robots / opt-out state at retrieval&lt;/strong&gt; — what the source's machine-readable signals said &lt;em&gt;at the moment of collection&lt;/em&gt;. This is the field everyone is missing and the one TDM-policy questions hinge on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License hint&lt;/strong&gt; — the best available signal about the source's terms (platform ToS class, page-level license markers). A hint, not a clearance — but a documented hint beats silence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content hash&lt;/strong&gt; — a stable hash of the normalized text, so you can prove what was in the corpus, detect drift between corpus versions, and answer takedown requests precisely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline version&lt;/strong&gt; — which version of the collection/cleaning pipeline produced the record, so your documentation is reproducible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A practical checklist (works with any tooling)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stop ingesting undocumented data now.&lt;/strong&gt; Every undocumented document you add today is a liability you can't repair later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture provenance at collection time&lt;/strong&gt; — URL, timestamp, robots/opt-out state, license signal, hash, pipeline version, on every document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedup with MinHash/SimHash, not exact hashes.&lt;/strong&gt; Near-duplicate detection is the only thing that works on repost-heavy Chinese platforms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score quality per document&lt;/strong&gt; and record the score and threshold, so your filtering is defensible, not vibes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scrub PII before storage&lt;/strong&gt;, and log that scrubbing happened (pipeline version again).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a manifest per corpus version&lt;/strong&gt; — document counts, source distribution, date ranges — so the "sufficiently detailed summary" is a query, not an archaeology project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-check opt-out signals on refresh.&lt;/strong&gt; Provenance is a snapshot; periodic refresh keeps your record current.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can build all this in-house. Budget a few engineer-months for the collection layer, the dedup index, the PII pass, and the metadata plumbing — per platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Or use the turnkey version
&lt;/h2&gt;

&lt;p&gt;I built the &lt;strong&gt;&lt;a href="https://apify.com/zhorex/chinese-corpus-engine" rel="noopener noreferrer"&gt;Chinese AI Training Corpus Engine&lt;/a&gt;&lt;/strong&gt; to do exactly the pipeline above, as a self-serve Apify actor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five platforms&lt;/strong&gt;: Weibo, Bilibili, Xueqiu, Douban, RedNote (Xiaohongshu) — social, video, finance, reviews, lifestyle, so your corpus has register diversity, not just one genre.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MinHash near-duplicate detection&lt;/strong&gt; across the batch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-document quality scoring&lt;/strong&gt; with configurable thresholds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PII scrubbing&lt;/strong&gt; (phones, national IDs, emails) before output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full provenance on every document&lt;/strong&gt;: source URL, retrieval timestamp, robots state at collection, license hint, content hash, pipeline version — the exact fields your EU AI Act documentation needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pricing is per &lt;em&gt;validated&lt;/em&gt; document: &lt;strong&gt;$0.025/doc&lt;/strong&gt; (HTTP tier) or &lt;strong&gt;$0.055/doc&lt;/strong&gt; (browser tier). Documents that fail quality checks or turn out to be duplicates are &lt;strong&gt;never charged&lt;/strong&gt; — you pay for corpus, not for noise. A 10,000-document pilot is $250; you'll know within an hour whether the output fits your pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;documentation tooling, not legal clearance&lt;/strong&gt;. The engine records what sources signaled at collection time and structures it so you can document your corpus — it does not grant training rights, license the underlying content, or determine that any given use is lawful in your jurisdiction. License hints are hints. Whether and how you may train on any document remains your decision, ideally made with counsel who knows the EU AI Act, the Copyright Directive, and your specific exposure. What the tool guarantees is that when counsel asks "what do we know about this corpus?", you have a real answer per document instead of a shrug.&lt;/p&gt;

&lt;p&gt;August 2026 is closer than it looks. The teams that win the documentation question will be the ones who captured the metadata while collecting — not the ones reconstructing it afterward.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Questions or pilot requests: &lt;a href="mailto:samimassis2002@gmail.com"&gt;samimassis2002@gmail.com&lt;/a&gt; — or just run the &lt;a href="https://apify.com/zhorex/chinese-corpus-engine" rel="noopener noreferrer"&gt;actor&lt;/a&gt; directly.&lt;/em&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>data</category>
    </item>
    <item>
      <title>How to track Weibo hot-search velocity with Python in 2026 — the trending-delta problem and how to handle it</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Tue, 09 Jun 2026 15:52:00 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/how-to-track-weibo-hot-search-velocity-with-python-in-2026-the-trending-delta-problem-and-how-to-5g5f</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/how-to-track-weibo-hot-search-velocity-with-python-in-2026-the-trending-delta-problem-and-how-to-5g5f</guid>
      <description>&lt;p&gt;If you scrape Weibo's hot-search board you get a snapshot: ~50 trending topics, ranked, right now. That's table stakes — and on its own it's almost useless as a signal. The value isn't &lt;em&gt;what&lt;/em&gt; is trending; it's &lt;em&gt;what's moving&lt;/em&gt;: which topic just jumped 30 places in 20 minutes, which is decaying, which is brand-new this hour. That's &lt;strong&gt;velocity&lt;/strong&gt;, and velocity is where the signal lives — for brand-crisis teams, consumer-trend desks, and anyone modelling attention in China.&lt;/p&gt;

&lt;p&gt;The catch: a single scrape can't tell you velocity. You have to diff the board against its own past, reliably, run after run. That's a &lt;em&gt;stateful&lt;/em&gt; pipeline, and it has a few non-obvious gotchas. Here's the shape of the problem and how to handle it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a snapshot isn't enough
&lt;/h2&gt;

&lt;p&gt;Rank-right-now tells you nothing about trajectory. "#7" could be a topic on its way to #1 or one fading out of the top 50 — same row, opposite meaning. To act on a trend you need the &lt;em&gt;derivative&lt;/em&gt;: direction, speed, and how long it's been climbing. None of that is in a single pull.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trending-delta problem
&lt;/h2&gt;

&lt;p&gt;Three things make "just diff the board" harder than it looks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Key by identity, not position.&lt;/strong&gt; You can't track a topic by its rank — rank is the thing that changes. Key by the topic itself (its text/keyword) or your deltas are nonsense.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State has to survive between runs.&lt;/strong&gt; A scheduled scrape is stateless by default — each run starts cold. To compute "this rose 12 places since 30 minutes ago," you must persist the previous board and reload it next run, keyed so independent schedules don't overwrite each other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The board churns.&lt;/strong&gt; Topics appear, peak, and fall off. You want each tagged &lt;code&gt;new&lt;/code&gt; / &lt;code&gt;rising&lt;/code&gt; / &lt;code&gt;falling&lt;/code&gt; / &lt;code&gt;steady&lt;/code&gt; / &lt;code&gt;dropped&lt;/code&gt;, plus how long it's been on the board and its running peak — none of which exist in the raw snapshot.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to handle it (the pattern)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;current&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pull_board&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                  &lt;span class="c1"&gt;# [{topic, rank, heat}, ...]
&lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# durable store that persists across runs
&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;# match on identity, not rank
&lt;/span&gt;    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rank_delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heat_delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# new / rising / falling / steady
&lt;/span&gt;    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_seen&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;peak_rank&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;peak_rank&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt;

&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;dropped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# include topics that fell off
&lt;/span&gt;&lt;span class="nf"&gt;save_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                      &lt;span class="c1"&gt;# for next run
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schedule that (hourly or daily) and every run becomes a &lt;strong&gt;velocity reading&lt;/strong&gt; instead of a snapshot. The hard parts in practice are the durable, per-stream state and stable identity matching — get those wrong and the deltas lie.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this turns into money
&lt;/h2&gt;

&lt;p&gt;Velocity is a &lt;em&gt;leading&lt;/em&gt; indicator, and leading indicators are what people pay for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brand-crisis alerting&lt;/strong&gt; — catch a topic about your brand spiking &lt;em&gt;before&lt;/em&gt; it peaks: hours of lead time vs. a once-a-day report. That lead time is the product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer-trend alt-data&lt;/strong&gt; — rising-topic velocity is an early read on attention and demand shifts. Trend desks and funds buy exactly this kind of signal; a clean, timestamped delta feed is a sellable input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketing / launch timing&lt;/strong&gt; — ride a topic while it's ascending, not after it's saturated and CPMs have spiked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building a product on top, this delta stream &lt;em&gt;is&lt;/em&gt; your signal layer — everything downstream (alerts, scoring, dashboards) hangs off it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical path (skip the plumbing)
&lt;/h2&gt;

&lt;p&gt;You can build the stateful diff and session handling yourself, or point a maintained extractor at it. I maintain a &lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;Weibo Scraper&lt;/a&gt; on Apify with a &lt;code&gt;hot_search_delta&lt;/code&gt; mode that does exactly this — pulls the board, persists state across scheduled runs, and returns the &lt;code&gt;new&lt;/code&gt; / &lt;code&gt;rising&lt;/code&gt; / &lt;code&gt;falling&lt;/code&gt; / &lt;code&gt;dropped&lt;/code&gt; deltas with rank velocity, time-on-board, and peaks. Pay-per-result, runs on a schedule.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/weibo-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hot_search_delta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deltaStateKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hourly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# name independent streams (hourly / daily / ...)
&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rising&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rankDelta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  +&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rankDelta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; ranks  (heat &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hotValue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wire it to an Apify &lt;strong&gt;Schedule&lt;/strong&gt; and you have a rolling Weibo trend-velocity feed without owning the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is — and isn't
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Is:&lt;/strong&gt; a stateful, scheduled velocity feed over China's largest real-time attention signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isn't:&lt;/strong&gt; a one-off snapshot (that's the standard hot-search mode) — or a sentiment model. You get structured movement; the modelling on top is yours.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Need a field that isn't there yet, or a different cadence? Open an issue on the &lt;a href="https://apify.com/zhorex/weibo-scraper/issues" rel="noopener noreferrer"&gt;Actor page&lt;/a&gt; — I usually ship small additions within a couple of days. For high-volume or managed feeds, the README has the enterprise contact.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>datascience</category>
      <category>china</category>
    </item>
    <item>
      <title>Sourcing clean, multi-platform Chinese-language training data at scale in 2026 — a legal + practical guide for AI teams</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Wed, 03 Jun 2026 00:11:34 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/sourcing-clean-multi-platform-chinese-language-training-data-at-scale-in-2026-a-legal--35na</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/sourcing-clean-multi-platform-chinese-language-training-data-at-scale-in-2026-a-legal--35na</guid>
      <description>&lt;p&gt;If you're training or fine-tuning a model that needs to understand modern Chinese — consumer slang, product opinions, finance chatter, Gen-Z internet register — you've probably hit the same wall: &lt;strong&gt;the open Chinese corpora are stale, web-heavy, and thin on authentic first-person signal.&lt;/strong&gt; Common Crawl's Chinese slice is noisy and dated; the polished open datasets skew formal/encyclopedic. The &lt;em&gt;living&lt;/em&gt; Chinese-language signal — how real people actually write in 2026 — sits on a handful of social platforms, and getting it cleanly, at scale, and on solid legal footing is its own project.&lt;/p&gt;

&lt;p&gt;This is a practical guide to doing that without standing up (and babysitting) a five-platform scraping operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Chinese is the hardest major language to source well
&lt;/h2&gt;

&lt;p&gt;Three things make it uniquely painful:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The register you want is platform-locked.&lt;/strong&gt; Formal Chinese is everywhere; &lt;em&gt;colloquial, current, opinion-rich&lt;/em&gt; Chinese lives inside Weibo, RedNote, Bilibili, Douban and Xueqiu — and each gates and structures its public data differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's fragmented.&lt;/strong&gt; A model that only sees microblog text misses lifestyle reviews, video-comment register, long-form opinion, and finance vernacular. You need &lt;em&gt;several&lt;/em&gt; platforms to cover the distribution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It moves.&lt;/strong&gt; Last year's dump is already drifting from how people write today. Good Chinese data is a &lt;em&gt;rolling&lt;/em&gt; requirement, not a one-time pull.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What a good Chinese-language corpus actually needs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale&lt;/strong&gt; — hundreds of thousands to millions of records, not a sample.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recency&lt;/strong&gt; — a scheduled, rolling pull, not a one-off snapshot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Register diversity&lt;/strong&gt; — microblog (Weibo), lifestyle/product reviews (RedNote), video comments + danmaku (Bilibili), long-form reviews/discussion (Douban), retail-finance vernacular (Xueqiu).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean structure&lt;/strong&gt; — normalized fields, consistent encoding, deduplicated across platforms (the same KOL post reposted three places should collapse to one record, or you bias the model).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provenance you can defend&lt;/strong&gt; — public surface, no authentication, clear about what it is.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The build-it-yourself trap
&lt;/h2&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; wire up five scrapers. The honest cost is what comes after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Five different access surfaces that &lt;strong&gt;change on their own schedule&lt;/strong&gt;, each breaking independently — that's five maintenance burdens, not one.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;normalization + cross-platform dedup&lt;/strong&gt; layer you now own forever.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;legal/compliance&lt;/strong&gt; posture you have to reason about per platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the time it's robust, you've built a data-engineering team's worth of plumbing before training a single epoch. For most AI teams, that's not the project they want to be in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The legal layer (high-level — not legal advice)
&lt;/h2&gt;

&lt;p&gt;This is the part people skip and regret. The landscape in 2026, briefly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public, logged-off data sits on firmer ground.&lt;/strong&gt; In &lt;em&gt;Meta v. Bright Data&lt;/em&gt; (N.D. Cal., Jan 2024) a US court held that scraping &lt;strong&gt;publicly available, logged-off&lt;/strong&gt; data — and selling it — did not breach Meta's terms. It's narrow to that case's facts, but the direction is clear: &lt;em&gt;authenticated&lt;/em&gt; scraping is the risky lane; &lt;strong&gt;public, no-login collection is the defensible one.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal data has cross-border obligations.&lt;/strong&gt; If your corpus carries personal information, China's cross-border data-transfer rules (tightened for 2026) attach compliance steps above volume thresholds. The pragmatic read: &lt;strong&gt;favor public-post text and aggregate/derived signal over bulk personal profiles.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketplaces increasingly demand clean provenance.&lt;/strong&gt; AI-data marketplaces now ask for "legally sourced, non-scraped" guarantees — which is exactly why sourcing &lt;em&gt;your own&lt;/em&gt; public-surface corpus (where you control and document the use) is often cleaner than buying a mystery dataset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(None of this is legal advice — run your specific use case past counsel. The point is simply: stay on the public, logged-off, non-PII-heavy lane and document it.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical path: maintained public-surface extractors
&lt;/h2&gt;

&lt;p&gt;Instead of owning the five-platform treadmill, you point a maintained, &lt;strong&gt;public-surface, no-login&lt;/strong&gt; extractor at each platform and get back clean, structured records — on a schedule, at scale, pay-per-result. I maintain exactly this set on Apify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;&lt;strong&gt;Weibo Scraper&lt;/strong&gt;&lt;/a&gt; — microblog posts, hot search, comments (broad public-opinion register)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/rednote-xiaohongshu-scraper" rel="noopener noreferrer"&gt;&lt;strong&gt;RedNote / Xiaohongshu Scraper&lt;/strong&gt;&lt;/a&gt; — first-person product reviews + lifestyle text&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/bilibili-scraper" rel="noopener noreferrer"&gt;&lt;strong&gt;Bilibili Scraper&lt;/strong&gt;&lt;/a&gt; — video metadata, comments, danmaku (Gen-Z register)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;&lt;strong&gt;Xueqiu Scraper&lt;/strong&gt;&lt;/a&gt; — retail-investor / cashtag finance vernacular&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/douban-scraper" rel="noopener noreferrer"&gt;&lt;strong&gt;Douban Scraper&lt;/strong&gt;&lt;/a&gt; — long-form reviews and discussion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each returns clean JSON you can stream straight into your pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/weibo-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchQuery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;新能源车&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# "new energy vehicles"
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# → straight into your tokenizer / dedup / corpus store
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want &lt;strong&gt;all five platforms normalized into one schema and deduplicated across platforms&lt;/strong&gt; (so cross-posts don't inflate your corpus), the &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;&lt;strong&gt;Chinese Brand Monitor&lt;/strong&gt;&lt;/a&gt; aggregator does that merge in a single call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost at scale
&lt;/h2&gt;

&lt;p&gt;Pay-per-result, cents per record — so a corpus pull is a line item, not a procurement cycle:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pull&lt;/th&gt;
&lt;th&gt;Order of magnitude&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;50K Weibo posts, one-off&lt;/td&gt;
&lt;td&gt;small fine-tune slice&lt;/td&gt;
&lt;td&gt;~$250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500K records across 3 platforms&lt;/td&gt;
&lt;td&gt;a real corpus&lt;/td&gt;
&lt;td&gt;low four figures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled monthly refresh&lt;/td&gt;
&lt;td&gt;rolling recency&lt;/td&gt;
&lt;td&gt;repeats at the same per-record rate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Compare that to an engineer-month building and maintaining five pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is — and isn't
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Is:&lt;/strong&gt; public-surface text, structured, scheduled, at scale — you run it, you own how you use the output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isn't:&lt;/strong&gt; authenticated/private content, or a "mystery" dataset of unknown provenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isn't:&lt;/strong&gt; a labeling service — you get raw, structured text + metadata; the curation/filtering is yours.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting a bulk corpus
&lt;/h2&gt;

&lt;p&gt;For a one-off corpus or a rolling scheduled feed, the actors above run self-serve on Apify's free tier so you can eyeball the output shape before committing. &lt;strong&gt;For high-volume / enterprise&lt;/strong&gt; — millions of records, a custom schema matched to your warehouse, or a managed recurring feed — open an issue titled &lt;strong&gt;"Enterprise inquiry"&lt;/strong&gt; on any actor, or email &lt;strong&gt;&lt;a href="mailto:samimassis2002@gmail.com"&gt;samimassis2002@gmail.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If a platform or field you need for your corpus isn't covered yet, say so — I usually turn additions around in a couple of days.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>datascience</category>
    </item>
    <item>
      <title>How to monitor a brand across 5 Chinese social platforms with Python in 2026 — the cross-platform dedup problem and how to handle it</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Sun, 31 May 2026 16:31:02 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/how-to-monitor-a-brand-across-5-chinese-social-platforms-with-python-in-2026-the-cross-platform-3lif</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/how-to-monitor-a-brand-across-5-chinese-social-platforms-with-python-in-2026-the-cross-platform-3lif</guid>
      <description>&lt;p&gt;You want to know how a brand is being talked about in China. The catch: the conversation isn't on one platform. It's split across &lt;strong&gt;Weibo&lt;/strong&gt; (microblog), &lt;strong&gt;RedNote / Xiaohongshu&lt;/strong&gt; (product &amp;amp; lifestyle), &lt;strong&gt;Bilibili&lt;/strong&gt; (video), &lt;strong&gt;Douban&lt;/strong&gt; (long-form reviews) and &lt;strong&gt;Xueqiu&lt;/strong&gt; (retail-investor chatter). So you wire up five scrapers — and &lt;em&gt;that's&lt;/em&gt; where the real work starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody warns you about
&lt;/h2&gt;

&lt;p&gt;Pulling each platform is the easy 20%. The other 80% is turning five raw feeds into one trustworthy dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five completely different shapes.&lt;/strong&gt; A "post" on Weibo, a "note" on RedNote, a "video" on Bilibili, a "review" on Douban, a "cashtag comment" on Xueqiu — different fields, different engagement metrics, different date formats. Normalizing them into one table is a chore you redo every time a platform tweaks its response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates everywhere.&lt;/strong&gt; A KOL announces a collab and it's reposted across three platforms; creators cross-post the same clip. Count naively and your "mention volume" is inflated 2–3×, which quietly ruins every trend line and alert you build on top of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five moving targets.&lt;/strong&gt; Each platform changes how it serves public data on its own schedule. Keeping five pipelines alive is five maintenance burdens, not one — and they break on &lt;em&gt;their&lt;/em&gt; calendar, not yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform consistency.&lt;/strong&gt; Sentiment and author-reach have to mean the same thing on every platform, or your dashboard lies to you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the time you've built normalization + cross-platform dedup + sentiment + reach scoring for five platforms — and signed up to maintain it forever — you've built a data-engineering project before you've answered a single business question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shortcut: one call that returns the merged feed
&lt;/h2&gt;

&lt;p&gt;I maintain &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;&lt;strong&gt;Chinese Brand Monitor&lt;/strong&gt;&lt;/a&gt; on Apify. You give it a brand keyword; it returns brand mentions across all five platforms &lt;strong&gt;already normalized into one schema, deduplicated to one canonical record per real mention, sentiment-tagged, and reach-scored&lt;/strong&gt; — so the messy 80% is just… done. Pay-as-you-go at &lt;strong&gt;$0.045 per canonical mention&lt;/strong&gt;: no subscription, no seat fee, no annual contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;完美日记&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# Chinese or English
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weibo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rednote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bilibili&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;douban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentimentAnalysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deduplication&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contentSnippet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean rows — platform, author, follower count, engagement, sentiment, URL — straight into pandas / BigQuery / Snowflake / whatever you already run. No five-pipeline zoo to babysit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can &lt;em&gt;build&lt;/em&gt; on top of it (i.e. how this makes you money)
&lt;/h2&gt;

&lt;p&gt;This is the point. Cheap, clean, cross-platform China data is a raw material — and there's real margin in turning it into a product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run a China social-listening service.&lt;/strong&gt; Agencies bill brands &lt;strong&gt;monthly&lt;/strong&gt; for "monitor my brand + 3 competitors in China." Your data cost is cents per mention; you sell the insight, the dashboard, and the recurring retainer. The data layer that used to require a &lt;strong&gt;$36K–$50K+/yr&lt;/strong&gt; enterprise tool (Synthesio, Brandwatch, Meltwater) is now a line item — the spread is yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sell an alt-data sentiment feed.&lt;/strong&gt; Funds pay for consumer/retail sentiment on Chinese names &lt;em&gt;ahead of the tape&lt;/em&gt;. Pull daily across a basket, build a &lt;strong&gt;7-day sentiment + mention-volume delta&lt;/strong&gt; per brand/ticker, and sell the series. Costs cents per name per day; replaces a five-figure alt-data subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productize competitor sweeps.&lt;/strong&gt; One-off "how is brand X perceived vs Y in China, across 5 platforms" reports are high-margin consulting deliverables built on a few dollars of data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply AI / LLM teams&lt;/strong&gt; labeled, multi-platform, sentiment-tagged Chinese-language text for training corpora and current-events grounding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every one of these, the data is the cheap input and the &lt;em&gt;insight&lt;/em&gt; is what you charge for — gross margin on the data side sits near the 96% the Actor itself runs at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest comparison (where the big tools still win)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Enterprise (Synthesio / Brandwatch / Meltwater)&lt;/th&gt;
&lt;th&gt;Chinese Brand Monitor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Managed dashboard + alerting&lt;/td&gt;
&lt;td&gt;✅ Built in&lt;/td&gt;
&lt;td&gt;❌ You bring your own BI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global TV / podcast / news&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Chinese social only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account manager / SLA&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Self-serve (issues answered, no SLA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$36K–$50K+/yr, annual contract&lt;/td&gt;
&lt;td&gt;$0.045/mention, pay-as-you-go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw data ownership&lt;/td&gt;
&lt;td&gt;Walled-garden export&lt;/td&gt;
&lt;td&gt;✅ Your dataset, full export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;China platform depth&lt;/td&gt;
&lt;td&gt;Often shallow / add-on&lt;/td&gt;
&lt;td&gt;✅ Five platforms, native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to first data&lt;/td&gt;
&lt;td&gt;Sales cycle + onboarding&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you want a turnkey managed platform with global coverage and a team behind it, buy the enterprise tool. If you want the Chinese social data — cheaply, in your own pipeline, with no contract — this is the layer to build on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realistic cost
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One brand, daily, 7-day lookback&lt;/td&gt;
&lt;td&gt;~3K mentions&lt;/td&gt;
&lt;td&gt;~$135&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-brand agency, daily, sentiment + dedup&lt;/td&gt;
&lt;td&gt;~15K mentions&lt;/td&gt;
&lt;td&gt;~$675&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-ticker fund, daily (Xueqiu + Weibo + RedNote)&lt;/td&gt;
&lt;td&gt;~22K mentions&lt;/td&gt;
&lt;td&gt;~$990&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off competitor sweep&lt;/td&gt;
&lt;td&gt;2,500 mentions&lt;/td&gt;
&lt;td&gt;~$112&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each is a fraction of a single enterprise seat — and against what you can bill clients on top, the data cost rounds to noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's NOT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not a managed dashboard.&lt;/strong&gt; It's the data layer; you bring the visualization (that's also where your margin is).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not global coverage.&lt;/strong&gt; Chinese social platforms only — by design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not real-time streaming.&lt;/strong&gt; Cron-based polling; great for daily/hourly monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not authenticated/private content.&lt;/strong&gt; Public surface only.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you only need one platform
&lt;/h2&gt;

&lt;p&gt;The aggregator is for cross-platform monitoring. If you only need depth on a single platform, the standalone Actors go deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;Weibo Scraper&lt;/a&gt; — microblog, hot search, KOL posts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/rednote-xiaohongshu-scraper" rel="noopener noreferrer"&gt;RedNote / Xiaohongshu Scraper&lt;/a&gt; — lifestyle / product sentiment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt; — video + creator analytics&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;Xueqiu Scraper&lt;/a&gt; — retail-investor / cashtag sentiment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/douban-scraper" rel="noopener noreferrer"&gt;Douban Scraper&lt;/a&gt; — long-form reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Apify's free tier covers a first run, so you can see the output shape before committing a cent. Start here: &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;&lt;strong&gt;zhorex/chinese-brand-monitor&lt;/strong&gt;&lt;/a&gt;. If a field or platform you need isn't there, open an issue on the Actor page — I usually turn fixes around in a couple of days.&lt;/p&gt;

</description>
      <category>china</category>
      <category>webscraping</category>
      <category>python</category>
      <category>datascience</category>
    </item>
    <item>
      <title>How China-focused funds turn Weibo into alt-data (Python, 2026)</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Fri, 29 May 2026 22:17:26 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/how-china-focused-funds-turn-weibo-into-alt-data-python-2026-194o</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/how-china-focused-funds-turn-weibo-into-alt-data-python-2026-194o</guid>
      <description>&lt;p&gt;If you run a China book — equities, FX, commodities, or just a macro tilt — you already know the problem: the official numbers are slow and the English-language coverage is downstream of what already moved on Chinese social platforms. By the time a theme reaches Bloomberg, retail Weibo has been talking about it for days.&lt;/p&gt;

&lt;p&gt;Weibo (微博) is where Chinese consumer and retail-investor sentiment shows up first. 580M+ monthly actives, a public hot-search board that turns over hourly, and cashtag-style chatter on every listed name. The catch: there's no official API for international developers, and the data is in Chinese.&lt;/p&gt;

&lt;p&gt;This post walks through how to pull Weibo into a usable alt-data feed with a few lines of Python — hot-search trend tracking, keyword/cashtag sentiment, and KOL post monitoring — using an Apify Actor I maintain, so you don't have to babysit visitor cookies or rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three signals worth pulling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Hot search board (the leading indicator).&lt;/strong&gt; Weibo's trending board is the single fastest read on what 1.4B people are paying attention to. A brand, a policy rumor, a product recall, a CEO quote — it surfaces here first. For a fund, the delta matters more than the snapshot: what entered the board in the last hour, and how fast it's climbing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Keyword / cashtag sentiment.&lt;/strong&gt; Search a ticker's Chinese name, a brand, or a product line and you get the raw retail read — positive, negative, the volume of chatter, and which posts have reach. This is the consumer-demand nowcast that quarterly filings give you 90 days late.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. KOL post monitoring.&lt;/strong&gt; A single finance or consumer KOL with 5M followers moves retail flows in hours. Tracking specific accounts' posts (and their engagement velocity) is a cleaner signal than aggregate noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull the hot-search board
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/weibo-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hot_search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rank&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;heat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this on a cron every 30-60 minutes and diff consecutive snapshots. A topic that jumps 40 ranks in one hour is the alpha — not its absolute position.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyword sentiment as a consumer nowcast
&lt;/h2&gt;

&lt;p&gt;Say you're long a Chinese EV name and want the retail read before the delivery numbers print:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/weibo-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchQuery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;比亚迪&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# BYD in Chinese — Chinese keywords yield far better recall
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Reach-weight the chatter: a 2M-follower account counts more than a burner.
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reach&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repostsCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;commentsCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;likesCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reach&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)[[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reach&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;createdAt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pipe the &lt;code&gt;text&lt;/code&gt; field through whatever Chinese sentiment model you already run (or a multilingual LLM) and you have a daily polarity series per name. Track the 7-day delta in mention volume + polarity and you've built a sentiment-velocity factor for the cost of a few cents per run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a daily China alt-data job
&lt;/h2&gt;

&lt;p&gt;The two actors that matter together: Weibo for broad consumer + retail sentiment, and the &lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;Xueqiu Scraper&lt;/a&gt; for finance-specific cashtag chatter (Xueqiu is China's retail-investor forum — closer to a StockTwits read). Run both on the same cron, join on ticker, and you get consumer sentiment and investor sentiment side by side.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tickers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BYD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;比亚迪&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pop Mart&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;泡泡玛特&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Luckin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;瑞幸咖啡&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zh&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/weibo-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchQuery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;zh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mentions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mentions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diff today's mention counts against a trailing 7-day mean and you have a chatter-velocity screen across your whole China book.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;The Weibo Scraper is pay-per-event — you pay per item returned, no subscription, no seat fee. A 300-post sentiment pull is a few cents. A daily 20-ticker monitoring job across the month lands in the low tens of dollars. Compare that to a Bloomberg China module or a packaged alt-data feed and the math is not close.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Rough monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hourly hot-search tracker&lt;/td&gt;
&lt;td&gt;~70K topics/mo&lt;/td&gt;
&lt;td&gt;low tens of $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-ticker daily sentiment&lt;/td&gt;
&lt;td&gt;~120K posts/mo&lt;/td&gt;
&lt;td&gt;tens of $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off theme research&lt;/td&gt;
&lt;td&gt;a few K posts&lt;/td&gt;
&lt;td&gt;a few $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See the Actor's Pricing tab for the exact per-result rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is NOT
&lt;/h2&gt;

&lt;p&gt;Honest scoping, because sophisticated buyers care more about this than the pitch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not real-time tick data.&lt;/strong&gt; Cron-based polling; 30-60 min cadence is realistic and plenty for sentiment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a sentiment model.&lt;/strong&gt; It returns the raw posts + engagement + metadata. You bring (or plug in) the NLP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not authenticated content.&lt;/strong&gt; Public surface only — hot search, public search results, public profiles. Some modes (user timelines) work better with your own session cookie, which is optional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not financial advice or a signal in a box.&lt;/strong&gt; It's a data feed. The factor construction is yours.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The broader China stack
&lt;/h2&gt;

&lt;p&gt;If Weibo is the consumer + retail-sentiment layer, the rest of the stack fills in the gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;Xueqiu Scraper&lt;/a&gt; — retail-investor forum, cashtag-tagged, the finance-specific sentiment read&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/rednote-xiaohongshu-scraper" rel="noopener noreferrer"&gt;RedNote / Xiaohongshu Scraper&lt;/a&gt; — consumer-brand and product sentiment, the highest-trust purchase-decision channel in China&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt; — Gen-Z video sentiment and creator analytics&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;Chinese Brand Monitor&lt;/a&gt; — if you'd rather not wire up four scrapers, this aggregates Weibo + RedNote + Bilibili + Douban + Xueqiu into one normalized, deduplicated, sentiment-tagged feed at a per-mention price&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;A small Weibo pull costs cents, and Apify's free tier covers a first run. Start here: &lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;zhorex/weibo-scraper&lt;/a&gt;. If you build a China sentiment factor on top of it, I'd genuinely like to hear how — drop a comment or open an issue on the Actor page.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>china</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Synthesio charges $36K+/year for Chinese platform coverage. I built one for $0.045/mention.</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Wed, 20 May 2026 01:46:55 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/synthesio-charges-36kyear-for-chinese-platform-coverage-i-built-one-for-0045mention-4d1l</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/synthesio-charges-36kyear-for-chinese-platform-coverage-i-built-one-for-0045mention-4d1l</guid>
      <description>&lt;p&gt;Synthesio sells Chinese platform coverage for $36K+/year. Brandwatch and Meltwater sit in roughly the same $24K-80K/year band. I built an Apify Actor that does the equivalent core job — Weibo, RedNote, Bilibili, Douban, Xueqiu — for $0.045 per deduplicated mention, billed pay-as-you-go.&lt;/p&gt;

&lt;p&gt;If you've ever tried to DIY this, you know the math. Five Chinese platforms means five different parsers, five different rate-limit dances, five different schema-drift surprises every couple of weeks, and zero deduplication when a KOL reposts the same content across all of them. By the time you've normalized author identity, follower counts, and timestamps into a usable cross-platform record, you've built a small distributed system that breaks every other Tuesday.&lt;/p&gt;

&lt;p&gt;The pitch for &lt;code&gt;zhorex/chinese-brand-monitor&lt;/code&gt; is simple: one API call, one normalized schema, one PPE event per canonical mention. You pass a brand keyword (Chinese or English), get back deduplicated records with sentiment scores and reach signals across all five platforms. You don't write per-platform code. You don't run five cron jobs. You don't pay an enterprise floor.&lt;/p&gt;

&lt;p&gt;This post walks through six concrete workflows with runnable Python — brand health, crisis monitoring, KOL discovery, hedge fund alt-data, AI training corpora, and a cross-tool finance signal — so you can decide if this fits your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;The Actor takes a single brand keyword (or a list of keywords) and returns deduplicated, sentiment-scored mentions from five Chinese platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weibo&lt;/strong&gt; — China's largest microblog; broad consumer chatter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RedNote / Xiaohongshu (小红书)&lt;/strong&gt; — lifestyle and product discovery; heavy DTC signal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilibili&lt;/strong&gt; — long-form video community; strong Gen-Z signal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Douban&lt;/strong&gt; — long-form reviews, especially media and lifestyle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xueqiu (雪球)&lt;/strong&gt; — retail investor chatter, cashtag-tracked stock sentiment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Actor handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single keyword input — Chinese &lt;code&gt;护肤&lt;/code&gt; or English &lt;code&gt;Estée Lauder&lt;/code&gt; both work&lt;/li&gt;
&lt;li&gt;Normalized cross-platform schema — same fields on every record, no per-platform parsing in your downstream code&lt;/li&gt;
&lt;li&gt;Lexicon-based Chinese sentiment scoring per mention (polarity + score)&lt;/li&gt;
&lt;li&gt;Cross-platform deduplication — when the same KOL reposts identical content on Weibo and RedNote, you get one canonical record with &lt;code&gt;crossPlatformReposts&lt;/code&gt; listing the other appearances&lt;/li&gt;
&lt;li&gt;Author identity normalization with follower count for reach-weighted analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineering choices worth knowing: a browser-grade HTTP client, polite rate limiting, session warming, and a public-data scope that respects each platform's accessible surface. The point is that you don't have to think about any of that — you call the Actor, you get records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six concrete workflows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a) Brand health dashboard (~$135/mo)
&lt;/h3&gt;

&lt;p&gt;Daily 8am cron, single brand, 7-day rolling lookback. Push to Looker, Metabase, or a Notion database. Compare this to a $4K/mo Synthesio seat for the same functional coverage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Estée Lauder&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weibo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rednote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bilibili&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;douban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxMentionsPerPlatform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentimentAnalysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deduplication&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mentions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mentionId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="n"&gt;reach&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorFollowerCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The grouped DataFrame is what you push to your BI tool. ~3,000 deduplicated mentions/month at this cadence lands around $135 in PPE charges.&lt;/p&gt;

&lt;h3&gt;
  
  
  b) Crisis monitoring (~$270/mo)
&lt;/h3&gt;

&lt;p&gt;Hourly cron, 1-day lookback, filter for negative polarity from accounts above 10K followers. Slack webhook fires on match. This is the workflow that justifies the spend during a product recall, a CEO quote going viral, or a competitor smear campaign.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;SLACK_WEBHOOK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hooks.slack.com/services/XXX/YYY/ZZZ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Estée Lauder&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weibo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rednote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bilibili&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;douban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxMentionsPerPlatform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentimentAnalysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorFollowerCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SLACK_WEBHOOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;authorName&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;authorFollowerCount&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; followers) — &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;contentSnippet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hourly × 24 × 30 ≈ ~6,000 deduplicated mentions/month if the brand has steady chatter — roughly $270/mo. Cheap insurance for a comms team.&lt;/p&gt;

&lt;h3&gt;
  
  
  c) KOL identification (~$90/mo)
&lt;/h3&gt;

&lt;p&gt;Weekly category-keyword run. Skincare = &lt;code&gt;护肤&lt;/code&gt;, sneakers = &lt;code&gt;球鞋&lt;/code&gt;, supplements = &lt;code&gt;保健品&lt;/code&gt;. Filter verified authors above 50K followers, sort by engagement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;护肤&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weibo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rednote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bilibili&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;douban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxMentionsPerPlatform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engagement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engagementMetrics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;likes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shares&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorVerified&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorFollowerCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engagement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop_duplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorFollowerCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engagement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kol_candidates.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Weekly cadence on 1-2 category keywords ≈ ~2,000 mentions/month — roughly $90/mo. The output is a ranked candidate list your social team can outreach directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  d) Hedge fund alt-data (~$990/mo)
&lt;/h3&gt;

&lt;p&gt;Daily run across 20 portfolio tickers on Xueqiu + Weibo + RedNote. Build a sentiment-velocity feature: 7-day mention-count delta paired with polarity shift. Join two consecutive runs to compute the velocity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tickers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BABA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PDD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BIDU&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NIO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XPEV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MEITUAN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TENCENT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BYD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LKNCY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TME&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BILI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VIPS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TAL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YMM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DIDI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ZH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NTES&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FUTU&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lookback_days&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ticker&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weibo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rednote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lookback_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentimentAnalysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;week&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mentionId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;avg_polarity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mean&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;today_agg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;week_agg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;week&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;today_agg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;week_agg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lsuffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_1d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rsuffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_7d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;velocity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count_1d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count_7d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity_shift&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_polarity_1d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_polarity_7d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;velocity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;20 tickers × daily × 3 platforms ≈ ~22K mentions/month — roughly $990/mo. Compare to a single Bloomberg terminal at ~$28K/year for one analyst.&lt;/p&gt;

&lt;h3&gt;
  
  
  e) AI training corpus (~$2,250 one-shot)
&lt;/h3&gt;

&lt;p&gt;50 brand keywords × 1,000 mentions each = 50K Chinese-language labeled records for SFT or RLHF corpora. Every record has an explicit sentiment polarity, author follower bracket, and platform. Compare to $15-50K academic licensing fees for comparable annotated Chinese sentiment corpora.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;brands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;华为&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;小米&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;比亚迪&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;蔚来&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;理想汽车&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;拼多多&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;美团&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;完美日记&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;花西子&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;钟薛高&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;元气森林&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;瑞幸咖啡&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;海底捞&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# ... 50 total
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;china_sft_corpus.jsonl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;brand&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;brands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weibo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rednote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bilibili&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;douban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxMentionsPerPlatform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentimentAnalysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brand&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;50K records × $0.045 = $2,250. One-shot. No annotator contracts, no FTE-month spent labeling.&lt;/p&gt;

&lt;h3&gt;
  
  
  f) Cross-tool finance signal: Xueqiu sentiment × TradingView price
&lt;/h3&gt;

&lt;p&gt;Pair the Chinese Brand Monitor with &lt;a href="https://apify.com/zhorex/tradingview-scraper" rel="noopener noreferrer"&gt;the TradingView Scraper&lt;/a&gt; for a sentiment-vs-price divergence signal. When Xueqiu retail sentiment turns sharply positive while the price stays flat or drifts down, you have a setup worth a closer look.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sent_run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/chinese-brand-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandKeyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BABA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookbackDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentimentAnalysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sent_run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="n"&gt;sent_score_7d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;price_run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/tradingview-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technical_analysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbols&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NYSE:BABA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeIndicators&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price_run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="n"&gt;perf_week_pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;perfWeek&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;

&lt;span class="c1"&gt;# Positive Xueqiu sentiment minus weekly price return: large positive = retail
# is loud-bullish but the tape hasn't caught up yet.
&lt;/span&gt;&lt;span class="n"&gt;divergence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sent_score_7d&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;perf_week_pct&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BABA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xueqiu_sentiment_7d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sent_score_7d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tradingview_perfWeek_pct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;perfWeek&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;divergence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divergence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A positive divergence row is "sentiment positive, price not yet moved." That's the setup quants pay alt-data brokers tens of thousands a year to surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Normalized output schema
&lt;/h2&gt;

&lt;p&gt;Every record across every platform has this shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mentionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rednote_8b3c2f91a4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"platform"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rednote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"brandKeyword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Estée Lauder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"brandMatchType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"雅诗兰黛小棕瓶用了三个月，肌肤紧致很多..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentSnippet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"雅诗兰黛小棕瓶用了三个月..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zh-CN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rednote_user_4429871"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"小琳护肤日记"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorFollowerCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;184230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorVerified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publishedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-18T14:23:11Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"engagementMetrics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"likes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2104&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"comments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;187&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shares"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"views"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18430&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.xiaohongshu.com/explore/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mediaUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://sns-img-...jpg"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"polarity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lexicon"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"crossPlatformReposts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"platform"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"weibo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://weibo.com/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"publishedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-18T15:02:00Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scrapedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-20T08:00:01Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your downstream code stays platform-agnostic. Pandas, BigQuery, Snowflake, ClickHouse — pick your warehouse and the records load directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;$0.045 per canonical mention, billed only after deduplication. If a KOL reposts the same content across Weibo + RedNote + Bilibili, that's one billable mention with the reposts attached, not three.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;th&gt;Enterprise alternative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single brand, daily, 7-day lookback&lt;/td&gt;
&lt;td&gt;~3K/mo&lt;/td&gt;
&lt;td&gt;~$135&lt;/td&gt;
&lt;td&gt;$4K/mo Synthesio seat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-brand agency, daily, sentiment + dedup&lt;/td&gt;
&lt;td&gt;~15K/mo&lt;/td&gt;
&lt;td&gt;~$675&lt;/td&gt;
&lt;td&gt;$24K-80K/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-ticker hedge fund&lt;/td&gt;
&lt;td&gt;~22K/mo&lt;/td&gt;
&lt;td&gt;~$990&lt;/td&gt;
&lt;td&gt;$28K/year Bloomberg seat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI training corpus one-shot&lt;/td&gt;
&lt;td&gt;50K&lt;/td&gt;
&lt;td&gt;~$2,250&lt;/td&gt;
&lt;td&gt;$15K-50K academic license&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What this Actor does NOT do
&lt;/h2&gt;

&lt;p&gt;Honest scoping matters more than pitch volume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not real-time push streaming.&lt;/strong&gt; Cron-based polling, 5-minute minimum interval. If you need sub-second push, this isn't it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a historical archive.&lt;/strong&gt; Maximum 30-day lookback. For multi-year backfill, you need a different tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not authentication-walled content.&lt;/strong&gt; No Zhihu authenticated answers, no private WeChat groups, no closed Weibo Super Topic posts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a CRM or BI tool.&lt;/strong&gt; This is the data layer. You bring the dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those constraints are dealbreakers for your use case, save the credit and don't run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader China stack
&lt;/h2&gt;

&lt;p&gt;The main Actor here is &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;zhorex/chinese-brand-monitor&lt;/a&gt;, but the rest of the stack exists for cases when you need single-platform depth or a different angle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For deeper single-platform RedNote dives — full creator profiles, comment threads, hashtag networks — reach for &lt;a href="https://apify.com/zhorex/rednote-xiaohongshu-scraper" rel="noopener noreferrer"&gt;the standalone RedNote/Xiaohongshu Scraper&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For Weibo-only bulk pulls — historical hashtag sweeps, single-account timelines, Super Topic posts — &lt;a href="https://apify.com/zhorex/weibo-scraper" rel="noopener noreferrer"&gt;the Weibo Scraper&lt;/a&gt; is the dedicated tool.&lt;/li&gt;
&lt;li&gt;For Bilibili-only deep pulls — video metadata, danmaku, UP主 channel coverage — use &lt;a href="https://apify.com/zhorex/bilibili-scraper" rel="noopener noreferrer"&gt;the Bilibili Scraper&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For finance-only sentiment with cashtag granularity and reply trees, &lt;a href="https://apify.com/zhorex/xueqiu-scraper" rel="noopener noreferrer"&gt;the Xueqiu Scraper&lt;/a&gt; goes deeper than the brand-monitor surface.&lt;/li&gt;
&lt;li&gt;For long-form review extraction, especially books, films, and lifestyle, &lt;a href="https://apify.com/zhorex/douban-scraper" rel="noopener noreferrer"&gt;the Douban Scraper&lt;/a&gt; handles the review-thread structure.&lt;/li&gt;
&lt;li&gt;For the cross-tool finance workflow above, &lt;a href="https://apify.com/zhorex/tradingview-scraper" rel="noopener noreferrer"&gt;the TradingView Scraper&lt;/a&gt; provides the price half of the sentiment-vs-price divergence signal.&lt;/li&gt;
&lt;li&gt;If you're tracking brand mentions, you usually also want competitor pricing — &lt;a href="https://apify.com/zhorex/jd-scraper" rel="noopener noreferrer"&gt;the JD Scraper&lt;/a&gt; covers the e-commerce price side of the China stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;$5 of Apify free credits cover roughly 100 mentions — enough to run a single brand for a week and see whether the output shape fits your downstream code. Start here: &lt;a href="https://apify.com/zhorex/chinese-brand-monitor" rel="noopener noreferrer"&gt;zhorex/chinese-brand-monitor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you build something on top of this — a Looker dashboard, a Slack bot, a Streamlit explorer, a sentiment ETF screen — drop a comment, or open an Issue on the Actor page. Schema customization, missing platforms, follower-bracket additions, new sentiment lexicons — those are the kinds of changes that get prioritized when users ask for them.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>china</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Pinnacle odds for $0.01 a snapshot: the OddsJam / Odds API replacement sharp bettors are using in 2026</title>
      <dc:creator>Sami</dc:creator>
      <pubDate>Tue, 19 May 2026 13:54:32 +0000</pubDate>
      <link>https://dev.to/sami_8858131362756585e4f4/pinnacle-odds-for-001-a-snapshot-the-oddsjam-odds-api-replacement-sharp-bettors-are-using-in-3kgl</link>
      <guid>https://dev.to/sami_8858131362756585e4f4/pinnacle-odds-for-001-a-snapshot-the-oddsjam-odds-api-replacement-sharp-bettors-are-using-in-3kgl</guid>
      <description>&lt;p&gt;If you bet sharp lines, the only book that genuinely matters for fair-value is Pinnacle. Every EV model, every CLV report, every "did I beat the close?" check eventually compresses down to one question: what was Pinnacle showing on this market at T-1?&lt;/p&gt;

&lt;p&gt;For years the standard way to get that feed was The Odds API ($249/mo for 15M credits) or OddsJam Gold ($249/mo, $499+ for Pro). For a tipster shop polling 100 fixtures a day that math is tolerable. For a solo bettor running CLV on 20 fixtures it's overspend. For a specials trader it's worse — OddsJam gates futures and yes/no markets behind their highest tier and The Odds API doesn't surface most of them at all.&lt;/p&gt;

&lt;p&gt;There's now an Apify Actor that does the same job pay-per-snapshot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;zhorex/sports-odds-aggregator&lt;/strong&gt; — Pinnacle h2h + spreads + totals + 5,000+ specials per sport, from $0.01 a snapshot. Datacenter-proxy friendly. No login, no monthly minimum.&lt;/p&gt;

&lt;p&gt;This post is the playbook: four recipes that show exactly how to run it, what each costs, and where the savings show up vs. the SaaS-incumbent pricing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quick note on naming: the Actor's title still references Bet365 because Bet365 is the second-book slot, but Bet365's public mobile-web path is under repair as of May 2026. Pinnacle is shipping today, and the moment Bet365 returns the cross-book best-price flag (&lt;code&gt;isBestPriceAcrossBooks&lt;/code&gt;) and fuzzy event-matching activate automatically — no input change on your side.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pricing in plain English
&lt;/h2&gt;

&lt;p&gt;Four event types, billed pay-per-event (PPE):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;When it fires&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;odds-snapshot-pre-match&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.01 / snapshot&lt;/td&gt;
&lt;td&gt;One market-outcome from a scheduled (not in-play) fixture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;odds-snapshot-live&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.02 / snapshot&lt;/td&gt;
&lt;td&gt;One market-outcome from a live (in-play) match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;odds-snapshot-player-prop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.04 / snapshot&lt;/td&gt;
&lt;td&gt;One special / future / yes-no / team prop / exact-totals row&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scheduled-run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.05 / run&lt;/td&gt;
&lt;td&gt;Once per cron tick — often fully offset by the dedup window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A typical pre-match fixture with &lt;code&gt;["h2h", "spreads", "totals"]&lt;/code&gt; emits ~7 snapshots (3 h2h outcomes + 2 spreads + 2 totals). Add &lt;code&gt;"specials"&lt;/code&gt; and you get an extra 30–80 rows per fixture — yes/no markets, exact totals, first-team-to-score, winning margin per scoreline, team props.&lt;/p&gt;

&lt;p&gt;The bit that turns this from "interesting" to "actually cheap": the &lt;code&gt;deduplicationWindowSeconds&lt;/code&gt; setting suppresses snapshots when the line hasn't moved. On stable mid-week Premier League pre-match polls you typically charge for 5–15% of "naïve" volume. A 60-second cron on a stable line is essentially free.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recipe 1 — Pinnacle closing-line value (CLV) tracker
&lt;/h2&gt;

&lt;p&gt;The recipe that pays for the Actor in its first weekend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mode: "pre_match_only"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Trigger at T-30 minutes and T-1 minute per fixture&lt;/li&gt;
&lt;li&gt;Bet your soft book at T-30, log Pinnacle's T-1 close, compute CLV per ticket&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pinnacle's closing line is the canonical sharp benchmark. If you're consistently beating Pinnacle's close, your edge is real. If you aren't, you can stop pretending — CLV is the ground truth of whether you're a winning bettor or a noise-trader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost for 200 fixtures/week&lt;/strong&gt; (h2h+spreads+totals, ~7 snapshots × 2 polls each): &lt;strong&gt;~$65/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Odds API doesn't expose "Pinnacle close at T-1" as a first-class field, so you're paying $249/mo for the feed and still rolling your own snapshot scheduler. Here the snapshot scheduler (Apify cron) and the snapshot itself together come in at ~25% of the price.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recipe 2 — EV-model live edge harvester
&lt;/h2&gt;

&lt;p&gt;The model-on-top use case. If you have a fair-value model and you harvest the moments where &lt;code&gt;book_price × your_fair_value &amp;gt; 1.03&lt;/code&gt;, you want a polling firehose during in-play, not an hourly dump.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"books"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pinnacle"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"basketball"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tennis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"soccer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"marketTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"h2h"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spreads"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"totals"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"live_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deduplicationWindowSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Schedule:&lt;/strong&gt; 60-second cron during target match windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volume:&lt;/strong&gt; ~50K live snapshots/month × $0.02 + orchestration ≈ &lt;strong&gt;~$1,080 / month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That looks pricey until you put it next to OddsJam Pro at $499+/mo for a SaaS API you don't control and that throttles by tier. The trade is: you pay more per request, but you pay only for what you actually consume, you set the cadence, and a stable line costs you nothing.&lt;/p&gt;

&lt;p&gt;The other thing the SaaS won't sell you: every snapshot includes &lt;code&gt;isLive&lt;/code&gt;, &lt;code&gt;matchClock&lt;/code&gt;, and &lt;code&gt;matchScore&lt;/code&gt;. Your model doesn't have to join against a separate scoreboard feed during a live NBA fourth quarter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recipe 3 — Specials sniper (the OddsJam gating trick)
&lt;/h2&gt;

&lt;p&gt;For value bettors and exact-totals modellers. This is the recipe where the pricing gap gets embarrassing.&lt;/p&gt;

&lt;p&gt;Pinnacle's &lt;code&gt;withSpecials=true&lt;/code&gt; matchups call returns &lt;strong&gt;~5,000 markets per major sport&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First Team To Score (3-way)&lt;/li&gt;
&lt;li&gt;Win to Nil 1st Half (yes/no)&lt;/li&gt;
&lt;li&gt;Exact Total Goals 1st Half (multi-way)&lt;/li&gt;
&lt;li&gt;Winning Margin per scoreline&lt;/li&gt;
&lt;li&gt;A long tail of team props and player-related markets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the markets soft books are slowest to sharpen up on — which is where the actual edge lives. OddsJam gates futures and props behind their highest tier. The Odds API doesn't surface most of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"books"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pinnacle"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"soccer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"marketTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"specials"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pre_match_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deduplicationWindowSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Schedule:&lt;/strong&gt; 4-hour cron during the season.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volume:&lt;/strong&gt; ~6K specials snapshots + 180 runs ≈ &lt;strong&gt;~$250 / month&lt;/strong&gt; for the segment that powers the largest EV pockets in retail sports betting.&lt;/p&gt;

&lt;p&gt;A pattern that works: filter the dataset to &lt;code&gt;marketType == "specials" &amp;amp;&amp;amp; impliedProbability &amp;lt; 0.10&lt;/code&gt;. Pinnacle longshots above 10× implied with sharp money backing are where the soft-book mispricings concentrate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recipe 4 — Tipster Discord auto-poster
&lt;/h2&gt;

&lt;p&gt;The cheapest one and the easiest to sell to a small operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sports: ["soccer"]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;leagueFilter: ["UEFA", "EPL", "La Liga"]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mode: "pre_match_only"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Every 6 hours, webhook → Discord&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; ~$30/month for a daily top-10 spreads + totals digest piped straight into the channel. If you currently screenshot OddsJam into Discord by hand, this is the upgrade.&lt;/p&gt;




&lt;h2&gt;
  
  
  The pay-per-event math in one table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;th&gt;Replaces&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Casual bettor — daily 9am pre-match dump, 30 fixtures&lt;/td&gt;
&lt;td&gt;~900 snapshots&lt;/td&gt;
&lt;td&gt;~$11&lt;/td&gt;
&lt;td&gt;$59/mo Odds API tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLV tracker — T-30 + T-1, 80 fixtures/wk&lt;/td&gt;
&lt;td&gt;~3.2K snapshots&lt;/td&gt;
&lt;td&gt;~$65&lt;/td&gt;
&lt;td&gt;$249/mo OddsJam Gold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tipster shop — 100 fixtures × 7 outcomes, hourly&lt;/td&gt;
&lt;td&gt;~21K snapshots&lt;/td&gt;
&lt;td&gt;~$245&lt;/td&gt;
&lt;td&gt;$249/mo OddsJam Gold (parity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specials trader — daily soccer sweep&lt;/td&gt;
&lt;td&gt;~6K snapshots&lt;/td&gt;
&lt;td&gt;~$250&lt;/td&gt;
&lt;td&gt;Highest-tier gate (not available below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EV model — live NBA + tennis + soccer, 90s cron&lt;/td&gt;
&lt;td&gt;~50K live snapshots&lt;/td&gt;
&lt;td&gt;~$1,200&lt;/td&gt;
&lt;td&gt;OddsJam Pro $499+ + you control cadence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flat-rate SaaS wins only once you cross ~150K snapshots/month of stable workload. Below that — which is most solo sharps, most tipster operations, and every specials trader — PPE is just cheaper, and the cost curve is linear in actual usage rather than tier-jumpy.&lt;/p&gt;

&lt;p&gt;The other PPE advantage that quietly compounds: there's no annual contract. Off-season for a sport? Cron stops, billing stops. You don't pay for unused capacity in August when soccer is dead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three steps to a running cron
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Pick your sports and markets.&lt;/strong&gt;&lt;br&gt;
Defaults are &lt;code&gt;["soccer", "tennis"]&lt;/code&gt; — the two highest-liquidity sharp markets year-round. For CLV add &lt;code&gt;"spreads", "totals"&lt;/code&gt;. For specials sniping add &lt;code&gt;"specials"&lt;/code&gt;. The full sport list is 11 deep (soccer, tennis, basketball, MMA, baseball, hockey, esports, AFL, NFL/college, golf, rugby).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Run once with default input&lt;/strong&gt; and verify Pinnacle returns data for your sport+league pick. Output lands in your Apify dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Save as Task → Schedules → New Schedule&lt;/strong&gt; with the cron string you want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;*/&lt;span class="m"&gt;5&lt;/span&gt; * * * *    &lt;span class="n"&gt;pre&lt;/span&gt;-&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;
* * * * *      &lt;span class="n"&gt;live&lt;/span&gt; &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="n"&gt;minute&lt;/span&gt; &lt;span class="n"&gt;during&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;windows&lt;/span&gt;
&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt; * * *      &lt;span class="n"&gt;daily&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;pre&lt;/span&gt;-&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;dump&lt;/span&gt;
&lt;span class="m"&gt;0&lt;/span&gt; */&lt;span class="m"&gt;6&lt;/span&gt; * * *    &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt;
&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; * * &lt;span class="m"&gt;6&lt;/span&gt;     &lt;span class="n"&gt;Saturday&lt;/span&gt; &lt;span class="n"&gt;morning&lt;/span&gt; &lt;span class="n"&gt;weekly&lt;/span&gt; &lt;span class="n"&gt;audit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Attach a webhook to the schedule and ship the dataset into your EV pipeline, Discord/Slack bot, Sheets workbook, or wherever your model lives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Python in 12 lines
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhorex/sports-odds-aggregator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;books&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pinnacle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;soccer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tennis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;marketTypes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;h2h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spreads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;totals&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specials&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pre_match_only&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxEventsPerSport&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deduplicationWindowSeconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;marketType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specials&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;impliedProbability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;evaluate_for_bet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole integration. Every snapshot arrives in a flat per-market-outcome shape with &lt;code&gt;priceAmerican&lt;/code&gt;, &lt;code&gt;priceFractional&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt; (decimal), &lt;code&gt;impliedProbability&lt;/code&gt;, and &lt;code&gt;isBestPriceAcrossBooks&lt;/code&gt; on every row — your model doesn't have to do format gymnastics or join against a separate American-odds conversion table.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a snapshot looks like
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"snapshotId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4e5f6789012345678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"book"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pinnacle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"soccer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"league"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Premier League"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"homeTeam"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Manchester City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"awayTeam"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Liverpool"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commenceTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-22T19:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isLive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"marketType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"h2h"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outcomeKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"home"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outcomeLabel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Home"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priceAmerican"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priceFractional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10/11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impliedProbability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.52356&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isBestPriceAcrossBooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scrapedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-18T14:32:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;snapshotId&lt;/code&gt; is a stable sha1 derived from book+event+market+outcome+timestamp, so it makes a clean primary key if you're persisting into Postgres / DuckDB.&lt;/p&gt;




&lt;h2&gt;
  
  
  For high-volume operations
&lt;/h2&gt;

&lt;p&gt;If your monthly burn is past 50K snapshots and you need a dedicated polling cadence, custom market types (Asian handicap quarter-lines, derivative props, fancy bets), or a schema SLA for a downstream production pipeline, the Actor page has an "Enterprise inquiry" pointer. Webhook integrations, dedicated proxy pools, and custom dataset views ship in roughly a week. Sustained seven-figure-action operations can talk dedicated-instance posture.&lt;/p&gt;

&lt;p&gt;For everyone else the default Apify Proxy works on Pinnacle's guest API — Pinnacle's public surface tolerates datacenter IPs by design (which is why it's on the supported-books list to begin with). If your plan includes datacenter, override &lt;code&gt;apifyProxyGroups: ["DATACENTER"]&lt;/code&gt; and your proxy cost drops to roughly 5% of a residential-default scraper.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things worth knowing before you run it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not US bookmakers.&lt;/strong&gt; DraftKings / FanDuel / BetMGM / Caesars / ESPN BET are geo-gated behind Akamai and need US residential proxy, which kills the per-snapshot economics. Other Apify Actors target those — this one stays out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal-analysis use only.&lt;/strong&gt; Pinnacle's TOS forbids commercial redistribution of raw odds. The architecture is per-buyer-execution — you run it in your own Apify account against your own polling cadence. Don't resell the feed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a streaming WebSocket feed.&lt;/strong&gt; Poll-based, fastest meaningful cadence ~60s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bet365 returns when Bet365 returns.&lt;/strong&gt; Cross-book best-price flag and fuzzy event-matching are already in the codebase; the day a second book ships, arb infra activates without an input change.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;If you currently pay The Odds API or OddsJam Gold $249/mo for the Pinnacle column, the cheapest experiment is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spin up the Actor with the default input.&lt;/li&gt;
&lt;li&gt;Run it on five of your usual fixtures.&lt;/li&gt;
&lt;li&gt;Compare the snapshots against whatever your incumbent feed gave you for the same fixtures.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The break-even comes faster than you'd expect — most workflows under 150K snapshots/month earn back the SaaS subscription inside the first month, and the dedup window keeps marginal cost near zero on stable lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actor link:&lt;/strong&gt; &lt;a href="https://apify.com/zhorex/sports-odds-aggregator" rel="noopener noreferrer"&gt;apify.com/zhorex/sports-odds-aggregator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the Actor saves you a month of OddsJam Gold, the single highest-leverage thing you can do back is a 30-second review on the Actor page — it directly funds the next defensive patch when the books shift their schemas.&lt;/p&gt;

&lt;p&gt;Roadmap is public: Smarkets adapter (v0.4) reactivates cross-book arb infra, Pinnacle alternate-lines / period markets (v0.5) opens half/quarter handicap decomposition, Betfair Exchange BYO-credentials (v0.6), WebSocket mode (v0.7), automatic arb finder (v0.8).&lt;/p&gt;

</description>
      <category>apify</category>
      <category>pinnacle</category>
      <category>sportsbetting</category>
      <category>scraping</category>
    </item>
  </channel>
</rss>
