# Zongheng (纵横中文网) Web Novel Scraper (`crawlerbros/zongheng-scraper`) Actor

Scrape zongheng.com - one of China's largest web-novel platforms. Search novels by keyword, browse categories, fetch ranking lists, or load a book page for metadata and chapters. Returns title, author, category, serialization status, word count, description, cover, and latest chapter info.

- **URL**: https://apify.com/crawlerbros/zongheng-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Zongheng (纵横中文网) Web Novel Scraper

Scrapes [zongheng.com](https://www.zongheng.com) — one of China's largest
web-novel platforms — for books, categories, rankings and book metadata.

### Data Source

- Search: `search.zongheng.com/search/book?keyword=...` — clean JSON API
- Category / ranking / detail pages: server-rendered pages with an embedded
  `window.__NUXT__` state blob, decoded by a built-in tokenizer (no browser needed)

No login or API key required.

### Modes

| Mode | Inputs | Source |
|---|---|---|
| `search` (default) | `searchQuery` | keyword JSON API, paginated |
| `byCategory` | `categoryId` (8101 玄幻奇幻 … -100 其他) | `/categories?cateFineId=` curated lists — all 13 pre-rendered sections (click/new-book/hot-sales/recommended/classics/premium/trial-read/banners etc.) |
| `ranking` | `rankType` (monthTicket/popular/newBook/newOrder/click/recommend) | `/rank?nav=default` — all six lists are pre-rendered in the SSR blob |
| `byBookUrl` | `bookUrls` | `/detail/{id}` metadata + first/latest chapter info |

### Output fields

`book` records: `bookId`, `title`, `author`, `authorId`, `category`,
`subCategory`, `categoryId`, `subCategoryId`, `status` (`serialized` /
`completed`), `wordCount`, `description`, `keywords`, `coverUrl`
(static.zongheng.com, verified 200), `latestChapter`, `updateTime`, `url`.
Detail records add `recommendCount`, `clickCount`, `createTime`,
`latestChapterId`, `latestDate`, `firstChapter`, `firstChapterUrl`,
`latestChapterUrl`, `authorTotalWords`.

Every record carries `recordType`, `sourceUrl` and `scrapedAt`.

### Reliability

- Exponential-backoff retries on 429/5xx and intermittent Chinese-CDN timeouts.
- On 403/429 the actor lazily engages the free Apify `AUTO` datacenter proxy group.
- Invalid book URLs / unparseable pages produce typed `recordType: "error"` records.

### Limitations

- **SSR-dependent modes (`byCategory`, `ranking`, `byBookUrl`)**: zongheng serves the
  full server-rendered state only to some networks; from some datacenter IPs it may
  return a client-side shell without the `window.__NUXT__` data. Those modes then
  fail-soft with a typed `recordType: "error"` record (`SSR_UNAVAILABLE` /
  `BOOK_UNAVAILABLE`) and a status message — retry and they typically resolve
  (verified working from Apify cloud). The `search` mode uses a clean JSON API and
  works everywhere.
- The `byCategory` mode walks all 13 pre-rendered category sections (click rank,
  new books, hot sales, recommendations, classics, premium, trial-read, etc.); the
  `serialStatus` value inside some category rank lists is zeroed upstream
  (unreliable), so `status` is most accurate in `search`/`byBookUrl` modes.
- `wordCount` is omitted when upstream reports 0 (stub value, not a real count).
- Chapter links (`firstChapterUrl` / `latestChapterUrl`) point at `read.zongheng.com`,
  which is Referer-protected: the links return 403 from a clean client (fresh browser
  tab, curl, or a programmatic fetch without a Referer) and load only after a visit to
  the book page on `www.zongheng.com`. The links are correct — set `includeChapters=false`
  if you don't need them.
- Full chapter lists live behind the client-side `wwwapi.zongheng.com` API which is
  unreachable from this network; book records include the first and latest chapter
  names/IDs/links instead. Set `includeChapters=false` to drop them.
- Category pages expose curated sections per category (not an exhaustive
  paginated list — the full list is SPA-only).

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Book title or partial title keyword (mode=search). e.g. `剑来`, `星辰`.

## `categoryId` (type: `string`):

Zongheng top-level category (cateFineId).

## `rankType` (type: `string`):

Which ranking list to read from the zongheng rank page.

## `bookUrls` (type: `array`):

e.g. `https://www.zongheng.com/detail/1385191` or `https://www.zongheng.com/book/1385191.html`.

## `includeChapters` (type: `boolean`):

Emit first/latest chapter names and links on book records (mode=byBookUrl).

## `minWordCount` (type: `integer`):

Drop books with fewer words than this.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "剑来",
  "categoryId": "8101",
  "rankType": "monthTicket",
  "bookUrls": [],
  "includeChapters": true,
  "maxItems": 20
}
```

# Actor output Schema

## `books` (type: `string`):

Dataset containing all scraped zongheng.com books.

# 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 = {
    "mode": "search",
    "searchQuery": "剑来",
    "categoryId": "8101",
    "rankType": "monthTicket",
    "bookUrls": [],
    "includeChapters": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/zongheng-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 = {
    "mode": "search",
    "searchQuery": "剑来",
    "categoryId": "8101",
    "rankType": "monthTicket",
    "bookUrls": [],
    "includeChapters": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/zongheng-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 '{
  "mode": "search",
  "searchQuery": "剑来",
  "categoryId": "8101",
  "rankType": "monthTicket",
  "bookUrls": [],
  "includeChapters": true,
  "maxItems": 20
}' |
apify call crawlerbros/zongheng-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/zongheng-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/yNsg17Ou3Ps8SsJNt/builds/Z7ee495cengFjwTcj/openapi.json
