Bilibili Video & Search Scraper
Pricing
from $2.00 / 1,000 bilibili video & search scrapers
Bilibili Video & Search Scraper
Collect public Bilibili video, comment, danmaku, and search data. Get dataset rows; searchVideo card play and danmaku counts derive from rounded labels and are approximate. Run an operation with an input; no account or API key. Free-plan pricing: $0.002 per row plus $0.00005 per Actor Start event.
Pricing
from $2.00 / 1,000 bilibili video & search scrapers
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Features
Share
Bilibili Scraper
Scrape public video, creator, relation, comment, danmaku, subtitle, and keyword-search data from bilibili.com with one operation per run. Pricing on the Free plan is $0.002 per dataset row plus $0.00005 per apify-actor-start event.
- Search public video cards by keyword with titles, URLs, creators, counts, durations, and publication dates.
- Collect creator profiles, relation statistics, and creator videos for creator research.
- Extract comments and danmaku for audience-feedback analysis.
- Collect video details and subtitle metadata for cataloging.
- Run without signing in or an API key.
What you get
Each run uses one operation. Rows contain source-backed values and normalized aliases; unavailable fields are omitted.
| Field family | Fields | Type | What it contains |
|---|---|---|---|
| Run metadata | _operation, _fetchedAt, status | string or ISO 8601 string | Operation, UTC time, and row status |
| Pagination and provenance | _page, _sourceKeyword, _sourceAid, _sourceCid | integer or string | Page number and source IDs |
| Video identity | title, url, videoTitle, videoDesc, bvid, aid, cid | string | Titles, descriptions, IDs, and canonical URL |
| Video page assets | videoPageUrl, coverUrl | string | Video and cover URLs |
| Timing and publication | durationSec, durationStr, publishedAt, publishedDate, createdAt | integer or string | Duration and publication or creation values |
| Category and tags | videoTypeId, videoTypeName, tags | integer, string, or array of strings | Categories and page tags |
| Video metrics | playCount, playCountDisplay, likeCount, coinCount, favoriteCount, shareCount, commentCount, danmuCount, danmuCountDisplay | integer or string | Video counts and display labels |
| Video parts | videoPageCount, videoPages | integer or array | Listed parts and part data |
| Creator profile | userId, userName, userPageUrl, avatarUrl, bio, sex, school, profession, level, userVipStatus, verification | string or integer | Creator or commenter identity and profile fields |
| Creator relations | followerCount, followingCount, whisperCount, archiveCount | integer | Relation and archive statistics |
| Comment identity | commentId, parentCommentId, rootCommentId, userLevel | string or integer | Comment and author identifiers |
| Comment content | commentText, replyCount, commentTime | string or integer | Text, replies, and creation time |
| Danmaku data | danmuId, danmuText, timeOffsetSec, mode, fontSize, color, pool, userHash | string, number, or integer | Text, timing, display values, and source hash |
| Subtitle metadata | subtitleId, subtitleLanguage, subtitleName, subtitleType, subtitleUrl | string or integer | Subtitle IDs, languages, type, and URL |
Fields by operation
| Operation | Fields returned (when the source provides them) |
|---|---|
searchVideo | Run metadata, _page, _sourceKeyword, title, videoTitle, url, videoPageUrl, bvid, coverUrl, userId, userName, userPageUrl, playCount, playCountDisplay, danmuCount, danmuCountDisplay, durationStr, durationSec, publishedDate |
videoDetail | Run metadata, video identity, aid, cid, videoDesc, coverUrl, durationSec, publishedAt, createdAt, videoTypeId, videoTypeName, creator identity, the seven video counts (playCount, likeCount, coinCount, favoriteCount, shareCount, commentCount, danmuCount), videoPageCount, videoPages, tags, plus creator fields from the page (bio, sex, level, userVipStatus, verification, followerCount, followingCount, archiveCount) |
userDetail | Run metadata, userId, userName, title, url, userPageUrl, avatarUrl, bio, sex, school, profession, publishedAt, level, userVipStatus, verification, archiveCount, followerCount, followingCount, whisperCount |
userRelationStat | Run metadata, userId, url, userPageUrl, followerCount, followingCount, whisperCount |
userVideos | Run metadata, _page, video identity, aid, videoDesc, coverUrl, durationStr, durationSec, publishedAt, playCount, commentCount, videoTypeName, userId, userName, userPageUrl |
videoComments | Run metadata, _page, title, url, videoPageUrl, aid, commentId, parentCommentId, rootCommentId, commentText, userId, userName, userPageUrl, likeCount, replyCount, commentTime, userLevel, userVipStatus |
videoDanmu | Run metadata, _page, url, videoPageUrl, aid, cid, _sourceAid, _sourceCid, danmuText, timeOffsetSec, mode, fontSize, color, createdAt, pool, userHash, danmuId |
videoCaption | Run metadata, bvid, aid, cid, url, videoPageUrl, videoTitle, title, subtitleId, subtitleLanguage, subtitleName, subtitleType, subtitleUrl |
searchVideo playCount and danmuCount are approximate: the Actor derives them from the rounded labels on search cards (for example 2079.9万), and the exact label is kept in playCountDisplay and danmuCountDisplay. In videoDetail the counts come from the video page's stat block.
Sample output
This shortened sample omits duplicate video-title and URL fields, plus cover and profile URL fields. All shown values are copied from one real dataset record.
{"_operation": "searchVideo","_fetchedAt": "2026-10-15T01:25:24.113157+00:00","status": "success","_page": 1,"title": "【全748集】目前B站最全最细的Python零基础全套教程,2026最新版,包含所有干货!七天就能从小白到大神!少走99%的弯路!存下吧!很难找全的!","url": "https://www.bilibili.com/video/BV1rpWjevEip/","bvid": "BV1rpWjevEip","_sourceKeyword": "python","userId": "3546597933714079","userName": "Python官方课程","playCountDisplay": "2079.9万","playCount": 20799000,"danmuCountDisplay": "13.3万","danmuCount": 133000,"durationStr": "39:58:14","durationSec": 143894,"publishedDate": "2024年8月22日"}
Pricing
Billing uses pay-per-event pricing. A dataset row is billed once as one scraped result with all fields.
| Charge event | Billing unit | Price on the Free plan | Condition |
|---|---|---|---|
apify-actor-start | One Actor Start event | $0.00005 per event on the Free plan | Charged when the Actor starts running |
apify-default-dataset-item | One dataset row | $0.002 per event on the Free plan | One scraped result with all fields |
At 1,000 events, apify-actor-start costs $0.05 on the Free plan and apify-default-dataset-item costs $2 on the Free plan; at 10,000 events, those charges are $0.5 on the Free plan and $20 on the Free plan, respectively.
2,499 x $0.002 = $4.998 on the Free plan.
The monthly platform usage credit on the Apify Free plan is $5. At the default maxResults of 50 and one apify-actor-start event per run, the Free plan credit covers 49 full runs (2,450 dataset rows); additional start events reduce that count.
Only the events listed above are charged. This Actor does not use the Pay per event + usage option, so compute, proxy traffic, and storage are not billed separately.
How to use
- Choose one operation:
videoDetail,userDetail,userRelationStat,userVideos,videoComments,videoDanmu,videoCaption, orsearchVideo. - Enter the matching identifier:
keywordforsearchVideo;bvidforvideoDetailorvideoCaption;userIdfor creator operations;aidfor comments; and bothaidandcidfor danmaku. - Set
maxResultsfor the row cap andmaxPagesfor search, creator-video, or comment pagination. - Select an optional Apify proxy configuration.
- Start the run and inspect the resulting dataset rows.
- Repeat the run through Apify Schedules; daily is a starting point for tracking keyword search results or creator videos.
{"operation": "searchVideo","keyword": "python","maxResults": 10,"maxPages": 2,"proxyConfiguration": {"useApifyProxy": false}}
Export the dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
operation | Selects the collection mode: videoDetail, userDetail, userRelationStat, userVideos, videoComments, videoDanmu, videoCaption, or searchVideo. | searchVideo |
keyword | Search term for searchVideo; Chinese, English, and mixed terms are accepted. | Not set |
bvid | Bilibili BV identifier for videoDetail and videoCaption; expects BV plus 10 letters or digits. | Not set |
aid | Positive numeric video ID for videoComments and videoDanmu. | Not set |
cid | Positive numeric video-part ID for videoDanmu. | Not set |
userId | Positive numeric creator ID for userDetail, userRelationStat, and userVideos. | Not set |
maxResults | Maximum dataset rows; the schema accepts 1 through 1000. | 50 |
maxPages | Page limit for search, creator videos, and comments; the schema accepts 1 through 50. | 5 |
proxyConfiguration | Optional proxy settings. When the field is omitted or the proxy is disabled, requests go out over a direct connection. The example input above turns the proxy off. | Apify proxy on, RESIDENTIAL group ({"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}) |
Limits and edge cases
Records are built before output writing. After collection, rows are pushed one at a time; a failure before writing leaves no rows, while an abort or timeout during writing leaves rows already written.
| Condition | What the buyer sees | What to do |
|---|---|---|
maxResults is reached | No more than the selected row cap is written. | Increase maxResults within the schema range. |
A paginated operation reaches maxPages | Search, creator-video, or comment collection stops at the configured limit. | Increase maxPages up to 50 and adjust maxResults. |
| Pagination reaches the source end or returns no page rows | Fewer rows than requested, or no rows, may be written. | Check the keyword or identifier and try again. |
| Bilibili returns a challenge page or HTTP 403, 406, or 412 | The run fails instead of treating the challenge as data; requests are retried up to three attempts. | Try an optional Apify proxy configuration or rerun later. |
A video detail page has no usable videoData, a creator response has no creator name, or relation statistics have no usable data | The affected operation fails. | Verify the Bilibili identifier and rerun. |
| Danmaku returns a non-XML response or unparsable XML | The danmaku operation fails. | Verify aid and cid, then rerun. |
The schema accepts maxResults from 1 through 1000. The execution path also returns zero rows when it receives maxResults equal to 0, although that value is outside the schema range.
FAQ
How much does it cost to scrape Bilibili?
On the Free plan, the Actor charges $0.002 per dataset row.
2,499 x $0.002 = $4.998 on the Free plan.
Do I need a Bilibili account or API key?
No. The Actor does not sign in and does not require a Bilibili account or API key. You provide the collection inputs through your Apify account.
Why did my run return no rows?
A keyword may have no matching rows, or creator-video and comment collection may reach the source end. Danmaku and subtitle metadata operations may also return no rows when the public source provides no corresponding records. Check the operation, identifier, and pagination settings before rerunning.
What happens if Bilibili returns an anti-bot challenge?
The Actor detects challenge pages and fails the affected run rather than treating the page as a collected record. Try an optional Apify proxy configuration or run the collection again later.
Is it legal to scrape Bilibili public data?
The Actor reads public Bilibili page data and public endpoints. Whether a particular use is allowed depends on Bilibili’s source terms and applicable law for your use case; the Actor does not provide a legal guarantee.
Related actors
- Douyin Scraper — related Chinese social-video data collection for hot trends and videos.
- Bluesky Scraper — collects Bluesky posts, profiles, and followers.
- Facebook Comments Scraper — related public comment collection for Facebook.