
Instagram Reel Scraper
scrape.ly/store/echofield/instagram-reel-scraperSocial mediaVideos
1 monthly user

Scrape public Bilibili videos, comments, danmaku, trending videos, and creator profiles. Search in Chinese or English, read a video, or track a creator. No login.
Collect public Bilibili videos, comments, danmaku profiles, trending videos and creator pages without a login. Search in Chinese or English, open a video by URL or BV id, or read a creator from a numeric id.
Each saved row costs $13 per 1,000 results, and a 10-video search ran in about 8 seconds in our tests.
| Field | Default | What it does |
|---|---|---|
mode | search | search, video_detail, video_comments, user_videos, user_profile or popular. |
searchQuery | 人工智能教程 | Used in search mode. |
videoUrls | empty | Video URLs or BV ids for details and comments. |
userIds | empty | Numeric creator ids or space.bilibili.com links. |
maxResults | 10 | Total videos (or profiles in creator profile mode) for the run. Comments, replies and danmaku rows are extra; creator videos add one profile row per creator on top. |
sortOrder, durationFilter | totalrank, any | Search sort and duration filters. |
pubtimeBegin, pubtimeEnd | empty | Search date range (UTC). |
category | all | Popular mode: trending feed or one zone ranking. |
includeComments, includeReplies, maxComments, sortComments | off, off, 20, hot | Comment options. Replies count toward the cap. |
includeDanmaku, danmakuSampleSize | off, 25 | One extra danmaku row per video. |
sentimentAnalysis | off | Local score on the row text. |
deltaMode, deltaStateKey | off, default | Skip video ids already returned in earlier runs. |
proxyConfiguration | Datacenter | Switch to residential if a run is blocked. |
Search:
{
"mode": "search",
"searchQuery": "人工智能教程",
"maxResults": 10
}
Comments on one video:
{
"mode": "video_comments",
"videoUrls": ["https://www.bilibili.com/video/BV1iqpt6cEMU"],
"maxComments": 10,
"sortComments": "hot"
}
A creator profile:
{
"mode": "user_profile",
"userIds": ["546195"]
}
Search and popular runs save one row per video. Video details add coins, shares and tags. Comment mode saves one row per comment, and creator profiles one row per creator. Creator videos save one profile row per creator (with at least one matching video) followed by that creator's videos; maxResults caps the videos across all creators, so 3 creators with maxResults 15 return up to 15 videos plus up to 3 profile rows. Danmaku rows have type: danmaku. With sentiment on, each row gains a sentiment object with polarity, score from -1 to 1, and method.
| Field | Description |
|---|---|
type | video, comment, profile or danmaku. |
bvid, aid, title, url | Video identifiers, title and link. |
viewCount, likeCount, favoriteCount, replyCount, danmakuCount | Engagement counts. |
coinCount, shareCount | Filled in video details; empty in search rows. |
duration, durationFormatted | Length. |
authorName, authorMid | Uploader. |
publishDate, tags, category | Publish time and classification. |
Example item (trimmed):
{
"type": "video",
"bvid": "BV1TdpT6tE5C",
"title": "(已离职)冒死上传!替大家付费了,花 9880 买的具身智能全套系统教程...",
"url": "https://www.bilibili.com/video/BV1TdpT6tE5C",
"duration": 14462,
"durationFormatted": "241:2",
"viewCount": 1606,
"likeCount": 22,
"coinCount": null,
"favoriteCount": 80,
"shareCount": null,
"danmakuCount": 0,
"replyCount": 5,
"authorName": "人工智能教程",
"publishDate": "2026-10-07T09:25:00+00:00",
"category": "计算机技术",
"tags": ["人工智能", "机器人"]
}
Search rows leave coinCount and shareCount empty because that endpoint does not send them. A count the source sends as zero stays zero.
You pay $0.013 per saved row, which is $13 per 1,000 results, plus platform usage. A video, a comment, a reply, a creator profile and a danmaku profile are each one row. Empty runs are not charged a per-result fee.
Worked example: a 10-video search cost about $0.134 in our test: $0.13 in result fees plus about $0.004 for compute and storage.
Is it legal to scrape Bilibili? The actor reads public data only. You are responsible for using it in line with applicable law and Bilibili's terms.
Do I need a login or my own proxy? No. Private or deleted videos are skipped and named in the run status. Proxies are included.
Why is a creator's video list short? Bilibili blocks a plain listing of a creator's uploads. Creator videos search the creator's name and keep rows with that creator's id, newest first, so it is not a full archive.
What does Only new videos do? The first run returns the current rows and stores their ids under the state key. The next run with the same key returns only ids that were not stored.
Why did a date not apply? The status names a value it could not read, a date before 1970, or a start that is not earlier than the end. Those bounds are left off rather than guessed.
Can I schedule it or use the API? Yes, via schedules or the API.
maxResults counts videos or profiles; comment, danmaku and creator-profile rows come on top, as described above.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
modeenumOptionaldefault "search"Mode
What to collect in this run. Search, video details, and comments need no login.
searchQuerystringOptionalSearch query
Words to search. Chinese and English both work. Used in search mode.
videoUrlsarrayOptionalVideo URLs or BV ids
Video page URLs or BV ids. Used for video details and video comments. Example: https://www.bilibili.com/video/BV1iqpt6cEMU
userIdsarrayOptionalCreator ids
Numeric creator ids (mid) or space.bilibili.com links. Used for creator videos and creator profiles. A channel name is not an id.
maxResultsintegerOptionaldefault 10Maximum results
Hard cap on videos (or creator profiles in Creator profile mode) for the whole run. Comments, replies and danmaku rows are extra, up to the per-video caps. Creator videos also save one profile row per creator that has matching videos, on top of this cap. 10 to 20 is enough for a lookup.
Narrow a search or the popular board. Dates are UTC.
sortOrderenumOptionaldefault "totalrank"Sort order
How to sort search results.
durationFilterenumOptionaldefault "any"Duration
Search only. Any, under 10 minutes, 10 to 30, 30 to 60, or over 60.
pubtimeBeginstringOptionalPublished after
Search only. Leave empty for no start date. Use 2026-04-15, 2026/04/15, 20260415, or an ISO time. A time with no zone is UTC. A date that cannot be read is skipped and named in the run status.
pubtimeEndstringOptionalPublished before
Search only. A bare date is 00:00 UTC at the start of that day, so 2026-04-15 leaves out later videos on the 15th. Use 2026-04-15T23:59:59Z to include the day.
categoryenumOptionaldefault "all"Popular category
Popular mode only. All uses the trending feed. A category uses that zone's ranking board.
Comment rows are charged the same as videos. Replies count toward the per-video cap.
includeCommentsbooleanOptionaldefault falseAlso save comments
For each video, save comments as their own rows. This multiplies the row count. Off by default.
includeRepliesbooleanOptionaldefault falseInclude replies
Save replies under each comment. Each reply is its own row, with rootRpid and isThreadReply.
maxCommentsintegerOptionaldefault 20Comments per video
Cap for video comments mode, and for each video when Also save comments is on. Replies count toward this cap.
sortCommentsenumOptionaldefault "hot"Comment sort
Hot keeps Bilibili's hot order. Likes re-sorts that page by like count. Newest is chronological.
Brand names, danmaku profiles, sentiment, and a saved list of videos you have already seen.
autoLocalizebooleanOptionaldefault trueAlso search the Chinese brand name
When the query is a known Latin brand name, also search the Chinese name and merge the rows. The result cap still applies.
searchAliasesarrayOptionalExtra search words
More wordings to search and merge, such as 耐克 for Nike. Capped together with the main query.
includeDanmakubooleanOptionaldefault falseDanmaku profile per video
Add one danmaku row per video: how many were fetched, unique senders, per-minute rate, peak minute, and a text sample spread across the timeline. Off by default.
danmakuSampleSizeintegerOptionaldefault 25Danmaku texts in the sample
How many danmaku texts to keep, spread across the video. The sample stays inside the one danmaku row. 0 keeps the counts only.
sentimentAnalysisbooleanOptionaldefault falseSentiment
Add a sentiment object to each row. Chinese text uses a local lexicon. Other text uses a short English word list.
deltaModebooleanOptionaldefault falseOnly new videos
Search and popular only. Later runs with the same state key skip video ids this actor already returned.
deltaStateKeystringOptionaldefault "default"State key
Name for the saved video-id list, so two monitors do not share one list. Used when Only new videos is on.
followUpCommentsbooleanOptionaldefault falseRe-read comments on earlier videos
Search only, with Only new videos and Also save comments. The next run loads comments again for videos the previous run just found, and marks those rows isFollowUp.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies are used by default. Switch to residential if Bilibili blocks the datacenter pool. Proxy traffic is billed per GB.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| type | string | |
| bvid | string | |
| aid | integer | null | |
| title | string | null | |
| description | string | null | |
| url | string | null | |
| thumbnailUrl | string | null | |
| duration | integer | null | |
| durationFormatted | string | null | |
| viewCount | integer | null | |
| likeCount | integer | null | |
| coinCount | integer | null | |
| favoriteCount | integer | null | |
| shareCount | integer | null | |
| danmakuCount | integer | null | |
| replyCount | integer | null | |
| authorName | string | null | |
| authorMid | integer | null | |
| authorFace | string | null | |
| publishDate | string | null | |
| publishTimestamp | integer | null | |
| category | string | null | |
| tags | array | |
| text | string | null | |
| commentId | integer | null | |
| createdAt | string | null | |
| authorAvatar | string | null | |
| authorLevel | integer | null | |
| videoBvid | string | null | |
| rootRpid | integer | null | |
| isThreadReply | boolean | |
| name | string | null | |
| mid | integer | null | |
| followers | integer | null | |
| following | integer | null | |
| videoCount | integer | null | |
| totalLikes | integer | null | |
| level | integer | null | |
| isOfficial | boolean | |
| officialTitle | string | null | |
| sign | string | null | |
| profileUrl | string | null | |
| danmakuPerMinute | number | null | |
| danmakuPeakMinute | integer | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One video, comment, reply, creator profile, or danmaku profile. | $0.013 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/bilibili-scraper').call({
"mode": "search",
"searchQuery": "人工智能教程",
"videoUrls": [
"https://www.bilibili.com/video/BV1iqpt6cEMU"
],
"userIds": [
"546195",
"https://space.bilibili.com/546195"
],
"maxResults": 10,
"sortOrder": "totalrank",
"durationFilter": "any",
"pubtimeBegin": "2026-01-01",
"pubtimeEnd": "2026-04-15T23:59:59Z",
"category": "all",
"maxComments": 20,
"sortComments": "hot",
"danmakuSampleSize": 25,
"deltaStateKey": "default",
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/bilibili-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/bilibili-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Latest uploads from chosen Bilibili creators.
Search results with top comments and replies.
Current popular videos.
Comments on one video sorted by time.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.