# Bilibili Scraper in English (`sinolens/bilibili-scraper-english`) Actor

Scrape Bilibili videos by keyword, URL or the Popular list, with titles, descriptions and tags translated into English and optional AI summaries. Search in English. No login and no personal data.

- **URL**: https://apify.com/sinolens/bilibili-scraper-english.md
- **Developed by:** [SinoLens](https://apify.com/sinolens) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Scrape **Bilibili (B站 / 哔哩哔哩)**, one of China's largest video communities and especially popular with young people, **in English**. Search with English keywords, paste video links, or pull the trending list, and get every video's title, description, tags and category **translated into English**, plus views, likes, coins, favorites, shares, comments and danmaku counts. Optional AI summaries tell you what each video is about in one or two sentences, and optional **top comments in English** with a sentiment label show what Chinese viewers think.

Most Bilibili scrapers give you the original Chinese text only. This one puts English next to it, so you can use the data without a translator.

No Bilibili account, no cookies and **no personal data**: the Actor collects public data only and never records who commenters or viewers are.

### What can this Bilibili scraper do?

- 🔎 **Search Bilibili in English.** Type `electric car review` and the Actor searches for `电动汽车评测`, the way Chinese users would. Chinese keywords work too.
- 🌐 **English translation** of titles, descriptions, tags and categories, next to the original Chinese.
- 🧠 **AI summaries** (optional): a plain-English sentence or two per video.
- 💬 **Top comments in English** (optional): what viewers say under each video, translated, with a positive / neutral / negative label. No commenter names or IDs.
- 🔥 **Trending videos** from Bilibili's site-wide Popular list (热门).
- 🔗 **Video links or IDs**: bilibili.com/video/… URLs, b23.tv short links, BV IDs or av numbers.
- 📊 **Full statistics**: views, likes, coins, favorites, shares, comment count, danmaku (bullet comment) count, duration, publish time, original or repost.
- 🎛️ **Search filters**: sort by relevance, views, newest, danmaku or favorites; filter by video length and publish date.
- 💸 **You pay only for what you get**: per video, with translation and summaries as add-ons. Duplicates are skipped and never charged, and the run stops at your maximum cost.

### Who uses Bilibili data?

- **Brand and market research**: how Chinese audiences talk about your product, category or competitors.
- **Trend and content research**: what is popular in gaming, tech, anime, education or cars right now.
- **Investor and analyst research**: attention data on Chinese consumer brands and products.
- **AI pipelines**: clean English metadata ready for LLMs, RAG and dashboards.

### How to scrape Bilibili in English

1. Click **Try for free**.
2. Enter one or more **search queries** (English or Chinese), and/or **video links**, and/or turn on **Include trending videos**.
3. Choose how many videos you want and whether to add **AI summaries**.
4. Click **Start** and download the results as JSON, CSV, Excel or HTML, or get them through the [Apify API](https://docs.apify.com/api/v2).

### How much does it cost to scrape Bilibili?

This Actor uses pay-per-event pricing, so you only pay for results:

| Event | Price |
| --- | --- |
| Video saved (original data and statistics) | $0.005 |
| English translation (title, description, tags, category) | $0.004 per video |
| AI summary in English | $0.005 per video |
| Comment saved (only with **Add top comments in English**) | $0.002 per comment |
| Comment translation (English text and sentiment label) | $0.003 per comment |

For example, **100 videos with English translation cost $0.90**, and with AI summaries $1.40. Turn translation off and 100 videos cost $0.50. With comments, **20 videos with English translation and 20 translated comments each cost $2.18**: $0.18 for the videos and $2.00 for the 400 comments. Videos with fewer comments cost less, because you pay per comment saved. Duplicate videos are skipped and not charged. Set **Maximum cost per run** in the run options and the Actor stops exactly there, without translating anything it cannot charge for. Videos come first: if the budget runs out, earlier videos keep their comments and the run stops. The prices on the **Pricing** tab are the ones that apply.

### Input

```json
{
    "searchQueries": ["electric car review", "原神"],
    "maxResultsPerQuery": 50,
    "sortBy": "views",
    "publishedAfter": "2026-01-01",
    "translateToEnglish": true,
    "aiSummary": true
}
```

Other ways to start:

```json
{ "videoUrls": ["https://www.bilibili.com/video/BV1xx411c7mD", "https://b23.tv/AbCd123"] }
```

```json
{ "includeTrending": true, "maxTrendingResults": 100 }
```

| Field | What it does |
| --- | --- |
| `searchQueries` | Keywords in English or Chinese. English keywords are converted to Chinese for the search (free; turn off with `translateQueries`). |
| `videoUrls` | Video links, b23.tv short links, BV IDs or av numbers. |
| `includeTrending` | Also scrape the site-wide Popular list. |
| `maxResultsPerQuery` / `maxTrendingResults` | How many videos to save per query / from the Popular list. |
| `sortBy`, `durationFilter`, `publishedAfter`, `publishedBefore` | Search filters. Dates are UTC days. |
| `translateToEnglish` | English title, description, tags and category (charged per video). |
| `aiSummary` | English summary per video (charged per video). |
| `includeComments` | Add top comments to every video, translated into English with a sentiment label (charged per comment). Off by default. |
| `maxCommentsPerVideo` | Up to how many comments per video (1–100, default 20). Pinned comments count toward this number. |
| `commentSort` | `top` (Bilibili's ranking of the most liked and discussed comments, the default) or `newest`. |
| `includeDetails` | Fetch coins, shares, the original/repost flag and the full description for search results, and tags for trending and linked videos. On by default. |
| `deduplicate` | Save each video only once per run. On by default. |
| `proxyConfiguration` | Optional proxy, if Bilibili throttles requests. |

### Output

Each video is one row. You can switch between the **Overview**, **English text**, **Statistics** and **Comments (English)** views, or export everything.

```json
{
    "bvid": "BV1Ab4y1C7Xa",
    "aid": 1234567890,
    "url": "https://www.bilibili.com/video/BV1Ab4y1C7Xa",
    "title": "电动车冬季续航实测：两款车对比",
    "titleEn": "Winter range test of electric cars: two models compared",
    "description": "我们在零下20度的环境下测试了两台车的真实续航。",
    "descriptionEn": "We tested the real range of two cars at minus 20 degrees.",
    "tags": ["电动车", "汽车测评", "冬季续航"],
    "tagsEn": ["Electric vehicles", "Car reviews", "Winter range"],
    "category": "汽车",
    "categoryEn": "Cars",
    "summaryEn": "A side-by-side test of how far two electric cars really drive at -20°C.",
    "durationSeconds": 1122,
    "publishedAt": "2024-09-22T10:13:20Z",
    "thumbnailUrl": "https://i0.hdslb.com/bfs/archive/example.jpg",
    "isOriginal": true,
    "channelId": 12345678,
    "channelName": "示例汽车频道",
    "channelUrl": "https://space.bilibili.com/12345678",
    "views": 1534300,
    "likes": 98800,
    "coins": 45000,
    "favorites": 23111,
    "shares": 3100,
    "comments": 4125,
    "danmaku": 8230,
    "topComments": null,
    "source": "search",
    "searchQuery": "electric car review",
    "searchQueryZh": "电动汽车评测",
    "rank": 1,
    "scrapedAt": "2026-10-07T12:00:00Z"
}
```

`coins` are a Bilibili-specific signal: viewers spend a limited daily allowance of coins on videos they value, so it is a stronger endorsement than a like. `danmaku` are the comments that fly across the video.

Each run also stores a `RUN_SUMMARY` record in the key-value store: how many videos were saved, translated and summarized, how many comments were saved and translated, results per query, and any inputs that failed.

### Comments in English

Turn on **Add top comments in English** (`includeComments`) to see how Chinese audiences react to a product, a game or a topic without reading Chinese. Every video then gets a `topComments` list with up to `maxCommentsPerVideo` comments, in Bilibili's own "top" order or newest first (`commentSort`). A comment pinned to the top of the comment section, usually by the uploader, comes first and is marked `isPinned`.

Each comment is translated into English (`textEn`) and labeled with the commenter's attitude toward the video or its topic (`sentiment`: `positive`, `neutral` or `negative`). Bilibili slang is translated by its meaning (`666` means "awesome"), and emote codes such as `[doge]` are kept as they are.

```json
{
    "bvid": "BV1Ab4y1C7Xa",
    "titleEn": "Winter range test of electric cars: two models compared",
    "comments": 4125,
    "topComments": [
        {
            "commentId": 245678901234,
            "text": "这期测评太良心了，一键三连！[doge]",
            "textEn": "Such an honest review. Liked, coined and favorited! [doge]",
            "sentiment": "positive",
            "commentLikes": 1520,
            "commentReplies": 34,
            "postedAt": "2024-09-22T11:13:20Z",
            "isPinned": false,
            "isByUploader": false,
            "likedByUploader": true,
            "repliedByUploader": true,
            "commentRank": 2,
            "commentUrl": "https://www.bilibili.com/video/BV1Ab4y1C7Xa#reply245678901234"
        }
    ]
}
```

(The other video fields are left out here.)

| Field | What it is |
| --- | --- |
| `text`, `textEn` | The comment as written, and in English |
| `sentiment` | `positive`, `neutral` or `negative` |
| `commentLikes`, `commentReplies` | Likes and replies the comment got |
| `postedAt` | When it was posted (UTC, ISO 8601) |
| `isPinned`, `isByUploader` | Pinned to the top; written by the video's uploader |
| `likedByUploader`, `repliedByUploader` | The uploader liked it or replied to it |
| `commentRank`, `commentUrl` | Position in the list, and a link to the comment |

The **Comments (English)** view shows one row per comment next to the video's English title. Through the API, add `unwind=topComments` to the dataset items URL to get the same one-row-per-comment table as CSV or Excel; that is why comment counts and links are named `commentLikes`, `commentUrl` and so on, so they never mix with the video's own `likes` and `url`.

Good to know:

- **Privacy**: no commenter names, IDs, avatars or locations are collected, and @mentions of other users are replaced with `@user`. Only the comment text, its counts and whether the uploader wrote, liked or replied to it are saved.
- `topComments` is `null` when comments were not requested, and an empty list when a video has no comments, when Bilibili has closed its comments, or when they could not be loaded. `videosWithoutComments` in `RUN_SUMMARY` counts those videos.
- Runs with comments take longer: roughly one extra request to Bilibili per 20 comments, plus the translation.
- With **Translate to English** off, comments are saved in Chinese only (`textEn` and `sentiment` are `null`) and only the comment itself is charged.

### Bilibili API alternative

Bilibili has no official public API for this data. Run this Actor through the [Apify API](https://docs.apify.com/api/v2), the [Python](https://docs.apify.com/api/client/python) or [JavaScript](https://docs.apify.com/api/client/js) client, schedule it, or connect it to Make, Zapier, Google Sheets, Slack and more with Apify integrations.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("sinolens/bilibili-scraper-english").call(run_input={"searchQueries": ["electric car review"]})
for video in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(video["titleEn"], video["views"])
```

### FAQ

#### Is it legal to scrape Bilibili?

This Actor only reads publicly available data (videos and, if you ask for them, comments), does not log in, and does not collect personal data about commenters or viewers. Whether your specific use is allowed depends on your jurisdiction, Bilibili's terms of service and what you do with the data, so check with a lawyer if you are unsure. Read more in Apify's post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

#### How good are the translations?

Translations and summaries are made by a large language model and are written for analysts: names of creators, games and brands use their established English names or pinyin. They are accurate for metadata, but they are machine translations. The original Chinese is always included.

#### Why do some videos have no English text?

The translation model was busy or returned text that failed our checks (incomplete, or repeating itself). Those videos are still saved with the original Chinese, and you are not charged for their translation or summary. `RUN_SUMMARY` shows how many videos were translated. The same goes for comments: an untranslated comment keeps its Chinese text with `textEn` and `sentiment` set to `null`, and its translation is not charged.

#### What are AI summaries based on?

On the video's title, description, tags and category. They do not watch or listen to the video.

#### Can I get comments or user profiles?

Comments, yes: turn on **Add top comments in English** (see [Comments in English](#comments-in-english)). User profiles, no: by design the Actor does not collect personal data, so comments come without names, IDs, avatars or locations. Each video also includes its comment and danmaku counts.

#### Why did I get fewer videos than I asked for?

Bilibili returns at most about 1,000 results per search, some videos are deleted or private by the time they are opened, and duplicates are skipped. The run also stops when it reaches your maximum cost per run. The `RUN_SUMMARY` record tells you which applied.

#### The run is slow or gets throttled

Bilibili limits how fast a single client can make requests. Keep **Parallel requests** at 1 or 2, turn off **Fetch full statistics and tags** if you do not need coins and shares, or enable a proxy in **Proxy configuration**. If Bilibili blocks the detail requests during a run, the Actor stops asking for them and saves the remaining videos with the search data; `videosWithoutDetails` in `RUN_SUMMARY` shows how many. Comments work the same way: lower **Max comments per video** for faster runs, and if Bilibili blocks comment requests, the remaining videos are saved with an empty `topComments` list and no comment charges.

#### Can you add a feature?

Open an issue on the **Issues** tab. Requests for new fields or filters are welcome.

### Changelog

- **October 2026**: Optional top comments in English with a sentiment label (`includeComments`).
- **0.1**: First release: English search, video links, trending, English translation, AI summaries.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on Bilibili, in English or Chinese. English queries are converted into the Chinese keywords Bilibili users type (turn this off under "English output").

## `videoUrls` (type: `array`):

Bilibili video links (bilibili.com/video/…, b23.tv short links), BV IDs such as BV1xx411c7mD, or av numbers.

## `includeTrending` (type: `boolean`):

Also scrape Bilibili's site-wide Popular list (热门).

## `maxResultsPerQuery` (type: `integer`):

Bilibili returns at most about 1,000 results per query.

## `maxTrendingResults` (type: `integer`):

How many videos to take from the Popular list.

## `sortBy` (type: `string`):

Order in which Bilibili returns search results.

## `durationFilter` (type: `string`):

Only return search results of this length.

## `publishedAfter` (type: `string`):

Only search results published on or after this date (UTC).

## `publishedBefore` (type: `string`):

Only search results published on or before this date (UTC).

## `translateToEnglish` (type: `boolean`):

Add English title, description, tags and category to every video. Charged per translated video.

## `aiSummary` (type: `boolean`):

One or two English sentences on what each video is about, based on its title, description and tags (not on the audio). Charged per summarized video.

## `translateQueries` (type: `boolean`):

Free. Turn off to search with your exact keywords.

## `includeComments` (type: `boolean`):

Add top comments to every video, translated into English with a sentiment label. Charged per comment.

## `maxCommentsPerVideo` (type: `integer`):

Pinned comments count toward this number. About one extra request per 20 comments, so runs with comments take longer.

## `commentSort` (type: `string`):

Bilibili's own ranking of the most liked and discussed comments, or the newest ones.

## `includeDetails` (type: `boolean`):

Adds coins, shares, the original/repost flag and the full description to search results, and tags to trending and linked videos. About one extra request per video. If Bilibili blocks these requests, the run continues without them.

## `deduplicate` (type: `boolean`):

Save each video only once per run, even if several queries find it. You are not charged for skipped duplicates.

## `maxConcurrency` (type: `integer`):

Requests sent to Bilibili at the same time. Higher is faster but more likely to be throttled.

## `proxyConfiguration` (type: `object`):

Optional. Use a proxy if Bilibili throttles requests from Apify servers.

## Actor input object example

```json
{
  "searchQueries": [
    "electric car review"
  ],
  "videoUrls": [],
  "includeTrending": false,
  "maxResultsPerQuery": 10,
  "maxTrendingResults": 50,
  "sortBy": "relevance",
  "durationFilter": "any",
  "translateToEnglish": true,
  "aiSummary": false,
  "translateQueries": true,
  "includeComments": false,
  "maxCommentsPerVideo": 20,
  "commentSort": "top",
  "includeDetails": true,
  "deduplicate": true,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "electric car review"
    ],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sinolens/bilibili-scraper-english").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["electric car review"],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("sinolens/bilibili-scraper-english").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "electric car review"
  ],
  "maxResultsPerQuery": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call sinolens/bilibili-scraper-english --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sinolens/bilibili-scraper-english"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/H5HBvP3ZegGQlXldL/builds/2JnhDGbDisH4cgGrX/openapi.json
