# Bilibili Article Scraper - 专栏 Columns & Opus Articles (`hgservices/bilibili-columns-scraper`) Actor

Scrape Bilibili 专栏 articles by creator, keyword or URL, and opus posts by URL. Get title, author, date, tags, views, likes, comments, coins, full text and images. No login needed.

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

## Pricing

from $0.99 / 1,000 scraped articles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 articles**: the **专栏 (zhuānlán) columns** that creators publish next to their videos on [bilibili.com](https://www.bilibili.com). Get every article from a creator, search articles by **keyword**, or scrape single **article and opus URLs**. Each article includes the **title, author, publish date, category, tags, views, likes, comments, coins, favorites, shares, full text, HTML and image URLs**.

**No Bilibili account, login or API key is needed.** Download the data as JSON, CSV or Excel, run the Actor from the API on a schedule, or ask an AI assistant such as Claude or ChatGPT to get Bilibili articles for you.

### What does Bilibili Article Scraper do?

It collects Bilibili 专栏 articles in three ways. You can combine them in one run:

- **By creator:** give a creator's UID (mid) or profile URL and get all their articles, newest first.
- **By keyword:** give search words such as `人工智能`, `原神` or `genshin` and get the matching articles. Searches in Chinese, English, Japanese and Korean all work.
- **By URL:** give article links (`bilibili.com/read/cv…`, `bilibili.com/opus/…`, mobile links or `b23.tv` share links) and get those articles. Opus links also work for image and text posts (图文) that are not 专栏 articles.

For each article you get:

- **Article:** title, summary, article ID (cv), opus ID, URL, category and tags
- **Author:** creator UID (mid) and name
- **Engagement:** views, likes, comments, coins, favorites and shares
- **Content:** the full article text, clean HTML and all image URLs
- **Dates:** the publish time in China time (UTC+8) and the time of your run

For each creator you also get one **profile** row with the creator's name, avatar and bio.

Because it runs on the Apify platform, you also get API access, scheduling, integrations and run monitoring.

### Why scrape Bilibili articles?

Bilibili (哔哩哔哩, "B站") is one of China's biggest platforms for young audiences. Its 专栏 articles hold long-form reviews, guides, opinions and fan writing that you can't get from video data alone.

- **China market research:** find out what Chinese creators write about brands, products, games, tech and finance.
- **Brand and media monitoring:** track long-form posts by key opinion leaders (KOLs) and alert your team about new ones.
- **Gaming and anime communities:** collect game guides (攻略), patch reactions and fan discussion for titles such as Genshin Impact.
- **AI and NLP datasets:** build corpora of Chinese long-form text that are dated, attributed and include engagement numbers.
- **Journalism and archiving:** save articles with their numbers before they are edited or deleted.

### How to scrape Bilibili articles in Apify Console

1. Open the Actor and fill in at least one of **Creators**, **Article URLs** or **Search keywords**.
2. Set **Max articles per creator / keyword**. The default is 50, and `0` means no limit (Bilibili shows at most 1,000 search results per keyword).
3. Optional: turn off **Include full article content** for a fast run with metadata only.
4. Click **Start** and wait for the run to finish.
5. Open the **Output** tab to see the results, or export them as JSON, CSV, Excel, XML or HTML.

**How do I find a creator's UID?** Open the creator's page. The UID is the number in the address: `https://space.bilibili.com/244503977` → `244503977`. You can also paste the whole address from the website or the mobile site.

### Input

Configure the run on the **Input** tab, or send the input as JSON.

| Field | What it does | Example |
|-------|--------------|---------|
| **Creators** | Creator UIDs (mid) or profile URLs. Returns their articles, newest first | `["244503977"]` |
| **Article URLs** | Article links, opus links, `b23.tv` share links or cv IDs. Always includes the full content | `["https://www.bilibili.com/read/cv30946284"]` |
| **Search keywords** | Words to search Bilibili articles for | `["人工智能", "genshin"]` |
| **Max articles per creator / keyword** | Limit for each creator and each keyword. `0` = no limit (at most 1,000 results per keyword) | `50` |
| **Include full article content** | Full text, HTML, images, tags, coins and shares. Turn it off to get metadata only | `true` |

In JSON, the fields are `creators`, `articleUrls`, `searchQueries`, `maxArticles` and `includeArticleContent`. You do not need to set up a proxy.

#### Example: all articles of one creator

```json
{
  "creators": ["244503977"],
  "maxArticles": 0
}
```

#### Example: 100 articles about AI, metadata only

```json
{
  "searchQueries": ["人工智能"],
  "maxArticles": 100,
  "includeArticleContent": false
}
```

#### Example: specific articles

```json
{
  "articleUrls": [
    "https://www.bilibili.com/read/cv30946284",
    "https://www.bilibili.com/opus/894866361836109878"
  ]
}
```

### Output

You get one row per article, plus one `profile` row per creator. Here is an article row (text and image list shortened):

```json
{
  "type": "article",
  "authorMid": "286431045",
  "authorName": "UnPlusJiNg",
  "articleId": "30946284",
  "opusId": "894866361836109878",
  "url": "https://www.bilibili.com/read/cv30946284",
  "title": "⩑〘2024.02.06〙「第三期」动漫 赛博 科技 AI 精美壁纸 4K电脑壁纸 4K手机壁纸",
  "summary": null,
  "publishedAt": "2024-02-06T11:38:31+08:00",
  "category": null,
  "tags": ["动漫", "科技", "人工智能", "AI", "动漫壁纸", "4K壁纸"],
  "stats": { "view": 4977, "like": 30, "comment": 5, "coin": 4, "favorite": 36, "forward": 0 },
  "wordCount": null,
  "contentText": "专栏：⩑〘2024.02.06〙「第三期」动漫 赛博 科技 AI 壁纸专栏\n专栏60张壁纸 云盘60张壁纸\n…",
  "contentHtml": "<p>专栏：⩑〘2024.02.06〙「第三期」动漫 赛博 科技 AI 壁纸专栏</p><p>专栏60张壁纸 云盘60张壁纸</p>…",
  "contentLength": 291,
  "imageUrls": ["https://i0.hdslb.com/bfs/article/c7e39b9fed39c7d186bc8e5e29f2aa7b286431045.jpg", "…"],
  "discoveredVia": "url",
  "searchQuery": null,
  "scrapedAt": "2026-10-05T12:41:13+00:00"
}
```

Here is a profile row:

```json
{
  "type": "profile",
  "authorMid": "244503977",
  "authorName": "桑葚青梅茶",
  "authorAvatar": "https://i2.hdslb.com/bfs/face/e22769fd9e1fc4de67ef45d37d99bf615bd6ae20.jpg",
  "authorSign": "人要有盼头、才会健康",
  "spaceUrl": "https://space.bilibili.com/244503977",
  "scrapedAt": "2026-10-05T12:42:21+00:00"
}
```

The **Output** tab has four views: **Overview**, **Articles** (text, tags and images), **Engagement** (all the numbers in columns) and **Creators**. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
|-------|-------------|
| `type` | `article` or `profile` |
| `authorMid` / `authorName` | Creator UID and display name |
| `articleId` / `opusId` | Bilibili cv article ID and opus ID |
| `url` | Link to the article |
| `title` / `summary` | Article title and short summary (articles found by creator or keyword) |
| `publishedAt` | Publish time, ISO 8601, China time (UTC+8) |
| `category` / `tags` | Article category (articles found by creator or keyword) and tags |
| `stats` | `view`, `like`, `comment`, `coin`, `favorite`, `forward` (shares) |
| `wordCount` | Word count (articles found by creator) |
| `contentText` / `contentHtml` | Full text and clean HTML of the article |
| `contentLength` | Length of the text in characters. `0` for image-only articles |
| `imageUrls` | Image URLs in the article |
| `discoveredVia` / `searchQuery` | How the article was found (`creator`, `search` or `url`) and the keyword |
| `authorAvatar` / `authorSign` / `spaceUrl` | Profile rows only: avatar, bio and profile URL |
| `scrapedAt` | When your run collected the row (UTC) |

### How to use Bilibili Article Scraper

#### In Apify Console

1. Open the Actor, fill in the **Input** tab and click **Start**.
2. Watch the run's progress in the log, then open the **Output** tab.
3. Click **Save as a new task** to run the same setup again with one click. On the task, add a **Schedule** to check your creators or keywords every day or week.

#### With the Apify API (HTTP)

Run the Actor and get its results in one request. Replace `YOUR_API_TOKEN` with your token from **Settings → API & Integrations** in Apify Console.

```bash
curl -X POST "https://api.apify.com/v2/acts/hgservices~bilibili-columns-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"creators": ["244503977"], "maxArticles": 20}'
```

Add `&format=csv` or `&format=xlsx` to the URL to get CSV or Excel instead of JSON. For long runs, start the run with `POST /v2/acts/hgservices~bilibili-columns-scraper/runs`, and then read the items of the run's default dataset when it finishes.

#### With the JavaScript client

Install the client with `npm install apify-client`, then run:

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('hgservices/bilibili-columns-scraper').call({
    searchQueries: ['人工智能'],
    maxArticles: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items.filter((i) => i.type === 'article')) {
    console.log(item.publishedAt, item.title, item.stats.view, item.url);
}
```

#### With the Python client

Install the client with `pip install apify-client` (version 3.0 or later), then run:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("hgservices/bilibili-columns-scraper").call(
    run_input={"creators": ["244503977"], "maxArticles": 20}
)
if run is None:
    raise RuntimeError("The run was not found.")

for item in client.dataset(run.default_dataset_id).iterate_items():
    if item["type"] == "article":
        print(item["publishedAt"], item["title"], item["url"])
```

#### With Claude, ChatGPT and other AI assistants (MCP)

Connect your AI assistant to the **Apify MCP server**. The assistant can then run this Actor for you and answer from the results. To give the assistant this Actor as a tool, use this server URL:

```
https://mcp.apify.com?tools=hgservices/bilibili-columns-scraper
```

- **Claude (claude.ai or Claude Desktop):** open **Settings → Connectors**, click **Add custom connector** and paste the URL.
- **Claude Code:** run `claude mcp add --transport http apify "https://mcp.apify.com?tools=hgservices/bilibili-columns-scraper"`.
- **Apify CLI:** run `apify mcp install claude-code --tools hgservices/bilibili-columns-scraper` (also works for `cursor`, `vscode` and `codex`).
- **ChatGPT:** in **Settings → Apps & Connectors**, turn on developer mode, create a connector and paste the URL.
- **Cursor, VS Code and other MCP clients:** add the URL as a remote (HTTP) MCP server.

Sign in with your Apify account when asked. Then ask in plain language, for example:

- *"Get the 20 newest Bilibili articles of creator 244503977 and summarize them in English."*
- *"Find Bilibili 专栏 articles about 人工智能 and list the 10 with the most likes."*
- *"Get the full text of https://www.bilibili.com/read/cv30946284 and translate it into English."*

#### With integrations

Send the results to **Google Sheets, Slack, email, Zapier, Make, n8n, Airbyte** or any **webhook** from the Actor's **Integrations** tab. For example, run every morning for a list of creators and post new articles to a Slack channel.

### Tips for faster runs

- **Start with metadata only.** Turn off *Include full article content*. The run is about 10 times faster and shows what a creator or keyword returns. Then run again with content for the articles you need. Metadata-only rows have no tags, coins or shares.
- **Use the limit.** *Max articles per creator / keyword* stops each creator and keyword early. Results are newest first for creators.
- **Monitor creators on a schedule.** Run a saved task daily or weekly and remove duplicates by `articleId` in your own system. In one run, an article that matches more than one creator, keyword or URL appears only once.
- **Give large runs more time.** With full content, the Actor collects about 30 articles per minute. A creator with 2,000 articles needs more than 1 hour. Before you start, increase **Timeout** in the run options. If a run stops at the timeout, the articles that it collected stay in the dataset.
- **Keep the default memory.** More memory does not make the run faster, because the speed depends on Bilibili. It only makes the run cost more.
- **Blocked requests.** Bilibili sometimes blocks requests. The Actor then tries again automatically. If a run reports that Bilibili blocked it, run it again later.
- **Interrupted runs continue.** If the platform restarts a run, the run continues where it stopped. Articles that are already in the dataset are not scraped again.

### FAQ, disclaimers and support

**Do I need a Bilibili account?**
No. The Actor reads only public articles. You don't need a login, cookie or API key.

**Why do some fields have `null`?**
Bilibili doesn't show every field in every place. The `summary` and `category` fields are filled for articles found by creator or keyword, and `wordCount` for articles found by creator. Image-only articles have an empty `contentText` and a `contentLength` of `0`.

If you turn off *Include full article content*, the rows have no `tags`, and `coin` and `forward` are `null`. Articles found by keyword also have `favorite` set to `null`. Turn the content on to get these fields.

**Why do some emoji show as `?`?**
Bilibili's article list and search replace emoji with `?`. With *Include full article content* on, the Actor gets the correct title from the article itself. The `summary` field comes only from the list and search, so its emoji can stay `?`.

**Why did my keyword return unrelated articles?**
The results come from Bilibili's own article search, which also matches parts of your keyword. Use more specific keywords for more precise results.

**Can it scrape Bilibili videos, comments or danmaku?**
No. This Actor scrapes articles (专栏, plus opus posts given by URL) only. Use a Bilibili video or comments scraper for other data.

**Can it scrape private, deleted or paid articles?**
No. If you give the link of such an article, the Actor skips it. If a creator's list or a search still shows a deleted article, you get a row with its title and numbers, but with no content. The log tells you which articles had no content.

With *Include full article content* on, you don't pay for a row without content. This also applies when Bilibili blocks the content of an article.

**Is it legal to scrape Bilibili?**
The Actor collects only data that is publicly available. You are responsible for using the data in line with Bilibili's terms of service, copyright law and data protection laws such as the GDPR and China's PIPL. Don't republish authors' articles without permission.

**I found a problem or need a feature.**
Open an issue on the **Issues** tab, and we will look into it. Custom solutions for Bilibili and other Chinese websites are available on request.

# Actor input Schema

## `creators` (type: `array`):

Bilibili creator UIDs (mid) or profile URLs, one per line. Accepts `244503977`, `https://space.bilibili.com/244503977` or `https://m.bilibili.com/space/244503977`. The Actor gets the creator's articles, newest first.

## `articleUrls` (type: `array`):

Bilibili article links, one per line. Accepts `https://www.bilibili.com/read/cv30946284`, opus links (`https://www.bilibili.com/opus/…`), mobile links, b23.tv share links, or bare cv IDs (`30946284`). Articles given by URL always include the full content.

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

Keywords to search Bilibili articles for, one per line, for example `人工智能` or `genshin`. Chinese, English, Japanese and Korean keywords work.

## `maxArticles` (type: `integer`):

Cap the number of articles scraped per creator and per search keyword (newest first for creators). Defaults to 50 to keep a first run small and fast. Set to 0 for no limit. Bilibili shows at most 1,000 search results per keyword.

## `includeArticleContent` (type: `boolean`):

Include each article's full text, HTML and image URLs. Turn off for a metadata-only run, which is much faster. A metadata-only run has the title, summary, author, date, category, views, likes and comments, but no tags, coins or shares. Favorites are included only for articles found by creator.

## Actor input object example

```json
{
  "creators": [
    "244503977"
  ],
  "maxArticles": 50,
  "includeArticleContent": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Creator profiles and articles with their key fields.

## `articles` (type: `string`):

Article text, tags and images.

## `engagement` (type: `string`):

Views, likes, comments, coins, favorites and shares.

## `profiles` (type: `string`):

One row per creator.

# 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 = {
    "creators": [
        "244503977"
    ],
    "maxArticles": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/bilibili-columns-scraper").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 = {
    "creators": ["244503977"],
    "maxArticles": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("hgservices/bilibili-columns-scraper").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 '{
  "creators": [
    "244503977"
  ],
  "maxArticles": 50
}' |
apify call hgservices/bilibili-columns-scraper --silent --output-dataset

```

## MCP server setup

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

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/ypvET89PPcDcMb9Fi/builds/2VbDvbSJV1BqMaypo/openapi.json
