# Zhihu Scraper 知乎 \[Only $3] Answers, Comments, Search 回答 评论 搜索 (`memo23/zhihu-scraper`) Actor

\[Only $3 per 1000 rows] Zhihu (知乎) scraper, no login: 搜索 search sorted by newest or most upvoted with date and type filters, search suggestions, questions with 回答 answers and 评论 comments, user profiles, 热榜 hot list, columns and articles.

- **URL**: https://apify.com/memo23/zhihu-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, Automation
- **Features:** Limited permissions
- **Stats:** 33 total users, 8 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 rows

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

## Zhihu Scraper: Questions, Answers, Search, Columns & Articles

**Question threads with answers and comments, keyword search, people, the hot list, and public columns and articles, as JSON or CSV. No Zhihu login.**

Zhihu shows questions, answers and search only to logged-in visitors. This actor returns them without a login or a cookie, alongside the public column and article pages it has always read.

$3 per 1,000 rows, plus a $0.005 start fee.

***

### Why Use This Scraper?

- **No login.** Questions, answers, comments, search and profiles come back without a cookie.
- **Whole threads.** A question returns its detail and its answers, 20 a page, each with upvotes, comments and the author; comments and replies on request.
- **Four searches.** Content (answers, articles, questions), people, topics and columns.
- **Search filters like on Zhihu itself.** Sort by newest (最新发布) or most upvoted (最多赞同), keep to the last day, week, month, 3 or 6 months or year, and pick answers, articles or videos only.
- **Search suggestions.** Zhihu's own suggestions for each keyword, for keyword research.
- **People.** A profile with follower and post counts, plus that person's answers, articles, pins, followers or following.
- **Hot list.** The 30 questions on 热榜 with their heat.
- **Columns and articles with the HTML body.** A column list carries the longer HTML of each article.
- **One price.** Every row costs the same, and `maxItems` caps the whole run.

***

### Overview

Rows are told apart by `type`: `question`, `answer`, `comment`, `reply`, `user`, `topic`, `column`, `pin`, `hot-question`, and the article rows the actor has always returned.

A column URL such as `https://zhuanlan.zhihu.com/xuehy` pages through that column's public item list. An article URL such as `https://zhuanlan.zhihu.com/p/2084570146228664180` fetches that article on its own; that path also returns topics, with a shorter HTML body than the same article inside a column list.

***

### Supported Inputs

| Input | What you get |
|---|---|
| `https://zhuanlan.zhihu.com/{slug}` | Every article in that column, up to `maxItems` |
| `https://www.zhihu.com/column/{slug}` | Same column list |
| Column slug, e.g. `xuehy` | Same column list |
| `https://zhuanlan.zhihu.com/p/{id}` | One article |
| Numeric article id | One article |

Copy-paste column run:

```json
{
    "startUrls": ["https://zhuanlan.zhihu.com/xuehy"],
    "maxItems": 20
}
```

Question, answer and profile links work in `startUrls` too:

| Input | What you get |
|---|---|
| `https://www.zhihu.com/question/{id}` | The question and its answers |
| `https://www.zhihu.com/question/{id}/answer/{id}` | One answer |
| `https://www.zhihu.com/people/{token}` | The profile, plus the lists chosen in `userContent` |
| Keywords in `searchKeywords`, `peopleKeywords`, `topicKeywords`, `columnKeywords` | Search results, 20 a page |

Question thread with comments:

```json
{
    "questionUrls": ["https://www.zhihu.com/question/19550225"],
    "maxAnswersPerQuestion": 40,
    "includeComments": true,
    "maxItems": 500
}
```

Not supported: `https://www.zhihu.com/search?q=...` links. Put the keyword in `searchKeywords` instead.

***

### Use Cases

| Who | What they do with the rows |
|---|---|
| Research | Read a columnist's public essays without clicking through each post |
| Media monitoring | Track a named column for new titles, votes and comment counts |
| Market notes | Pull Chinese-language commentary on a topic a column already covers |
| Archives | Save the public HTML of articles you can already open in a browser |
| Agents | Hand a column URL to an Apify call and read a flat article list |

***

### How It Works

![How the Zhihu scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-zhihu.png)

1. You pass column URLs, article URLs, slugs or numeric ids.
2. Each value is classified: column, article, question, answer or profile.
3. A column is read from Zhihu's public column-items API, page by page, until `maxItems` or the last page.
4. An article id that did not already come from a column is fetched from the public article API.
5. Questions, answers, comments, search, people and the hot list are read from a data source that needs no login.
6. Each result is pushed as one dataset row. On Apify, that row is the billed result.

Pure HTTP. No browser.

***

### Input Configuration

| Field | Type | Required | Notes |
|---|---|---|---|
| `startUrls` | string\[] | no | Column and article URLs. Prefill: `https://zhuanlan.zhihu.com/xuehy`. If every list is empty, that column is used. |
| `columnIds` | string\[] | no | Slugs such as `xuehy`. |
| `articleIds` | string\[] | no | Numeric ids such as `2084570146228664180`. |
| `questionUrls` | string\[] | no | Question links or ids. Each returns the question and its answers. |
| `maxAnswersPerQuestion` / `answerOrder` | integer / string | no | Default `20`; `default` ranking or `updated` (newest first). |
| `answerUrls` | string\[] | no | Single answers by link or id. They carry text and author; vote counts come with question threads and search. |
| `includeComments` / `maxCommentsPerAnswer` | boolean / integer | no | Comment rows for every answer in the run. Default 20 per answer. |
| `includeReplies` | boolean | no | Reply rows under each comment, up to 20 per comment. |
| `searchKeywords` | string\[] | no | Content search: answers, articles and questions. |
| `peopleKeywords` / `topicKeywords` / `columnKeywords` | string\[] | no | People, topic and column search. |
| `searchSort` | `relevance` | `upvoted` | `newest` | no | Order of content search results. Default `relevance`. |
| `searchTimeRange` | `all` | `day` | `week` | `month` | `three_months` | `half_year` | `year` | no | Publishing window for content search. |
| `searchContentType` | `all` | `answer` | `article` | `video` | no | Content search: only this type. |
| `includeSearchSuggestions` | boolean | no | One `search-suggestion` row per Zhihu suggestion for each `searchKeywords` entry. |
| `maxResultsPerKeyword` | integer | no | Default `20`. |
| `users` | string\[] | no | Profile links or url tokens. |
| `userContent` / `maxItemsPerUser` | string\[] / integer | no | `answers`, `articles`, `pins`, `followers`, `following`; default 20 rows per list. |
| `includeHotList` | boolean | no | The 30 questions on the hot list. |
| `maxItems` | integer | no | Default `20`. Cap on all rows of the run. Free plans cap at 100. |
| `maxConcurrency` | integer | no | Default `5`. Range 1–20. Applies to article-detail calls. Column pages stay sequential. |

#### Column, 5 articles

```json
{
    "startUrls": ["https://zhuanlan.zhihu.com/xuehy"],
    "maxItems": 5
}
```

#### One article

```json
{
    "articleIds": ["2084570146228664180"],
    "maxItems": 1
}
```

#### Column plus one extra article

```json
{
    "startUrls": ["https://zhuanlan.zhihu.com/xuehy"],
    "articleIds": ["2082752758818649391"],
    "maxItems": 10
}
```

The column list is collected first. An article id already present in that list is not fetched a second time.

***

### Output Overview

Rows are told apart by `type`. Article rows from columns and article links are as before: there is no separate column row and no padding row, and the column name is the slug on each article (`columnSlug`).

An `answer` row has `answerId`, `url`, `questionId`, `questionTitle`, `text`, `html`, `upvotes`, `comments`, `favorites`, `createdAt` and the author. A `question` row has `title`, `detail`, `answerCount`, `followerCount`, `viewCount`. A `comment` or `reply` row has `text`, `likes`, `replyCount`, `ipLocation`, `parentCommentId`. A `user` row has `urlToken`, `name`, `headline`, `followers`, `answers`, `articles`, `ipLocation`. A `hot-question` row adds `rank`, `heat` and `heatValue`.

`source` is `column` when the row came from a column list, and `article` when it came from the article endpoint. Column rows carry the longer HTML. Article rows add `topics` when Zhihu sends them. `contentTruncated` follows Zhihu's own guest flag.

***

### Output Samples

Column list, `https://zhuanlan.zhihu.com/xuehy`, first article. HTML below is cut for the README. The live row's `content` was 3,015 characters.

```json
{
    "entityType": "article",
    "articleId": "2084570146228664180",
    "title": "复利没那么温柔：为什么十年十倍的故事，你复制不了？",
    "excerpt": "“复利”几乎是所有长期投资叙事中最有吸引力的词。…",
    "content": "<p>“复利”几乎是所有长期投资叙事中最有吸引力的词。</p>",
    "contentTruncated": true,
    "voteupCount": 2,
    "commentCount": 1,
    "authorName": "薛洪言",
    "authorHeadline": "星图金融研究院常务副院长、硕士生导师",
    "authorId": "4d4d42d4d525a7f8f2c74925fb5f8db7",
    "authorUrl": "https://www.zhihu.com/people/xuehongyan",
    "columnSlug": "xuehy",
    "imageUrl": "https://picx.zhimg.com/v2-9349de0aae106773e9470667658217a3_720w.jpg",
    "url": "https://zhuanlan.zhihu.com/p/2084570146228664180",
    "createdAt": "2026-09-19T01:18:22.000Z",
    "updatedAt": "2026-09-19T01:18:22.000Z",
    "topics": [],
    "source": "column"
}
```

The same id fetched as an article (not via the column list) returned `content` of 769 characters, `excerpt` of 128 characters, and topics `A股（人民币普通股票）` and `股票交易策略`. Author, votes and comment count matched.

***

### Key Output Fields

**Identity**

- `articleId`, `url`, `entityType` (`article`), `source` (`column` or `article`)
- `columnSlug` when the article belongs to a column

**Text**

- `title`, `excerpt`, `content` (HTML)
- `contentTruncated` — Zhihu's guest flag. A `true` value can still sit on a multi-thousand-character column body.

**Author**

- `authorName`, `authorHeadline`, `authorId`, `authorUrl`

**Engagement**

- `voteupCount`, `commentCount`
- `topics` — filled on article-detail rows when Zhihu sends them. Column-list rows in the sample above had an empty list.

**Media and time**

- `imageUrl`
- `createdAt`, `updatedAt` — ISO timestamps

***

### FAQ

**Does it search Zhihu?**
Yes. Put keywords in `searchKeywords` (content), `peopleKeywords`, `topicKeywords` or `columnKeywords`. Questions, answers and comments are returned too, all without a login.

**Why do answers given by link have no vote counts?**
Zhihu's single-answer response carries the text and the author only. Read the question thread, or search, to get upvotes, comments and favorites.

**What does a column run actually request?**
`GET https://www.zhihu.com/api/v4/columns/{slug}/items?limit=10&offset=0`, then the next offset, until `maxItems` or Zhihu says the list is finished. Ten articles per page. Pages run one after another.

**What does an article run request?**
`GET https://www.zhihu.com/api/v4/articles/{id}` with the public fields `content`, `excerpt`, `voteup_count`, `comment_count`, `author`, `topics` and `column`. The request is signed as a guest. No `d_c0` cookie is sent. Sending that cookie is what flips Zhihu into its click-challenge, so the actor leaves it off.

**Can I mix a column and an article id?**
Yes. The column is walked first. If that article id already appeared in the column, it is not fetched again.

**What if the slug or id is wrong?**
A failed column page or article is logged and counted as a failure. The rest of the run continues. A bad id does not produce a billed row, because a row is only pushed after a title comes back.

**Is there a free-plan cap?**
On Apify, accounts that are not on a paid plan are limited to 100 articles per run. The Store's automated tester is limited to 1.

**How many retries?**
Each URL is tried up to 4 times, with a new proxy address each time. A login wall (`40353`) or an abnormal-request block (`40362`) stops that URL immediately. Those are not transient proxy errors.

**Why is the article HTML shorter than the column HTML?**
They are different Zhihu endpoints. For article `2084570146228664180` the column list returned 3,015 characters and the article endpoint returned 769. Use a column URL when you want the longer public HTML.

**What does `contentTruncated: true` mean?**
Zhihu sets that flag on guest responses. It does not mean the field is empty. Paid 盐选 bodies that Zhihu does not show to guests stay on the excerpt.

**Will a question id work if I paste the number?**
A long numeric id is treated as an article id. Question URLs are rejected before any request.

**How much does a run cost?**
$0.005 when the run starts, then $0.003 for each article row. Five articles cost about $0.02.

***

### Support

- Bugs and field requests: the actor's **Issues** tab at [memo23/zhihu-scraper](https://apify.com/memo23/zhihu-scraper).
- More actors from the same developer: [apify.com/memo23](https://apify.com/memo23).

***

### Additional Services

Need a scheduled column feed, a different field set, or a push into a sheet or warehouse? Custom work is available through the Issues tab.

***

### Explore More Scrapers

Same developer, same pay-per-result model:

- [Quora Scraper](https://apify.com/memo23/quora-scraper) — public Quora questions and answers
- [Douyin Scraper](https://apify.com/memo23/douyin-scraper) — public Douyin posts
- The rest of the catalogue is on the [memo23 Store page](https://apify.com/memo23)

***

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (`memo23/zhihu-scraper`).

**Purpose:** Zhihu questions, answers, comments, search, people, hot list, and public column articles. No login.

**Minimal input:**

```json
{ "startUrls": ["https://zhuanlan.zhihu.com/xuehy"], "maxItems": 5 }
```

**Output fields:** entityType, articleId, title, excerpt, content, contentTruncated, voteupCount, commentCount, authorName, authorHeadline, authorId, authorUrl, columnSlug, imageUrl, url, createdAt, updatedAt, topics, source.

**Other inputs:** `questionUrls`, `answerUrls`, `searchKeywords`, `peopleKeywords`, `topicKeywords`, `columnKeywords`, `users` (+ `userContent`), `includeComments`, `includeReplies`, `includeHotList`. Rows carry `type`: question, answer, comment, reply, user, topic, column, pin, hot-question, search-suggestion. Content search takes `searchSort`, `searchTimeRange`, `searchContentType`.

**Billing:** $0.005 actor start + $0.003 per dataset row of any type.

**Behavior:** Column rows have the longer HTML and often empty `topics`. Article-detail rows are shorter and may include topics. `contentTruncated` can be true on a full-looking column body. `maxItems` caps all rows together, comments included.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Zhihu Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Zhihu column and article pages. It does not log in, and it does not collect search results, questions, answers, or content Zhihu only shows to a signed-in member. Users are responsible for ensuring their use complies with Zhihu's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

Zhihu scraper, scrape Zhihu, 知乎 scraper, Zhihu question scraper, Zhihu answers scraper, Zhihu comments, Zhihu search scraper, Zhihu hot list 热榜, Zhihu user scraper, Zhihu no login, Apify Zhihu, zhuanlan articles, zhuanlan.zhihu.com scraper, column article export, Chinese essay archive, author monitoring, public HTML export, media monitoring, China commentary data, guest article body, column feed, article JSON, upvote export, research export, column archive, comment count export

# Actor input Schema

## `startUrls` (type: `array`):

Zhihu URLs to collect. Column: https://zhuanlan.zhihu.com/xuehy or https://www.zhihu.com/column/xuehy. Article: https://zhuanlan.zhihu.com/p/2084570146228664180. Question, answer and profile links work too and are read like the fields below. If every field is empty the run reads the xuehy column.

## `columnIds` (type: `array`):

Column slugs without the URL, same result as a column URL. Example: xuehy. Letters, numbers, underscore and hyphen only. Leave empty if you already passed URLs in startUrls.

## `articleIds` (type: `array`):

Numeric article ids, the number after /p/ in an article URL. Example: 2084570146228664180. Each id becomes one dataset row from the article endpoint. Leave empty if you already passed article URLs.

## `questionUrls` (type: `array`):

Zhihu question links (https://www.zhihu.com/question/19550225) or question ids. Each returns the question (title, detail, views, followers, answer count) and its answers. No login needed.

## `maxAnswersPerQuestion` (type: `integer`):

Answers to return for each question. A page holds 20. 0 returns the question only.

## `answerOrder` (type: `string`):

Zhihu's default ranking, or newest first.

## `answerUrls` (type: `array`):

Single answers by link (https://www.zhihu.com/question/19550225/answer/1991579825958303223) or answer id.

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

Return the comments of every answer in the run as separate rows: text, likes, reply count, IP location.

## `maxCommentsPerAnswer` (type: `integer`):

Top-level comments to return per answer. A page holds 10.

## `includeReplies` (type: `boolean`):

Also return the replies under each comment, linked by parentCommentId.

## `searchKeywords` (type: `array`):

Search Zhihu by keyword. Returns answers, articles and questions matching it, with upvotes, comments and the author.

## `searchSort` (type: `string`):

Order of Search keywords results: Zhihu's relevance, most upvoted first, or newest first.

## `searchTimeRange` (type: `string`):

Keep Search keywords results to this publishing window.

## `searchContentType` (type: `string`):

Only answers, only articles, or only videos in Search keywords results.

## `includeSearchSuggestions` (type: `boolean`):

Also return Zhihu's search suggestions for each Search keyword (the dropdown under the search box), one row per suggestion. Useful for keyword research.

## `peopleKeywords` (type: `array`):

Find Zhihu users by keyword: name, headline, followers, answer and article counts.

## `topicKeywords` (type: `array`):

Find topics by keyword, with follower and question counts.

## `columnKeywords` (type: `array`):

Find columns by keyword. Use the returned column ids in 'Column slugs' to read their articles.

## `maxResultsPerKeyword` (type: `integer`):

Rows to return for each keyword.

## `users` (type: `array`):

Zhihu profile links (https://www.zhihu.com/people/zhang-jia-wei) or url tokens. Each returns the profile: followers, answer and article counts, headline, IP location.

## `userContent` (type: `array`):

Lists to return for each profile, newest first.

## `maxItemsPerUser` (type: `integer`):

Rows to return from each chosen list of a person. A page holds 20.

## `includeHotList` (type: `boolean`):

Return Zhihu's current hot list: 30 questions with heat, answer count and excerpt.

## `maxItems` (type: `integer`):

Stop after this many rows in total (articles, questions, answers, comments, people and so on). Default: 20. Free plans are capped at 100. Set this before a large run.

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

How many article-detail requests run at once. Example: 5. Default: 5. Minimum: 1. Maximum: 20. Column pages are fetched one after another.

## Actor input object example

```json
{
  "startUrls": [
    "https://zhuanlan.zhihu.com/xuehy"
  ],
  "maxAnswersPerQuestion": 20,
  "answerOrder": "default",
  "includeComments": false,
  "maxCommentsPerAnswer": 20,
  "includeReplies": false,
  "searchSort": "relevance",
  "searchTimeRange": "all",
  "searchContentType": "all",
  "includeSearchSuggestions": false,
  "maxResultsPerKeyword": 20,
  "maxItemsPerUser": 20,
  "includeHotList": false,
  "maxItems": 20,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        "https://zhuanlan.zhihu.com/xuehy"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/zhihu-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 = { "startUrls": ["https://zhuanlan.zhihu.com/xuehy"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/zhihu-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 '{
  "startUrls": [
    "https://zhuanlan.zhihu.com/xuehy"
  ]
}' |
apify call memo23/zhihu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/zhihu-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/3N6Zpz9h3tV3yGZSD/builds/eJyl60AiJ6DBTOmRg/openapi.json
