<?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: Divya Raj</title>
    <description>The latest articles on DEV Community by Divya Raj (@meme_india_eeebe519dd204a).</description>
    <link>https://dev.to/meme_india_eeebe519dd204a</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%2F4222921%2F22a8f06e-965f-4a2a-a85f-fbf0471f52a2.png</url>
      <title>DEV Community: Divya Raj</title>
      <link>https://dev.to/meme_india_eeebe519dd204a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meme_india_eeebe519dd204a"/>
    <language>en</language>
    <item>
      <title>Bilibili API in 2026: Is There an Official API? 5 Ways to Get Bilibili Data (Compared)</title>
      <dc:creator>Divya Raj</dc:creator>
      <pubDate>Tue, 03 Nov 2026 18:01:44 +0000</pubDate>
      <link>https://dev.to/meme_india_eeebe519dd204a/bilibili-api-in-2026-is-there-an-official-api-5-ways-to-get-bilibili-data-compared-4f6n</link>
      <guid>https://dev.to/meme_india_eeebe519dd204a/bilibili-api-in-2026-is-there-an-official-api-5-ways-to-get-bilibili-data-compared-4f6n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Bilibili (哔哩哔哩, B站) has &lt;strong&gt;no official public API&lt;/strong&gt; for comments, danmaku, video stats or creator data. The endpoints that bilibili.com itself uses are undocumented, require &lt;strong&gt;WBI signing&lt;/strong&gt; (&lt;code&gt;w_rid&lt;/code&gt; and &lt;code&gt;wts&lt;/code&gt; parameters), and block unsigned or fast requests with errors like &lt;code&gt;-352&lt;/code&gt; and &lt;code&gt;-412&lt;/code&gt;. To get Bilibili data in 2026 you either handle that yourself or use a scraper that already does.&lt;/p&gt;

&lt;p&gt;This guide covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether a Bilibili API key or official docs exist&lt;/li&gt;
&lt;li&gt;What &lt;code&gt;-352&lt;/code&gt;, &lt;code&gt;-412&lt;/code&gt; and "request was banned" mean, and how to fix them&lt;/li&gt;
&lt;li&gt;5 ways to get Bilibili data, compared&lt;/li&gt;
&lt;li&gt;A working Python example (no login)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Is there an official Bilibili API?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No, not for public data.&lt;/strong&gt; There is no self-serve Bilibili API key that gives you comments, danmaku, video stats or creator profiles. What developers call "the Bilibili API" is the set of internal web endpoints under &lt;code&gt;api.bilibili.com&lt;/code&gt; that the website calls in your browser. They're undocumented and they change without notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there a Bilibili API key or documentation?
&lt;/h2&gt;

&lt;p&gt;There is no public API key for this data. The only "documentation" is community-maintained notes on GitHub, written by reverse-engineering the website. They're useful, but they go out of date whenever Bilibili changes its signing or risk control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does the Bilibili API return -352 or -412?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-352&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Risk control: the request is missing a valid WBI signature (&lt;code&gt;w_rid&lt;/code&gt; / &lt;code&gt;wts&lt;/code&gt;), or looks automated&lt;/td&gt;
&lt;td&gt;Sign the request with fresh WBI keys, send device cookies (&lt;code&gt;buvid3&lt;/code&gt;), slow down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;-412&lt;/code&gt; / HTTP 412&lt;/td&gt;
&lt;td&gt;"Request was banned": your IP is sending too much, too fast&lt;/td&gt;
&lt;td&gt;Back off, add delays, rotate to another IP or proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;code: 0&lt;/code&gt; but empty data&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Silent&lt;/strong&gt; risk control: Bilibili returns only a &lt;code&gt;v_voucher&lt;/code&gt; instead of data&lt;/td&gt;
&lt;td&gt;Detect it and retry; don't treat it as an empty page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most tutorials written before 2023 use old unsigned endpoints, which is why they now fail with these errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you get the &lt;code&gt;w_rid&lt;/code&gt; parameter?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;w_rid&lt;/code&gt; is an MD5 signature that Bilibili calls &lt;strong&gt;WBI&lt;/strong&gt;. Your client fetches two keys (&lt;code&gt;img_key&lt;/code&gt; and &lt;code&gt;sub_key&lt;/code&gt;) from the nav endpoint, mixes them into a "mixin key", sorts the request parameters, adds a timestamp (&lt;code&gt;wts&lt;/code&gt;) and hashes everything. The keys rotate, so they have to be refreshed when a signature is rejected.&lt;/p&gt;

&lt;p&gt;You can implement it yourself, or use a library or scraper that already does it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 ways to get Bilibili data (compared)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Handles WBI and risk control&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Official API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Doesn't exist for public data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. DIY &lt;code&gt;requests&lt;/code&gt; script&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Hours to days&lt;/td&gt;
&lt;td&gt;You build and maintain it&lt;/td&gt;
&lt;td&gt;Learning, one-off jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Community Python libraries&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Partly; they can break when Bilibili changes&lt;/td&gt;
&lt;td&gt;Developers who don't mind fixing breakages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Open-source scraper (self-host)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Developers who want full control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. Hosted scraper (no code)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pay per result&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;td&gt;Yes, plus proxies&lt;/td&gt;
&lt;td&gt;Analysts, marketers, scheduled monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Options 4 and 5 can be the same tool. The &lt;a href="https://apify.com/molded_mountainpass/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt; is open source (&lt;a href="https://github.com/Dunkmap/Bilibili-Scraper" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, MIT) and also runs as a hosted, no-code tool on Apify.&lt;/p&gt;

&lt;h2&gt;
  
  
  What data can you get without a login?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Login needed?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Comments, with full nested reply threads (23 fields each)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Danmaku (弹幕, bullet comments) with playback timestamps&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video stats: views, likes, coins, favourites, shares&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UP主 (creator) profiles: followers, likes, level, verified&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A creator's uploads, keyword search, popular and ranking feeds&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subtitles and AI captions&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt;: a &lt;code&gt;SESSDATA&lt;/code&gt; cookie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In a side-by-side test on 26 Oct 2026, the scraper's video stats and top 20 comments matched Bilibili exactly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bilibili API in Python: a working example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Dunkmap/Bilibili-Scraper
&lt;span class="nb"&gt;cd &lt;/span&gt;Bilibili-Scraper
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bilibili_scraper&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Scraper&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# No cookie or login needed; WBI signing and retries are handled for you
&lt;/span&gt;    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Scraper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&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;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BV1xx411c7mD&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;video&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;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;views&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bvid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&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;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;like&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;c&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="n"&gt;up&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;          &lt;span class="c1"&gt;# UP主 profile
&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;up&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;up&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;followers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or from the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bili video BV1xx411c7mD &lt;span class="nt"&gt;-o&lt;/span&gt; videos.csv
bili comments BV1xx411c7mD &lt;span class="nt"&gt;--replies&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; comments.csv
bili search &lt;span class="s2"&gt;"原神"&lt;/span&gt; &lt;span class="nt"&gt;--order&lt;/span&gt; click &lt;span class="nt"&gt;--limit&lt;/span&gt; 200 &lt;span class="nt"&gt;-o&lt;/span&gt; search.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  No-code: the Bilibili API as a hosted tool
&lt;/h2&gt;

&lt;p&gt;If you don't want to run Python, the hosted version works like an API you call from a form, a schedule, or code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/molded_mountainpass/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt; and click &lt;strong&gt;Try for free&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;code&gt;videos&lt;/code&gt;, &lt;code&gt;comments&lt;/code&gt;, &lt;code&gt;danmaku&lt;/code&gt;, &lt;code&gt;subtitles&lt;/code&gt; or &lt;code&gt;users&lt;/code&gt; (UP主).&lt;/li&gt;
&lt;li&gt;Paste links or type keywords, then click &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Export to &lt;strong&gt;Excel, CSV or JSON&lt;/strong&gt;, or call it over Apify's REST API, Make, Zapier or MCP for AI agents.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Price:&lt;/strong&gt; pay per result, no subscription. $0.005 per comment, video or creator profile and $0.001 per danmaku, so about $5 per 1,000 comments.&lt;/p&gt;

&lt;p&gt;For bullet comments only, the &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt; adds a keyword filter and a free per-video highlight timeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does Bilibili have an official API?&lt;/strong&gt;&lt;br&gt;
Not for public data such as comments, danmaku, video stats or creator profiles. Developers use the website's internal endpoints instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I get a Bilibili API key?&lt;/strong&gt;&lt;br&gt;
There isn't one for this data. The internal endpoints need WBI signing and device cookies, not an API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does Bilibili error -352 mean?&lt;/strong&gt;&lt;br&gt;
Risk control: the request has a missing or stale WBI signature, or looks automated. Re-sign it with fresh keys and slow down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does "request was banned" (-412) mean?&lt;/strong&gt;&lt;br&gt;
Your IP sent too many requests. Back off, add delays, or switch IP or proxy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use the Bilibili API without logging in?&lt;/strong&gt;&lt;br&gt;
Yes, for comments, danmaku, videos, search, creators and trending. Only subtitles need a login cookie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a Bilibili API for Python?&lt;/strong&gt;&lt;br&gt;
Yes. Community libraries exist, and the open-source &lt;a href="https://github.com/Dunkmap/Bilibili-Scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt; offers both a Python library and a CLI, with WBI signing built in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is scraping Bilibili legal?&lt;/strong&gt;&lt;br&gt;
It reads public data the same way the bilibili.com website does. Follow Bilibili's terms of service, keep request rates reasonable, and don't republish personal data.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Also read:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/meme_india_eeebe519dd204a/how-to-scrape-bilibili-comments-danmaku-and-upzhu-data-in-python-2026-no-login-2e3b"&gt;How to Scrape Bilibili Comments, Danmaku and UP主 Data in Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/meme_india_eeebe519dd204a/what-is-danmaku-how-to-download-bilibili-bullet-comments-and-find-any-videos-highlight-4cia"&gt;What Is Danmaku? How to Download Bilibili Bullet Comments and Find Any Video's Highlight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questions about a specific error code? Ask in the comments and I'll help you debug it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>datascience</category>
      <category>bilibili</category>
    </item>
    <item>
      <title>What Is Danmaku? How to Download Bilibili Bullet Comments and Find Any Video's Highlight Of Bilibili</title>
      <dc:creator>Divya Raj</dc:creator>
      <pubDate>Mon, 02 Nov 2026 18:48:52 +0000</pubDate>
      <link>https://dev.to/meme_india_eeebe519dd204a/what-is-danmaku-how-to-download-bilibili-bullet-comments-and-find-any-videos-highlight-of-bilibili-16jg</link>
      <guid>https://dev.to/meme_india_eeebe519dd204a/what-is-danmaku-how-to-download-bilibili-bullet-comments-and-find-any-videos-highlight-of-bilibili-16jg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ar2sorfte2nveju0hrt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ar2sorfte2nveju0hrt.png" alt=" " width="512" height="512"&gt;&lt;/a&gt;&lt;br&gt;
If you've ever opened a video on Bilibili (哔哩哔哩, B站), you've seen them: comments flying across the screen, right on top of the video. Those are &lt;strong&gt;danmaku&lt;/strong&gt; (弹幕, "bullet comments"), and they're one of the most interesting datasets on the Chinese internet.&lt;/p&gt;

&lt;p&gt;In this post:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What danmaku actually is, and why it's useful data&lt;/li&gt;
&lt;li&gt;How to download Bilibili bullet comments &lt;strong&gt;without a login&lt;/strong&gt; (no code, or Python)&lt;/li&gt;
&lt;li&gt;How to find any video's &lt;strong&gt;highlight moment&lt;/strong&gt; from danmaku density&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 &lt;strong&gt;Tool used:&lt;/strong&gt; &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper on Apify&lt;/a&gt; · &lt;a href="https://github.com/Dunkmap/Bilibili-Danmaku-Scraper" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is danmaku (弹幕)?
&lt;/h2&gt;

&lt;p&gt;Danmaku literally means "bullet curtain". On Bilibili, each danmaku is a short comment that viewers post &lt;strong&gt;at a specific second of the video&lt;/strong&gt;. Everyone who watches later sees it fly across the screen at that same moment.&lt;/p&gt;

&lt;p&gt;Some you'll see everywhere:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Danmaku&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;前方高能&lt;/td&gt;
&lt;td&gt;"High energy ahead!" (something big is about to happen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;名场面&lt;/td&gt;
&lt;td&gt;An iconic scene&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awsl&lt;/td&gt;
&lt;td&gt;"Too cute, I'm dying"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2333&lt;/td&gt;
&lt;td&gt;Laughing (like "lol")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;泪目&lt;/td&gt;
&lt;td&gt;Tears in my eyes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Unlike normal comments, &lt;strong&gt;every danmaku has a timestamp&lt;/strong&gt;. That makes it unusually good data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Highlight detection:&lt;/strong&gt; where danmaku spike, something happened.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Second-by-second audience reaction:&lt;/strong&gt; for trailers, ads, product launches or game reveals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment over time:&lt;/strong&gt; when do viewers love it, and when do they complain?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clip finding:&lt;/strong&gt; creators use spikes to decide which moments to cut into shorts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How to download Bilibili bullet comments (no login)
&lt;/h2&gt;

&lt;p&gt;Bilibili has no public API for danmaku, and there's a catch: logged out, Bilibili serves danmaku from &lt;strong&gt;two different endpoints&lt;/strong&gt;. One gives a sample across the video's whole lifetime, the other the most recent few thousand. They barely overlap, so most simple scripts miss a lot.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt; merges both. On a 34-minute video that gave &lt;strong&gt;5,416 danmaku rows&lt;/strong&gt; without logging in.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option 1: No code
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt; and click &lt;strong&gt;Try for free&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Paste video links, or give it search keywords, UP主 (creator) IDs or the popular/ranking feed.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;, then &lt;strong&gt;Export&lt;/strong&gt; to Excel, CSV or JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example input: the danmaku of the top 10 search results for a keyword, plus a free summary per video:&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;"searchQueries"&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;"原神"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxVideosPerSource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"videoSummary"&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="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;Each row is one bullet comment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Playback position in seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;mode&lt;/code&gt;, &lt;code&gt;fontsize&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Scrolling / top / bottom, size, colour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ctime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When it was sent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;bvid&lt;/code&gt;, &lt;code&gt;page&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Which video and part&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; $1 per 1,000 danmaku, no subscription. The per-video summary rows are free.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Dunkmap/Bilibili-Danmaku-Scraper
&lt;span class="nb"&gt;cd &lt;/span&gt;Bilibili-Danmaku-Scraper
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
bili danmaku BV1xx411c7mD &lt;span class="nt"&gt;-o&lt;/span&gt; danmaku.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Find a video's highlight from danmaku
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The quick way: the free summary row
&lt;/h3&gt;

&lt;p&gt;With &lt;code&gt;videoSummary: true&lt;/code&gt;, every video gets one extra &lt;strong&gt;free&lt;/strong&gt; row before its danmaku, with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;count&lt;/code&gt;: how many danmaku&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;density&lt;/code&gt;: a 20-slice timeline of how busy each part of the video is&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;peak_time&lt;/code&gt;: the busiest moment, which is usually the highlight&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;top_phrases&lt;/code&gt;: the most repeated phrases&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;samples&lt;/code&gt;: a handful of distinct texts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you can find the highlight of 100 videos without paying for a single danmaku row. Just read &lt;code&gt;peak_time&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The DIY way: pandas
&lt;/h3&gt;

&lt;p&gt;If you exported the full danmaku as CSV:&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;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;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="nf"&gt;read_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;danmaku.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;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="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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;notna&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;          &lt;span class="c1"&gt;# keep danmaku rows only
&lt;/span&gt;
&lt;span class="c1"&gt;# danmaku per 30-second window
&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;window&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;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;time&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;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="n"&gt;per_window&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;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;window&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;per_window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;idxmax&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="s"&gt;Highlight around &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;60&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="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="n"&gt;d&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="c1"&gt;# what people were saying at the peak
&lt;/span&gt;&lt;span class="n"&gt;at_peak&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="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;window&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;peak&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at_peak&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value_counts&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;span class="n"&gt;per_window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Danmaku per 30 s&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;At the peak you'll typically see a burst of 前方高能, 名场面 or 哈哈哈.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful extras
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keyword filter&lt;/strong&gt; (&lt;code&gt;keywords&lt;/code&gt;): keep only danmaku containing certain words, for example a brand or product name. Filtering happens &lt;strong&gt;before&lt;/strong&gt; charging, so you only pay for matches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment analysis:&lt;/strong&gt; label each danmaku positive, neutral or negative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta mode:&lt;/strong&gt; for scheduled monitoring, return only danmaku that are new since the last run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Need comments, video stats or UP主 profiles too? Use the full &lt;a href="https://apify.com/molded_mountainpass/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does danmaku mean?&lt;/strong&gt; 弹幕 (danmaku) means "bullet curtain": comments that fly across a video at the moment they were posted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between danmaku and comments?&lt;/strong&gt; Comments sit below the video. Danmaku are tied to a playback second and appear on top of the video.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I download Bilibili danmaku without an account?&lt;/strong&gt; Yes. No login or cookie is needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I export danmaku to Excel?&lt;/strong&gt; Yes. On Apify, click Export → Excel. Locally, use &lt;code&gt;-o danmaku.csv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I hide danmaku on Bilibili?&lt;/strong&gt; Click the 弹 toggle under the video player. (You don't have to hide it to scrape it. 😉)&lt;/p&gt;




&lt;p&gt;Have you used danmaku data for something interesting, like trailers, esports or music videos? Tell me in the comments! And if you try the &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt;, I'd love your feedback.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webscraping</category>
      <category>bilibili</category>
    </item>
    <item>
      <title>What Is Danmaku? How to Download Bilibili Bullet Comments and Find Any Video's Highlight</title>
      <dc:creator>Divya Raj</dc:creator>
      <pubDate>Mon, 02 Nov 2026 18:46:15 +0000</pubDate>
      <link>https://dev.to/meme_india_eeebe519dd204a/what-is-danmaku-how-to-download-bilibili-bullet-comments-and-find-any-videos-highlight-4cia</link>
      <guid>https://dev.to/meme_india_eeebe519dd204a/what-is-danmaku-how-to-download-bilibili-bullet-comments-and-find-any-videos-highlight-4cia</guid>
      <description>&lt;p&gt;If you've ever opened a video on Bilibili (哔哩哔哩, B站), you've seen them: comments flying across the screen, right on top of the video. Those are &lt;strong&gt;danmaku&lt;/strong&gt; (弹幕, "bullet comments"), and they're one of the most interesting datasets on the Chinese internet.&lt;/p&gt;

&lt;p&gt;In this post:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What danmaku actually is, and why it's useful data&lt;/li&gt;
&lt;li&gt;How to download Bilibili bullet comments &lt;strong&gt;without a login&lt;/strong&gt; (no code, or Python)&lt;/li&gt;
&lt;li&gt;How to find any video's &lt;strong&gt;highlight moment&lt;/strong&gt; from danmaku density&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 &lt;strong&gt;Tool used:&lt;/strong&gt; &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper on Apify&lt;/a&gt; · &lt;a href="https://github.com/Dunkmap/Bilibili-Danmaku-Scraper" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is danmaku (弹幕)?
&lt;/h2&gt;

&lt;p&gt;Danmaku literally means "bullet curtain". On Bilibili, each danmaku is a short comment that viewers post &lt;strong&gt;at a specific second of the video&lt;/strong&gt;. Everyone who watches later sees it fly across the screen at that same moment.&lt;/p&gt;

&lt;p&gt;Some you'll see everywhere:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Danmaku&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;前方高能&lt;/td&gt;
&lt;td&gt;"High energy ahead!" (something big is about to happen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;名场面&lt;/td&gt;
&lt;td&gt;An iconic scene&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awsl&lt;/td&gt;
&lt;td&gt;"Too cute, I'm dying"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2333&lt;/td&gt;
&lt;td&gt;Laughing (like "lol")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;泪目&lt;/td&gt;
&lt;td&gt;Tears in my eyes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Unlike normal comments, &lt;strong&gt;every danmaku has a timestamp&lt;/strong&gt;. That makes it unusually good data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Highlight detection:&lt;/strong&gt; where danmaku spike, something happened.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Second-by-second audience reaction:&lt;/strong&gt; for trailers, ads, product launches or game reveals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment over time:&lt;/strong&gt; when do viewers love it, and when do they complain?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clip finding:&lt;/strong&gt; creators use spikes to decide which moments to cut into shorts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to download Bilibili bullet comments (no login)
&lt;/h2&gt;

&lt;p&gt;Bilibili has no public API for danmaku, and there's a catch: logged out, Bilibili serves danmaku from &lt;strong&gt;two different endpoints&lt;/strong&gt;. One gives a sample across the video's whole lifetime, the other the most recent few thousand. They barely overlap, so most simple scripts miss a lot.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt; merges both. On a 34-minute video that gave &lt;strong&gt;5,416 danmaku rows&lt;/strong&gt; without logging in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: No code
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt; and click &lt;strong&gt;Try for free&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Paste video links, or give it search keywords, UP主 (creator) IDs or the popular/ranking feed.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;, then &lt;strong&gt;Export&lt;/strong&gt; to Excel, CSV or JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example input: the danmaku of the top 10 search results for a keyword, plus a free summary per video:&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;"searchQueries"&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;"原神"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxVideosPerSource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"videoSummary"&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="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;Each row is one bullet comment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Playback position in seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;mode&lt;/code&gt;, &lt;code&gt;fontsize&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Scrolling / top / bottom, size, colour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ctime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When it was sent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;bvid&lt;/code&gt;, &lt;code&gt;page&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Which video and part&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; $1 per 1,000 danmaku, no subscription. The per-video summary rows are free.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Dunkmap/Bilibili-Danmaku-Scraper
&lt;span class="nb"&gt;cd &lt;/span&gt;Bilibili-Danmaku-Scraper
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
bili danmaku BV1xx411c7mD &lt;span class="nt"&gt;-o&lt;/span&gt; danmaku.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Find a video's highlight from danmaku
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The quick way: the free summary row
&lt;/h3&gt;

&lt;p&gt;With &lt;code&gt;videoSummary: true&lt;/code&gt;, every video gets one extra &lt;strong&gt;free&lt;/strong&gt; row before its danmaku, with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;count&lt;/code&gt;: how many danmaku&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;density&lt;/code&gt;: a 20-slice timeline of how busy each part of the video is&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;peak_time&lt;/code&gt;: the busiest moment, which is usually the highlight&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;top_phrases&lt;/code&gt;: the most repeated phrases&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;samples&lt;/code&gt;: a handful of distinct texts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you can find the highlight of 100 videos without paying for a single danmaku row. Just read &lt;code&gt;peak_time&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The DIY way: pandas
&lt;/h3&gt;

&lt;p&gt;If you exported the full danmaku as CSV:&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;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;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="nf"&gt;read_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;danmaku.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;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="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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;notna&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;          &lt;span class="c1"&gt;# keep danmaku rows only
&lt;/span&gt;
&lt;span class="c1"&gt;# danmaku per 30-second window
&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;window&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;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;time&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;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="n"&gt;per_window&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;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;window&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;per_window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;idxmax&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="s"&gt;Highlight around &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;60&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="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="n"&gt;d&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="c1"&gt;# what people were saying at the peak
&lt;/span&gt;&lt;span class="n"&gt;at_peak&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="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;window&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;peak&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at_peak&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value_counts&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;span class="n"&gt;per_window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Danmaku per 30 s&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;At the peak you'll typically see a burst of 前方高能, 名场面 or 哈哈哈.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful extras
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keyword filter&lt;/strong&gt; (&lt;code&gt;keywords&lt;/code&gt;): keep only danmaku containing certain words, for example a brand or product name. Filtering happens &lt;strong&gt;before&lt;/strong&gt; charging, so you only pay for matches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment analysis:&lt;/strong&gt; label each danmaku positive, neutral or negative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta mode:&lt;/strong&gt; for scheduled monitoring, return only danmaku that are new since the last run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Need comments, video stats or UP主 profiles too? Use the full &lt;a href="https://apify.com/molded_mountainpass/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does danmaku mean?&lt;/strong&gt; 弹幕 (danmaku) means "bullet curtain": comments that fly across a video at the moment they were posted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between danmaku and comments?&lt;/strong&gt; Comments sit below the video. Danmaku are tied to a playback second and appear on top of the video.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I download Bilibili danmaku without an account?&lt;/strong&gt; Yes. No login or cookie is needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I export danmaku to Excel?&lt;/strong&gt; Yes. On Apify, click Export → Excel. Locally, use &lt;code&gt;-o danmaku.csv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I hide danmaku on Bilibili?&lt;/strong&gt; Click the 弹 toggle under the video player. (You don't have to hide it to scrape it. 😉)&lt;/p&gt;




&lt;p&gt;Have you used danmaku data for something interesting, like trailers, esports or music videos? Tell me in the comments! And if you try the &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt;, I'd love your feedback.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffsl56ux26tpegbmvempz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffsl56ux26tpegbmvempz.png" alt=" " width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>productivity</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>How to Scrape Bilibili Comments, Danmaku and UP主 Data in Python (2026, No Login)</title>
      <dc:creator>Divya Raj</dc:creator>
      <pubDate>Mon, 02 Nov 2026 18:39:02 +0000</pubDate>
      <link>https://dev.to/meme_india_eeebe519dd204a/how-to-scrape-bilibili-comments-danmaku-and-upzhu-data-in-python-2026-no-login-2e3b</link>
      <guid>https://dev.to/meme_india_eeebe519dd204a/how-to-scrape-bilibili-comments-danmaku-and-upzhu-data-in-python-2026-no-login-2e3b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgtvqlw9yx4thbvn1pgas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgtvqlw9yx4thbvn1pgas.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
Bilibili (哔哩哔哩, B站) is China's biggest video platform for anime, gaming, tech and lifestyle. Its comment sections and &lt;strong&gt;danmaku&lt;/strong&gt; (弹幕, the bullet comments that fly across the video) are a goldmine for market research, sentiment analysis and influencer discovery.&lt;/p&gt;

&lt;p&gt;The problem: Bilibili has &lt;strong&gt;no official public API&lt;/strong&gt; for this data. Its web endpoints now need a &lt;strong&gt;&lt;code&gt;w_rid&lt;/code&gt; / &lt;code&gt;wts&lt;/code&gt; signature (WBI signing)&lt;/strong&gt;, they throw silent risk-control errors (&lt;code&gt;-352&lt;/code&gt;, &lt;code&gt;-412&lt;/code&gt;) and they rate-limit you. Most tutorials from before 2023 use old unsigned endpoints and simply don't work anymore.&lt;/p&gt;

&lt;p&gt;In this post I'll show two ways to get the data &lt;strong&gt;without a Bilibili account&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No code:&lt;/strong&gt; a ready-made Bilibili scraper on Apify, with a 1-click export to Excel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python:&lt;/strong&gt; the same open-source library, run locally.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 &lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://apify.com/molded_mountainpass/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper on Apify&lt;/a&gt; · &lt;a href="https://github.com/Dunkmap/Bilibili-Scraper" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What you can scrape
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hot or newest first, with full nested reply threads. 23 fields per comment: user, likes, pinned, VIP, verified, "liked by uploader", IP location, reply count…&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Danmaku (bullet comments)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every bullet comment as its own row, with its playback time, colour, mode and send time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Videos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Views, likes, coins, favourites, shares, danmaku and reply counts, tags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UP主 (creators)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Name, bio, level, verified title, VIP, followers, following, video count, total likes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Creator uploads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every video a creator uploaded, sorted by date, views or favourites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search &amp;amp; trending&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keyword search (sort by views, date, danmaku…), the popular feed and the top-100 ranking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subtitles / transcripts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Including AI captions. This is the one thing that needs a login cookie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Option 1: No code (Apify)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;&lt;a href="https://apify.com/molded_mountainpass/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt;&lt;/strong&gt; and click &lt;strong&gt;Try for free&lt;/strong&gt;. A free Apify account includes monthly credit.&lt;/li&gt;
&lt;li&gt;Pick &lt;strong&gt;What to scrape&lt;/strong&gt;: &lt;code&gt;videos&lt;/code&gt;, &lt;code&gt;comments&lt;/code&gt;, &lt;code&gt;danmaku&lt;/code&gt;, &lt;code&gt;subtitles&lt;/code&gt; or &lt;code&gt;users&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Give it a source: paste video links, &lt;code&gt;space.bilibili.com/...&lt;/code&gt; creator links or search links, or just type keywords such as &lt;code&gt;原神&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;, then &lt;strong&gt;Export&lt;/strong&gt; to Excel, CSV or JSON (or send it straight to Google Sheets).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: the comments, with replies, on the top 20 search results for a keyword:&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;"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;"comments"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"searchQueries"&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;"原神"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxVideosPerSource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxCommentsPerVideo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeReplies"&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="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;h3&gt;
  
  
  Scraping UP主 (creator) profiles
&lt;/h3&gt;

&lt;p&gt;Set &lt;code&gt;mode&lt;/code&gt; to &lt;code&gt;users&lt;/code&gt; and pass creator IDs (the number in &lt;code&gt;space.bilibili.com/&amp;lt;UID&amp;gt;&lt;/code&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;"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;"users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userIds"&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;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"546195"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row has &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;sign&lt;/code&gt; (bio), &lt;code&gt;level&lt;/code&gt;, &lt;code&gt;verified&lt;/code&gt;, &lt;code&gt;vip&lt;/code&gt;, &lt;code&gt;followers&lt;/code&gt;, &lt;code&gt;following&lt;/code&gt;, &lt;code&gt;videos&lt;/code&gt;, &lt;code&gt;likes&lt;/code&gt; and the profile &lt;code&gt;url&lt;/code&gt;. To get a creator's videos instead, use &lt;code&gt;mode: "videos"&lt;/code&gt; with the same &lt;code&gt;userIds&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; pay per result, no subscription. $0.005 per comment, video or creator profile and $0.001 per danmaku, so 1,000 comments cost about $5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: Python
&lt;/h2&gt;

&lt;p&gt;The scraper is open source (MIT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Dunkmap/Bilibili-Scraper
&lt;span class="nb"&gt;cd &lt;/span&gt;Bilibili-Scraper
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bili comments BV1xx411c7mD &lt;span class="nt"&gt;--replies&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; comments.csv
bili danmaku BV1xx411c7mD &lt;span class="nt"&gt;-o&lt;/span&gt; danmaku.csv
bili user 2                                   &lt;span class="c"&gt;# UP主 profile&lt;/span&gt;
bili uploads 2 &lt;span class="nt"&gt;--order&lt;/span&gt; click &lt;span class="nt"&gt;--limit&lt;/span&gt; 100 &lt;span class="nt"&gt;-o&lt;/span&gt; uploads.csv
bili search &lt;span class="s2"&gt;"原神"&lt;/span&gt; &lt;span class="nt"&gt;--order&lt;/span&gt; click &lt;span class="nt"&gt;--limit&lt;/span&gt; 200 &lt;span class="nt"&gt;-o&lt;/span&gt; search.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or as a library:&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;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bilibili_scraper&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Scraper&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Scraper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&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;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BV1xx411c7mD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bvid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&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;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;c&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="n"&gt;creator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner_mid&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;creator&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;creator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;followers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_videos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;click&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&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;v&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;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;views&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it handles w_rid signing and risk control
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WBI signing:&lt;/strong&gt; fetches &lt;code&gt;img_key&lt;/code&gt; / &lt;code&gt;sub_key&lt;/code&gt;, generates &lt;code&gt;w_rid&lt;/code&gt; and &lt;code&gt;wts&lt;/code&gt;, caches the keys and refreshes them when Bilibili rejects a signature (&lt;code&gt;-352&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent risk control:&lt;/strong&gt; Bilibili sometimes answers &lt;code&gt;code: 0&lt;/code&gt; with only a &lt;code&gt;v_voucher&lt;/code&gt; and no data. The scraper detects this and retries instead of treating it as an empty page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device cookies:&lt;/strong&gt; generates a &lt;code&gt;buvid&lt;/code&gt; itself, so no account is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits:&lt;/strong&gt; jittered delays and backoff retries on &lt;code&gt;-412&lt;/code&gt;. The cloud version also switches to a proxy when it gets blocked.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extras
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment analysis:&lt;/strong&gt; label every comment and danmaku positive, neutral or negative, using your own free Groq API key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta mode:&lt;/strong&gt; scheduled runs return only items that are new since the last run, which is handy for brand monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Danmaku-only version:&lt;/strong&gt; if you only need bullet comments, the &lt;a href="https://apify.com/molded_mountainpass/bilibili-danmaku-scraper" rel="noopener noreferrer"&gt;Bilibili Danmaku Scraper&lt;/a&gt; adds a keyword filter and a free per-video "highlight" timeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is there an official Bilibili API?&lt;/strong&gt; No public one for comments or danmaku. This project uses the same web endpoints bilibili.com uses and handles their signing for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I read Bilibili comments without an account?&lt;/strong&gt; Yes. Comments, danmaku, videos, search, creators and trending all work logged out. Only subtitles need a cookie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I generate &lt;code&gt;w_rid&lt;/code&gt;?&lt;/strong&gt; You don't have to. The scraper signs every request itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I export Bilibili comments to Excel?&lt;/strong&gt; Yes. On Apify, click Export → Excel. Locally, use &lt;code&gt;-o comments.csv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this legal?&lt;/strong&gt; It reads public data the same way the bilibili.com website does. Respect Bilibili's terms, keep the request rate reasonable, and don't republish personal data.&lt;/p&gt;




&lt;p&gt;If this helped, try the &lt;a href="https://apify.com/molded_mountainpass/bilibili-scraper" rel="noopener noreferrer"&gt;Bilibili Scraper&lt;/a&gt; or ⭐ the &lt;a href="https://github.com/Dunkmap/Bilibili-Scraper" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;. Questions and feature requests are welcome in the comments!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F12b5wrllw2s56d4n9s83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F12b5wrllw2s56d4n9s83.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>productivity</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
