# Liepin Scraper 猎聘 - China Jobs, Salaries & Recruiters (`memo23/liepin-scraper`) Actor

Scrape jobs from Liepin (liepin.com, 猎聘), China's white-collar and headhunter job board. Get title, salary range, city, experience, education, company profile and the recruiter behind each job. Search by keyword and city. No proxy setup. JSON or CSV.

- **URL**: https://apify.com/memo23/liepin-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 jobs

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

## Liepin Scraper 猎聘 — China Jobs, Salaries, Companies & Recruiters

Scrape **Liepin** (`liepin.com`, 猎聘), China's leading white-collar and headhunter job board, by keyword and city. Get the job title, parsed salary range (including the number of salary months), city and district, required experience and education, the hiring company's profile, and **the recruiter or headhunter behind each job**. No proxy setup, no login.

Built for recruiters, headhunting firms, HR-tech products and China labour-market analysts who need Liepin data as structured JSON.

### Why use this scraper

- **Salaries as numbers.** `40-70k·14薪` becomes `min 40000`, `max 70000`, `months 14`, period `month` — ready to sort, filter and annualise.
- **The recruiter, not just the job.** Every row carries the recruiter's name, title and last-active status — the contact layer that makes Liepin different from generic job boards.
- **Company profile on every row.** Company name, industry, size and funding stage come with each job; turn on full details to add the company address and headcount.
- **Keyword × city grid.** Search any keyword across as many cities as you like; each pair is paged automatically.
- **Monitor mode that only bills for change.** Deliver (and pay for) only jobs that are new or updated since the last run.
- **No setup.** No proxies, cookies or keys to configure.

### Overview

Liepin is one of China's largest mid-to-senior job platforms, used heavily by headhunters. This actor searches Liepin for each keyword in each city you choose, reads up to 10 result pages per search, and returns one normalized row per job. Optionally it opens each job page for the full description.

### Supported inputs

| Input | What it does |
|---|---|
| `searchTerms` | Keywords in Chinese or English, e.g. `python`, `销售`, `产品经理`. |
| `cities` | Chinese names (`北京`), pinyin (`beijing`) or Liepin city codes (`010`). Empty = nationwide. |
| `pagesPerQuery` | Result pages (≈40 jobs each) per keyword × city, up to 10. |
| `includeJobDetail` | Also open each job page for the full description, company address and headcount. |
| `startUrls` | Paste Liepin search URLs or job URLs — auto-routed. |
| `onlyChanged` | Monitor mode: deliver only new or changed jobs. |
| `maxItems` | Hard cap on jobs collected and billed. |
| `maxConcurrency` | Parallel job-page requests when full details are on. |

Supported city names out of the box: 全国 (nationwide), 北京, 上海, 天津, 重庆, 广州, 深圳, 南京, 苏州, 杭州, 武汉, 西安, 成都 — any other Liepin city works by its code.

### Use cases

- **Headhunting & sourcing.** Map which companies and recruiters are hiring for a role, city by city.
- **Salary benchmarking.** Compare monthly ranges and salary-month counts across cities, seniority and industries.
- **Competitive hiring intel.** Track which companies are expanding teams and at what level.
- **Job-alert products.** Feed fresh postings into alerts with monitor mode.

### How it works

1. Each keyword is searched in each chosen city; pasted URLs are auto-classified.
2. Result pages are read one after another, up to `pagesPerQuery` (Liepin serves at most 10 per search).
3. Each job is normalized into a flat row with parsed salary, company and recruiter.
4. With full details on, each job page is opened for the description and company address.
5. In monitor mode, unchanged jobs are skipped before billing.

### Output sample

```json
{
  "type": "job",
  "source": "liepin.com",
  "jobId": "85675269",
  "url": "https://www.liepin.com/job/1985675269.shtml",
  "title": "海外增长技术专家",
  "salary": { "raw": "40-70k·14薪", "min": 40000, "max": 70000, "months": 14, "currency": "CNY", "period": "month", "negotiable": false },
  "city": "北京",
  "district": "昌平区",
  "experience": "5-10年",
  "education": "统招本科",
  "refreshedAt": "2026-09-23T17:40:29+08:00",
  "company": { "name": "好未来", "industry": "教育", "scale": "10000人以上", "stage": "已上市" },
  "recruiter": { "name": "唐女士", "title": "招聘顾问", "lastActive": "2小时前在线" },
  "description": null,
  "searchKeyword": "python",
  "searchCity": "北京"
}
```

`description`, `headcount` and `company.address` are filled when `includeJobDetail` is on.

### Key output fields

`jobId`, `title`, `salary` (`raw` / `min` / `max` / `months` / `period` / `negotiable`), `city`, `district`, `experience`, `education`, `labels`, `refreshedAt`, `featured`, `company` (`name` / `industry` / `scale` / `stage` / `address`), `recruiter` (`name` / `title` / `lastActive`), `description`, `url`, `searchKeyword`, `searchCity`.

### Pricing

Pay-per-event: a small per-run start fee plus a per-job charge. Monitor mode only bills for jobs that are new or updated.

### FAQ

**Do I need proxies?** No.

**Why at most 10 pages per search?** Liepin itself serves up to 10 result pages per search. To collect more, add cities (each keyword × city pair is its own search).

**Is the recruiter's phone or email included?** No. Liepin does not publish recruiter contact details on job listings; you get the recruiter's name, title and activity status.

**Can I search in English?** Yes, English keywords work; results are in Chinese as published on Liepin.

### For AI agents & LLM apps

Every row is flat, typed JSON with numeric salary fields and a stable schema, ready for a retrieval pipeline, an agent tool call, or a spreadsheet. Point an MCP-enabled agent at this actor to pull live Chinese job-market data on demand.

### ⚠️ Disclaimer

This actor collects only publicly available information from `liepin.com`. Use the data in compliance with applicable laws (including China's PIPL where relevant) and the source site's terms. You are responsible for how you use the scraped data, including any personal data.

### SEO Keywords

Liepin scraper, 猎聘 scraper, liepin.com scraper, China jobs API, Chinese job board scraper, China salary data, headhunter jobs China, recruiter data China, 招聘数据, 猎聘职位抓取, China white-collar jobs, job postings China export.

# Actor input Schema

## `searchTerms` (type: `array`):

Job keywords, in Chinese or English, e.g. `python`, `销售`, `产品经理`, `Java`.

## `cities` (type: `array`):

Cities to search. Use Chinese names (`北京`, `上海`, `深圳`), pinyin (`beijing`, `shenzhen`) or Liepin city codes (`010`). Leave empty for nationwide. Each keyword is searched in each city.

## `pagesPerQuery` (type: `integer`):

How many result pages (about 40 jobs each) to read for every keyword × city pair. Liepin serves at most 10 pages per search, so add more cities to go wider.

## `includeJobDetail` (type: `boolean`):

Also open each job page for the full description, company address and headcount. Slower; search results already include salary, company and recruiter.

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

Paste Liepin search URLs (`https://www.liepin.com/zhaopin/?key=…&dq=…`) or job URLs (`https://www.liepin.com/job/….shtml`) — each is auto-routed.

## `onlyChanged` (type: `boolean`):

Remember jobs between runs and deliver only those that are new or changed since the last run. Unchanged jobs are skipped before billing.

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

Hard cap on jobs collected (and billed).

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

Parallel job-page requests when full details are on. Search pages are always read one at a time.

## Actor input object example

```json
{
  "searchTerms": [
    "python"
  ],
  "cities": [
    "北京"
  ],
  "pagesPerQuery": 10,
  "includeJobDetail": false,
  "startUrls": [],
  "onlyChanged": false,
  "maxItems": 1000,
  "maxConcurrency": 8
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per Liepin job with title, parsed salary, city, experience, education, company profile, recruiter and (optionally) the full 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 = {
    "searchTerms": [
        "python"
    ],
    "cities": [
        "北京"
    ],
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/liepin-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 = {
    "searchTerms": ["python"],
    "cities": ["北京"],
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/liepin-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 '{
  "searchTerms": [
    "python"
  ],
  "cities": [
    "北京"
  ],
  "startUrls": []
}' |
apify call memo23/liepin-scraper --silent --output-dataset

```

## MCP server setup

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