# Liepin Scraper 猎聘: China Jobs, Salary Data & Headhunter Posts (`getascraper/liepin-scraper`) Actor

Liepin scraper for China jobs: white-collar and headhunter postings with CNY and USD salary, bonus months, salary percentiles, seniority, poster type and recruiter title. Search by English or Chinese job title and city, and track new, updated and removed jobs. No login needed. $1.76 per 1,000 jobs.

- **URL**: https://apify.com/getascraper/liepin-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 59 total users, 11 monthly users, 98.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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.
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

## 🇨🇳 Liepin Scraper 猎聘: China Jobs, Salary Data & Headhunter Posts

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed;margin-bottom:0">
<tr>
<td colspan="4" style="border:none;padding:14px 18px;background:#FEE2E2;border-top:3px solid #B91C1C;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-radius:10px 10px 0 0;color:#1C1917">
<span style="font-size:16px;font-weight:700;color:#1C1917">Collect public Liepin job postings with CNY and USD salary data, and know exactly what changed.</span> <span style="font-size:15px;color:#57534E">Search China's white-collar job market by keyword and city, several of each in one run, and see which jobs are posted by the hiring company and which by headhunters. Turn on change tracking to get only new, updated, and removed jobs on every run.</span>
</td>
</tr>
<tr>
<td colspan="4" style="border:none;padding:10px 14px;background:#B91C1C;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;color:#FFFFFF">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">China jobs source comparison</span>
<span style="color:#FBD5D5;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Zhaopin, 51Job, Liepin, and ChinaHR listings side by side</span>
</td>
</tr>
<tr>
<td style="border:none;padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-y4gjuGAC4xGshlm6m-lb3TrznfpI-CompressJPEG.Online_img%28512x512%29_%288%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/zhaopin-jobs-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Zhaopin</a></span><br>
<span style="color:#57534E;font-size:11px">Jobs, salary &amp; hiring-change monitoring</span>
</td>
<td style="border:none;padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-e2mxWFMIH10tIVN0f-yhHOLwlfsM-CompressJPEG.Online_img%28512x512%29_%289%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/51job-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">51job</a></span><br>
<span style="color:#57534E;font-size:11px">Jobs, salary &amp; employer context</span>
</td>
<td style="border:none;padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FEE2E2;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-BuC7iEzhhplgO8ZX4-l5qn04Im5u-CompressJPEG.Online_img%28512x512%29_%2811%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/liepin-scraper" style="color:#B91C1C;text-decoration:none;font-weight:700;font-size:13px">Liepin</a></span><br>
<span style="color:#B91C1C;font-size:11px;font-weight:700">&#10148; You are here</span>
</td>
<td style="border:none;padding:10px 12px;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-EhSPkTwTCROda2Czz-DG8Q4VPIkU-1631301125523.jpeg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/chinahr-jobs-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">ChinaHR</a></span><br>
<span style="color:#57534E;font-size:11px">Job titles, salary &amp; employer data</span>
</td>
</tr>
<tr>
<td colspan="4" style="border:none;padding:10px 14px;background:#FFFFFF;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;text-align:center;color:#1C1917">
<span style="color:#57534E;font-size:13px"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-1pJSp13lO8ggYNu80-RKIXMxSZ9k-images_%2872%29.jpeg" width="18" height="18" style="vertical-align:middle;border-radius:4px">&nbsp; More than one job board? <a href="https://apify.com/getascraper/china-jobs-feed" style="color:#B91C1C;text-decoration:none;font-weight:700">China Jobs Feed</a> covers the main ones in one run.</span><br>
<span lang="zh" style="color:#78716C;font-size:12px"><span style="white-space:nowrap">要查多个招聘网站？</span> <span style="white-space:nowrap">China Jobs Feed</span> <span style="white-space:nowrap">一次运行覆盖主要平台。</span></span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0;margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#FEE2E2;border:1px solid #FECACA;border-top:none;color:#1C1917">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Liepin jobs with salary statistics and poster type attached</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Search China's white-collar job market by keyword and city, or start from featured listings, and keep normalized CNY and USD salary figures, requirements, and company details in clean rows.</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FECACA;vertical-align:top;border-top:none;border-radius:0 0 0 10px;color:#1C1917">
<span style="font-size:15px;font-weight:800;color:#B91C1C">💰 Salary data you can compare</span><br>
<span style="font-size:12px;color:#57534E">Monthly CNY and USD pay, pay months, annual figure and percentiles by role and city.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FECACA;border-left:none;vertical-align:top;border-top:none;color:#1C1917">
<span style="font-size:15px;font-weight:800;color:#B91C1C">🔔 Change tracking built in</span><br>
<span style="font-size:12px;color:#57534E">Every run after the first returns only new, updated, and removed jobs.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FECACA;border-left:none;vertical-align:top;border-top:none;color:#1C1917">
<span style="font-size:15px;font-weight:800;color:#B91C1C">🧑‍💼 Headhunter or employer</span><br>
<span style="font-size:12px;color:#57534E">Every job says who posted it, with company industry, funding stage and size.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FECACA;border-left:none;vertical-align:top;border-top:none;border-radius:0 0 10px 0;color:#1C1917">
<span style="font-size:15px;font-weight:800;color:#B91C1C">📝 Optional job detail</span><br>
<span style="font-size:12px;color:#57534E">Pull the full public job description only on the runs where you need it.</span>
</td>
</tr>
</table>

Liepin jobs data, from the white-collar and executive job board 猎聘, in clean rows. This Actor returns public listing data for China salary data products, recruitment-market research, headhunter and recruiter tracking, and company hiring intelligence. It does not collect candidate profiles or private contact information, and it needs no Liepin account.

### 🎯 What you can do

- Search several job titles across several cities in one run, de-duplicated by job ID.
- Get monthly and annual salary in CNY, with optional US dollars at a dated exchange rate shown on each row.
- Save salary statistics (median and percentiles by keyword and city, degree, seniority and poster type) computed from the jobs in the run.
- Tell headhunter-posted jobs from jobs posted by the hiring company, and keep only one kind with a filter.
- Turn on change tracking to get only new, updated, and removed jobs on a schedule, with the previous salary when it changed.
- Flag the same company posting the same title in several cities.
- Paste Liepin category, city or search links, including the links used by other Liepin scrapers. Search links run on the closest Liepin job category for their keyword, and the run tells you which one.
- Add full job descriptions, work address and last update date for the runs that need them.

### 👥 Who this China jobs data is for

- **I am a workforce researcher** looking to measure demand and advertised CNY compensation for professional roles in a Chinese city.
- **I am a job-data platform manager** looking to add traceable public Liepin roles to a China jobs product.
- **I am a talent-intelligence analyst** looking to identify companies, sectors, and locations hiring for a specialist role.
- **I am a market-research consultant** looking to compare public role requirements and employer signals without manually reading result pages.

### 🛠️ How to use it

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0">
<tr>
<td style="padding:16px 14px;width:33%;background:#FEE2E2;border:1px solid #FECACA;border-radius:10px 0 0 10px;vertical-align:top;color:#1C1917">
<span style="font-size:12px;font-weight:800;color:#B91C1C;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Choose keywords and cities</span><br>
<span style="font-size:12px;color:#57534E">Add one or many job titles and cities, or paste Liepin links you already use.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FEE2E2;border:1px solid #FECACA;border-left:none;vertical-align:top;color:#1C1917">
<span style="font-size:12px;font-weight:800;color:#B91C1C;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Bound the run</span><br>
<span style="font-size:12px;color:#57534E">Set a job limit, page depth, filters, and whether to add USD pay or job descriptions.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FEE2E2;border:1px solid #FECACA;border-left:none;border-radius:0 10px 10px 0;vertical-align:top;color:#1C1917">
<span style="font-size:12px;font-weight:800;color:#B91C1C;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Use the evidence</span><br>
<span style="font-size:12px;color:#57534E">Analyze source URLs, salary, requirement, and company fields in your own workflow.</span>
</td>
</tr>
</table>

### 📥 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `scrapeMode` | enum | No | Search by keyword and city (default), featured jobs from the Liepin home page, or pasted Liepin links. |
| `keywords` | array | No | Job titles in English or Chinese, such as python, product manager, nurse or 产品经理. Each is matched to a Liepin job category. |
| `cities` | array | No | City names such as Beijing, Shanghai or 杭州, Liepin city codes such as 010, or `all` for nationwide. Beijing when left empty. |
| `startUrls` | array | No | Liepin links used in link mode. Category and city links run exactly as given. Search links run on the closest Liepin job category for their keyword, so results can differ from the site's own search, and the status message names the category used. |
| `maxItems` | integer | No | Most jobs returned across the run (default 25, up to 5,000). Free-plan runs are capped at 25. |
| `pagesPerQuery` | integer | No | Most result pages per keyword and city. Each page holds up to 40 jobs. |
| `postedBy` | enum | No | Anyone (default), hiring company only, or headhunter only. |
| `onlyDisclosedSalary` | boolean | No | Skip jobs without a readable salary. |
| `minMonthlySalaryCny` | integer | No | Keep jobs whose top salary reaches this monthly amount. |
| `excludeKeywords` | array | No | Skip jobs whose title or company contains any of these words. |
| `dropCrossCityDuplicates` | boolean | No | Keep only the first row when a company posts the same title in several cities. |
| `fallbackToFeaturedJobs` | boolean | No | Off by default. When on, featured home page jobs are returned if nothing matched; they are labelled `home-board` and charged like any job. |
| `convertToUsd` | boolean | No | Add US dollar salary figures. |
| `salaryStatistics` | boolean | No | Save a `SALARY_STATS` record for the run (on by default). |
| `salaryStatisticsMinSample` | integer | No | Fewest jobs with a salary needed to report a group. |
| `includeSourceFields` | boolean | No | Add a `sourceFields` object with the values as Liepin shows them. |
| `includeJobDetail` | boolean | No | Add description, full company name, work address, headcount and last update. Jobs whose page cannot be read are not returned or charged. |
| `monitorMode` | enum | No | `Snapshot` (default) or `Track changes` for new, updated and removed jobs. |
| `stateName` | string | No | Watchlist name for change tracking. Use a different name per keyword set or schedule. |
| `includeUnchanged` | boolean | No | With change tracking, also return unchanged jobs. |
| `proxyConfiguration` | object | No | Leave on automatic, or set your own proxy. |

Earlier inputs `keyword`, `city`, and the `urls`, `max_page` and `max_results` inputs used by other Liepin scrapers are still accepted. Liepin's keyword search results page is not read; each keyword is matched to the closest Liepin job category instead, and English job titles are understood in several hundred common forms, and a keyword with no matching category ends the run with a clear message and suggestions.

### 📊 Data you receive

The Actor returns one flat record per public Liepin listing. A field is omitted or `null` when the source does not publish it.

#### Output example

One real row from a Python search in Beijing:

```json
{
    "jobId": "81069331",
    "title": "Python 开发工程师（AI/Agent 方向）",
    "companyName": "沃丰科技",
    "salaryString": "23-50k",
    "salaryPeriod": "month",
    "minSalaryMonthlyCny": 23000,
    "maxSalaryMonthlyCny": 50000,
    "bonusMonths": 12,
    "annualEstimateCny": 438000,
    "salaryDisclosed": true,
    "cityName": "北京",
    "districtName": "西直门",
    "experienceString": "2-10年",
    "experienceEnglish": "2-10 Years",
    "experienceMinYears": 2,
    "experienceMaxYears": 10,
    "degreeString": "本科",
    "degreeEnglish": "Bachelor's",
    "companyId": "8926847",
    "companyIndustry": "计算机软件",
    "companyScale": "500-999人",
    "companyStage": "D轮及以上融资",
    "companyUrl": "https://www.liepin.com/company/8926847/",
    "jobKind": 2,
    "postedByType": "employer",
    "recruiterTitle": "集团招聘总监",
    "recruiterName": "邵女士",
    "listingUrl": "https://www.liepin.com/city-bj/career/python/",
    "jobUrl": "https://www.liepin.com/job/1981069331.shtml",
    "scrapedAt": "2026-11-11T03:55:17.547Z",
    "sourceLabel": "search",
    "categoryName": "Python",
    "categorySlug": "python",
    "searchKeyword": "python",
    "searchCity": "北京",
    "salaryMedianMonthlyCny": 36500,
    "changeType": "SNAPSHOT"
}
```

| Field                 | Type           | Description                                               |
| --------------------- | -------------- | --------------------------------------------------------- |
| `jobId`               | string         | Source job identifier.                                    |
| `title`               | string         | Published job title.                                      |
| `companyName`         | string or null | Published employer name.                                  |
| `salaryString`        | string or null | Original salary text from the source.                     |
| `minSalaryMonthlyCny` | number or null | Lower monthly CNY amount when derivable from the source.  |
| `maxSalaryMonthlyCny` | number or null | Upper monthly CNY amount when derivable from the source.  |
| `bonusMonths`         | number or null | Number of salary months published by the source.          |
| `annualEstimateCny`   | number or null | Annual CNY estimate when derivable from the source.       |
| `salaryDisclosed`     | boolean        | Whether the listing publishes salary information.         |
| `cityName`            | string or null | Published city.                                           |
| `districtName`        | string or null | Published district.                                       |
| `experienceString`    | string or null | Original experience requirement.                          |
| `experienceEnglish`   | string or null | English experience label when mapped from the source.     |
| `experienceMinYears`  | number or null | Minimum required experience in years when parsed.         |
| `experienceMaxYears`  | number or null | Maximum required experience in years when parsed.         |
| `degreeString`        | string or null | Original education requirement.                           |
| `degreeEnglish`       | string or null | English education label when mapped from the source.      |
| `companyId`           | string or null | Source company identifier.                                |
| `companyTypeString`   | string or null | Original company-type label.                              |
| `companyTypeEnglish`  | string or null | English company-type label when mapped from the source.   |
| `companyIndustry`     | string or null | Published company industry.                               |
| `companyScale`        | string or null | Published employer-size label.                            |
| `companyUrl`          | string or null | Public employer page when published.                      |
| `jobKind`             | number or null | Source poster-type code: 2 is the hiring company, 1 is a headhunting firm. |
| `postedByType` | string or null | `employer` for jobs posted by the hiring company, `headhunter` for jobs posted by a headhunting firm. |
| `companyNameHidden` | boolean or null | `true` when Liepin hides the company name (common on headhunter jobs); `companyName` is then omitted. |
| `recruiterTitle` | string or null | Job title of the poster, for example HR or a headhunter title. |
| `recruiterName` | string or null | The recruiter's surname and title in the short form Liepin shows on the listing, for example 邵女士 (Ms Shao). Never a full name, phone number or email. Omitted when the listing shows no name in that form. |
| `salaryPeriod` | string or null | `month`, `year` or `day`, as the source states the pay. Daily pay is converted to monthly at 21.75 working days. |
| `salaryMedianMonthlyCny` | number or null | Midpoint of the monthly salary range. |
| `salaryMedianMonthlyUsd`, `salaryMinMonthlyUsd`, `salaryMaxMonthlyUsd`, `annualEstimateUsd` | number or null | US dollar figures when `convertToUsd` is on, with `usdPerCny` and `usdRateDate`. |
| `seniorityLevel` | string or null | Level named in the job title (intern, junior, senior, lead, manager, director, vp, c_level); omitted when the title names none. |
| `requiresFullTimeEnrolment` | boolean or null | `true` when the degree requirement says 统招 (full-time enrolment). |
| `companyStage` | string or null | Funding stage shown on the listing, for example B轮 or 已上市. |
| `categoryName`, `categorySlug` | string or null | The Liepin job category the keyword was matched to. |
| `searchKeyword`, `searchCity` | string or null | The keyword and city this row was collected for. |
| `crossCityDuplicate`, `crossCityDuplicateCities`, `crossCityDuplicateOf` | mixed | Set when the same company posts the same title in several cities in the run. |
| `previousSalaryString`, `salaryChangePct` | mixed | With change tracking, on an `UPDATED` job whose salary changed. |
| `companyFullName`, `workAddress`, `headcount`, `lastUpdatedDate`, `daysSinceUpdated`, `recruiterActiveText` | mixed | Added by `includeJobDetail`. |
| `sourceFields` | object or null | Raw values as Liepin shows them when `includeSourceFields` is on. |
| `descriptionText`     | string or null | Public job-description text when `includeJobDetail` is on. |
| `listingUrl`          | string         | Liepin page from which the row was collected.             |
| `jobUrl`              | string         | Public source page for the job.                           |
| `sourceLabel`         | string or null | `search`/`urls` for a keyword or link match, `home` for a featured-jobs run, or `home-board` when the optional fallback returned featured jobs (never a keyword match). |
| `changeType`          | string or null | With change tracking on: `NEW`, `UPDATED`, `UNCHANGED`, or `REMOVED`. Otherwise `SNAPSHOT`. |
| `firstSeenAt`         | string or null | With change tracking on: when this job was first seen under this watchlist name. |
| `lastSeenAt`          | string or null | With change tracking on: when this job was last seen matching.                    |
| `scrapedAt`           | string         | Time the record was collected.                            |

### 💵 Pricing

This is a pay-per-result Actor. You pay for job rows returned to the dataset, with a lower price per row on higher Apify plans, and a small start charge per run. You are not charged for empty searches, blocked attempts, keywords that match no category, or rows whose requested job description could not be read. Salary statistics and the run summary are free. You can cap spending with the maximum total charge setting of the run. There is no subscription.

[View the current usage price and free-test allowance on the Actor page.](https://apify.com/getascraper/liepin-scraper/pricing)

### ⭐ Enjoying Liepin Scraper?

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0">
<tr>
<td style="padding:20px 24px 14px;background:#FEE2E2;border:1px solid #FECACA;border-left:5px solid #B91C1C;border-radius:10px 10px 0 0;color:#1C1917">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Found useful white-collar hiring data for your workflow?</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other workforce researchers and job-data teams find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#B91C1C;border:1px solid #B91C1C;border-left:5px solid #B91C1C;border-top:none;border-radius:0 0 10px 10px;text-align:center;color:#FFFFFF">
<a href="https://apify.com/getascraper/liepin-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

##### How do I run a 猎聘 search for a job title in Chinese or English?

Enter the job title in `keywords`, for example `产品经理`, `数据分析师`, `java`, `data analyst`, `product manager` or `nurse`, and add one or more cities. The Actor matches each keyword to the closest Liepin job category and returns the jobs listed there. If no category matches, the run ends cleanly, tells you, and suggests close categories.

##### 猎聘有哪些职位数据可以导出 (what Liepin job data can I export)?

Title, company, salary in CNY with pay months, city and district, experience and degree, company industry, size and funding stage, poster type (hiring company or headhunter) and the link to each job. Turn on job detail for the description, full company name and work address.

##### Can I move from another Liepin scraper without changing my pipeline?

Yes. The `urls`, `max_page` and `max_results` inputs are accepted, including m.liepin.com search links, and `includeSourceFields` adds the values as Liepin shows them. Search links are not run as Liepin's own search page: the keyword in each link is matched to the closest Liepin job category and that category is collected, so results can differ from the site's search results. The run status message says which category each link used, and a keyword that is not a job category (for example a country name) returns a clear message instead of rows.

##### What happens if Liepin blocks a request?

The run finishes without an error and charges nothing for rows it could not collect. It retries automatically with a different connection first. The status message says whether Liepin had no matching jobs, could not be reached, or showed an access check, so a blocked run is never shown as an empty search. Rows already collected are kept.

##### How does change tracking decide a job was removed?

A job is reported `REMOVED` only after two consecutive complete scans confirm it is gone. A scan that stopped at your job or page limit, or could not read a page, never removes anything.

##### Does this Liepin scraper collect candidate profiles or private contacts?

No. It is for public job listings, salaries, requirements, and employer context. It does not collect candidate profiles or private contact information. For the recruiter it returns only what the listing shows in short form, a surname with a title such as 邵女士, plus the recruiter's job title. Full names, phone numbers and email addresses are never collected.

### ⚖️ Responsible use

Use public employment data in line with the source terms, applicable law, and your organization’s privacy obligations. Do not use the output to make decisions about individual candidates.

### 🛟 Support

For a reproducible issue, include the keywords and cities or the Liepin link, selected mode, approximate run time, and the run ID. That provides enough context to inspect the source response.

### 🔗 Other actors

- [China Jobs Feed 中国招聘: Zhaopin, Liepin, 51job, Lagou, Shixiseng](https://apify.com/getascraper/china-jobs-feed) ↗ - reads several Chinese job boards in one run, in one format, with a monitor mode for new jobs.
- [51job scraper 前程无忧](https://apify.com/getascraper/51job-scraper) ↗ - Jobs, salary, and hiring-change monitoring for China's largest job board.
- [Zhaopin Scraper 智联招聘](https://apify.com/getascraper/zhaopin-jobs-scraper) ↗ - China jobs and salary data with change tracking, from Zhaopin.
- [Lagou Tech Jobs Scraper](https://apify.com/getascraper/lagou-tech-jobs-scraper) ↗ - China tech and IT recruitment postings with salary ranges.
- [iGuopin Jobs Scraper 国聘](https://apify.com/getascraper/iguopin-jobs-scraper) ↗ - State-owned enterprise and campus recruitment postings in China.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/liepin-scraper/changelog.md

# Actor input Schema

## `scrapeMode` (type: `string`):

'Search by keyword and city' reads the Liepin job category that matches each keyword in each city. 'Featured jobs' returns the jobs shown on the Liepin home page. 'Paste links' accepts Liepin category, city and search links; category and city links run exactly as given, search links run as a category search (see Liepin links).

## `keywords` (type: `array`):

Job titles in English or Chinese, such as python, product manager, nurse, 数据分析师 or 产品经理. Each keyword is matched to a Liepin job category and combined with every city. Results are de-duplicated by job ID.

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

City names in English or Chinese, such as Beijing, Shanghai, Shenzhen or 杭州, or 'all' for nationwide. Liepin city codes also work: 010 Beijing, 020 Shanghai, 030 Guangzhou, 040 Shenzhen, 180 Wuhan, 090 Chengdu, 080 Hangzhou, 060 Nanjing, 070 Suzhou, 050 Chongqing, 230 Changsha, 240 Xi'an, 280 Tianjin. When left empty, Beijing is used.

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

Only used when the mode is 'Paste Liepin links'. Category links (for example https://www.liepin.com/city-bj/career/python/) and city links run exactly as given. Search links, including m.liepin.com links, are not run as Liepin's own search page: the keyword in the link is matched to the closest Liepin job category and that category is collected for the link's city, so results can differ from the site's search results. The run status message says when this happened and which category was used.

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

Upper limit on delivered jobs across all keywords, cities and links. Free-plan runs are capped at 25.

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

Most result pages to read for each keyword and city. Each page holds up to 40 jobs.

## `postedBy` (type: `string`):

Keep only jobs posted directly by the hiring company, or only jobs posted by headhunting firms. 'Anyone' keeps both and the postedByType field tells them apart.

## `onlyDisclosedSalary` (type: `boolean`):

Skip jobs marked 面议 (negotiable) or with a salary that cannot be read.

## `minMonthlySalaryCny` (type: `integer`):

Keep jobs whose top salary is at least this monthly amount. Jobs without a readable salary are skipped.

## `excludeKeywords` (type: `array`):

Skip jobs whose title or company name contains any of these words.

## `dropCrossCityDuplicates` (type: `boolean`):

When the same company posts the same title in several cities, keep only the first row. Off by default; repeats are flagged instead.

## `fallbackToFeaturedJobs` (type: `boolean`):

Off by default. When on and no category matches a keyword (or Liepin cannot be read), return the featured jobs from the Liepin home page instead, labelled home-board. Those jobs are not keyword matches and are charged like any other job.

## `convertToUsd` (type: `boolean`):

Adds monthly and annual US dollar figures using a dated exchange rate shown on each row.

## `salaryStatistics` (type: `boolean`):

Saves a SALARY_STATS record with median and percentile pay per keyword and city, per city, degree, seniority and poster type, computed only from the jobs collected in this run.

## `salaryStatisticsMinSample` (type: `integer`):

A group is left out of the statistics when fewer jobs than this have a disclosed salary.

## `includeSourceFields` (type: `boolean`):

Adds a sourceFields object with the card values as Liepin shows them (salary, dq, requireWorkYears, requireEduLevel, company, compScale, industry, recruiterTitle, jobKind, jobLabels). Useful when migrating from other Liepin scrapers.

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

Opens each job page to add the description, full company name, work address, headcount and last update date. Slower. Jobs whose page cannot be read are not returned and not charged, because the row would not be what you asked for.

## `monitorMode` (type: `string`):

'Snapshot' returns every matching job on every run. 'Track changes' remembers jobs across runs (per watchlist name) and returns only new and updated jobs (with the previous salary when it changed) plus removed jobs. A job is reported removed only after two consecutive complete scans, and a scan cut short by a job or page limit never removes anything.

## `stateName` (type: `string`):

Only used with 'Track changes'. Runs that share a name share history; use a different name for each keyword set or schedule.

## `includeUnchanged` (type: `boolean`):

Only used with 'Track changes'. Also returns a row for every job that is the same as last run.

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

Leave the default for automatic connection: the Actor starts with the cheapest connection and switches to Apify Proxy only if Liepin asks for it. Set your own groups, country or proxy URLs to force a specific connection.

## `keyword` (type: `string`):

Kept so saved tasks keep working. Used only when the Search keywords list is left at its default.

## `city` (type: `string`):

Kept so saved tasks keep working. A Liepin city code such as 010, a name, or all. Used only when the Cities list is left at its default.

## `urls` (type: `array`):

Same input as saswave/liepin-scraper: Liepin links, including m.liepin.com search links. When set, the Actor runs in link mode. Search links run as a category search on the closest Liepin job category for their keyword, as described under Liepin links.

## `max_page` (type: `integer`):

Same as saswave/liepin-scraper: most result pages per link. 0 means as many as exist (up to 100). Overrides Pages per search.

## `max_results` (type: `integer`):

Most jobs to return; 0 means up to 5,000. Overrides Max jobs to return.

## Actor input object example

```json
{
  "scrapeMode": "search",
  "keywords": [
    "python"
  ],
  "cities": [
    "Beijing"
  ],
  "startUrls": [],
  "maxItems": 25,
  "pagesPerQuery": 3,
  "postedBy": "any",
  "onlyDisclosedSalary": false,
  "dropCrossCityDuplicates": false,
  "fallbackToFeaturedJobs": false,
  "convertToUsd": false,
  "salaryStatistics": true,
  "salaryStatisticsMinSample": 5,
  "includeSourceFields": false,
  "includeJobDetail": false,
  "monitorMode": "snapshot",
  "stateName": "default",
  "includeUnchanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Genuine public Liepin job listings in one flat dataset.

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

Non-chargeable source, completeness, detail, and output totals.

## `salaryStats` (type: `string`):

Median and percentile pay computed from the jobs in this run.

# 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 = {
    "scrapeMode": "search",
    "keywords": [
        "python"
    ],
    "cities": [
        "Beijing"
    ],
    "startUrls": [],
    "maxItems": 25,
    "pagesPerQuery": 3,
    "postedBy": "any",
    "onlyDisclosedSalary": false,
    "dropCrossCityDuplicates": false,
    "fallbackToFeaturedJobs": false,
    "convertToUsd": false,
    "salaryStatistics": true,
    "salaryStatisticsMinSample": 5,
    "includeSourceFields": false,
    "includeJobDetail": false,
    "monitorMode": "snapshot",
    "stateName": "default",
    "includeUnchanged": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/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 = {
    "scrapeMode": "search",
    "keywords": ["python"],
    "cities": ["Beijing"],
    "startUrls": [],
    "maxItems": 25,
    "pagesPerQuery": 3,
    "postedBy": "any",
    "onlyDisclosedSalary": False,
    "dropCrossCityDuplicates": False,
    "fallbackToFeaturedJobs": False,
    "convertToUsd": False,
    "salaryStatistics": True,
    "salaryStatisticsMinSample": 5,
    "includeSourceFields": False,
    "includeJobDetail": False,
    "monitorMode": "snapshot",
    "stateName": "default",
    "includeUnchanged": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/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 '{
  "scrapeMode": "search",
  "keywords": [
    "python"
  ],
  "cities": [
    "Beijing"
  ],
  "startUrls": [],
  "maxItems": 25,
  "pagesPerQuery": 3,
  "postedBy": "any",
  "onlyDisclosedSalary": false,
  "dropCrossCityDuplicates": false,
  "fallbackToFeaturedJobs": false,
  "convertToUsd": false,
  "salaryStatistics": true,
  "salaryStatisticsMinSample": 5,
  "includeSourceFields": false,
  "includeJobDetail": false,
  "monitorMode": "snapshot",
  "stateName": "default",
  "includeUnchanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/liepin-scraper --silent --output-dataset

```

## MCP server setup

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