51job Scraper 前程无忧: China Jobs, Salaries & Hiring Data
Pricing
from $3.99 / 1,000 jobs
51job Scraper 前程无忧: China Jobs, Salaries & Hiring Data
51job scraper for public China job postings. Export source URLs, CNY salary data, education, experience, locations, company context, and bilingual fields for hiring research.
Pricing
from $3.99 / 1,000 jobs
Rating
0.0
(0)
Developer
GetAScraper
Maintained by CommunityActor stats
0
Bookmarked
19
Total users
4
Monthly active users
21 hours ago
Last modified
Categories
Share
🇨🇳 51job scraper 前程无忧: China jobs, salaries, and hiring changes
| Build a current China hiring dataset from public 51job searches. Search by keyword and city to get deduplicated jobs with source dates, salary context, employer details, and a monitoring mode for recurring hiring change feeds. | |||
| China jobs source comparison • Zhaopin, 51Job, Liepin, and ChinaHR listings side by side | |||
|
Jobs, salary & hiring-change monitoring |
➤ You are here |
White-collar roles & salary data |
Job titles, salary & employer data |
|
Public 51job listings turned into a hiring dataset with change tracking Search 51job (前程无忧) by keyword and city, and get deduplicated jobs with source dates, normalized CNY salary, employer details, and an optional monitoring mode for recurring hiring-change feeds. |
|
💰 CNY salary detail Monthly and annual CNY bounds derived from source salary text. |
🔁 Hiring-change mode Compare runs to emit new, updated, reappeared, or expired rows. |
🏢 Employer context Company type, size, industry, and financing when the source publishes them. |
🔔 Webhook delivery Send selected monitoring events to your own HTTPS endpoint. |
51job (前程无忧) is a public China employment source. This Actor turns its search results into hiring data for recruiting teams, researchers, and HR technology products. It keeps missing source values absent, so the dataset stays trustworthy.
🔎 What does this Actor do?
Search the public 51job surface with one keyword and city or with a larger keyword and city matrix. The Actor returns one row per unique public job and preserves the fields buyers need to evaluate a role.
| ⚡ Start with one useful search. Then repeat the same scope on a schedule when you need a hiring change feed. |
👥 Who is this for?
- I am a job-data product manager looking to add current China listings without maintaining another source collector.
- I am a labor-market researcher looking to compare salary, education, experience, skills, and employer activity across cities.
- I am an HR technology engineer looking to feed a database or alert workflow with compact rows and stable job IDs.
- I am a market-intelligence analyst looking to use hiring activity as a signal for companies, sectors, and regions.
🚀 How it works
|
STEP 1 Choose the hiring scope Enter keywords, city codes, and source-supported hiring filters. |
STEP 2 Collect clean rows Get deduplicated public jobs with source dates, salary, location, and employer context. |
STEP 3 Use the result that fits Analyze full records, send compact rows to a workflow, or schedule changes mode. |
⚙️ Input
| Field | Type | Required | Description |
|---|---|---|---|
sourceMode | enum | Yes | Choose generated keyword and city searches or exact public 51job search URLs. |
queries | array of strings | No | Keywords in Chinese or English. Each keyword is combined with every selected city. |
cities | array of strings | No | 51job city codes from the input form. Common first-tier cities are included. |
startUrls | array of URLs | No | Public search-result URLs. Detail pages and unrelated hosts are rejected. |
experience | enum | No | Source work-experience filter, from any experience to senior experience bands. |
education | enum | No | Minimum education filter from the source search form. |
employmentType | string | No | Optional employment-type code copied from a supported public search URL. |
companyType | enum | No | Company structure filter such as private, state-owned, joint venture, foreign-owned, or listed. |
companySize | enum | No | Employer headcount range from the source search form. |
industries | array of strings | No | Optional industry codes from a supported public search URL. |
jobFunctions | array of strings | No | Optional job-function codes from a supported public search URL. |
salaryBand | string | No | Optional salary-band code copied from a supported public search URL. |
postedWithin | string | No | Optional issue-date code copied from a supported public search URL. |
sortBy | string | No | Optional source sort code. |
excludeKeywords | array of strings | No | Remove rows matching the supplied text in titles, employers, descriptions, industries, functions, or tags. |
includeRecruiterSignals | boolean | No | Keep public recruiter name, role, labels, online status, and status fields when available. |
maxItems | integer | No | Global result cap from 1 to 5,000. |
maxPagesPerSearch | integer | No | Page cap from 1 to 100 for each keyword and city search. |
outputMode | enum | No | Choose full research records or compact workflow rows. |
monitorMode | enum | No | Return a current snapshot or compare this run with a durable monitoring scope. |
stateName | string | No | Stable watchlist name for recurring changes mode. Use a distinct name for each schedule. |
includeUnchanged | boolean | No | Include unchanged rows in changes mode when a complete comparison is required. |
notifyOnNoChanges | boolean | No | Send a heartbeat when a complete monitoring run has no selected changes. |
proxyConfiguration | object | Yes | Datacenter routing is the tested default. Switch to Residential with Singapore, Hong Kong, or Japan only if a larger run is blocked. |
notificationWebhookUrl | string | No | Optional private HTTPS destination for selected monitoring events. |
notificationEvents | array of strings | No | Select new, updated, reappeared, or expired events for notifications. |
📊 Data table
Every row has schemaVersion: 2, a stable source job ID, a public job URL, and collection time. Optional values are omitted when the public listing does not publish them.
| Field | Type | Description |
|---|---|---|
schemaVersion | integer | Output contract version. |
jobId | string | Stable 51job listing identifier. |
title | string | Public role title. |
jobUrl | URL | Public source page for the role. |
applicationUrl | URL | Distinct public application destination when published by the source. |
dedupeKey | string | Stable key used to remove repeated listings. |
sourcePlatform | string | Source label, currently 51job. |
listingUrl | URL | Search-result URL that produced the row. |
scrapedAt | datetime | Time the Actor collected the row. |
sourcePostedAt | datetime | Source issue date when published. |
sourceUpdatedAt | datetime | Source update date when published. |
daysSincePosted | number | Age calculated from the source issue date. |
province | string | Source province when published. |
city | string | Source city when published. |
district | string | Source district when published. |
locationRaw | string | Original source location text. |
address | string | Public work address when published. |
longitude | number | Numeric longitude when published and valid. |
latitude | number | Numeric latitude when published and valid. |
isRemote | boolean | Public remote-work signal when published. |
isIntern | boolean | Public internship signal when published. |
salaryRaw | string | Original public salary text. |
salaryDisclosed | boolean | Whether the source salary text produced a reliable range. |
salaryNegotiable | boolean | Whether the source marks compensation as negotiable. |
currency | string | Currency label when a salary value is published, currently CNY. |
salaryMinCny | number | Minimum value in the source salary period. |
salaryMaxCny | number | Maximum value in the source salary period. |
salaryPeriod | string | Source salary period, such as daily, monthly, or annual. |
salaryMonthsPerYear | number | Bonus-month count when the source publishes it. |
minSalaryMonthlyCny | number | Monthly equivalent derived from the source range. |
maxSalaryMonthlyCny | number | Monthly equivalent derived from the source range. |
annualMinCny | number | Annual equivalent derived from the source range. |
annualMaxCny | number | Annual equivalent derived from the source range. |
experienceRaw | string | Original experience requirement. |
experienceMinYears | number | Parsed minimum experience when available. |
experienceMaxYears | number | Parsed maximum experience when available. |
educationRaw | string | Original education requirement. |
educationEnglish | string | English education label when the source text is recognized. |
employmentType | string | Public employment type when published. |
jobCategory | string | Public role category when published. |
jobFunction | string | Public role function or function code. |
industry | string | Public role industry or industry code. |
tags | array of strings | Public source tags. |
openings | integer | Number of openings when published as a valid count. |
companyId | string | Public employer identifier. |
companyName | string | Public employer name. |
companyFullName | string | Full employer name when published. |
companyLogo | URL | Public employer logo URL when published. |
companyEmployees | string | Public employee-size text. |
companyType | string | Original public company type text. |
companyTypeEnglish | string | English company type label when recognized. |
companyIndustry | string | Public employer industry. |
companyUrl | URL | Public employer page when published. |
description | string | Cleaned public job description. |
descriptionShort | string | Short public description for compact previews. |
recruiterName | string | Public recruiter name when published. |
recruiterTitle | string | Public recruiter role when published. |
recruiterLabels | array of strings | Public recruiter labels. |
recruiterOnline | boolean | Public recruiter online signal. |
recruiterStatus | string | Public recruiter status. |
applicationDeadlineText | string | Public application deadline text. |
searchQuery | string | Keyword used for the row's search scope. |
searchCity | string | City code used for the row's search scope. |
changeType | string | Monitoring lifecycle event: new, updated, reappeared, unchanged, or expired. |
changedFields | array of strings | Fields that changed since the previous stored observation. |
firstSeenAt | datetime | First successful observation in this monitoring scope. |
lastSeenAt | datetime | Most recent successful observation in this monitoring scope. |
expiredAt | datetime | Time an expiry event was emitted after repeated complete absence. |
🔁 Monitoring
Set monitorMode to changes and keep the same search scope and stateName in a scheduled task. The first complete run emits NEW rows. Later complete runs emit new, updated, and reappeared rows by default.
A missing listing becomes EXPIRED after two consecutive complete scans. It becomes REAPPEARED if it returns later. Blocked, malformed, empty, failed, or truncated scans never advance missing-job expiry state.
Full records suit research exports. Compact records keep stable identity, source dates, salary context, employer identity, and lifecycle fields for feeds and alerts. Webhook delivery is bounded and best effort. A delivery failure does not discard valid rows or monitoring state.
✨ Example recipes
- Shanghai AI engineer jobs: Use the overview view for a native-language AI hiring search.
- Shenzhen foreign-owned company jobs: Use the prospector view for employer research.
- Beijing senior software engineer salaries: Use the salary view for compensation analysis.
💰 Pricing
Pricing is pay per saved result. Empty runs and runs that save no rows cost nothing. There are no subscriptions or maintenance fees.
⭐ Enjoying 51job scraper?
|
⭐ ⭐ ⭐ ⭐ ⭐ Turn repeated job research into a dependable hiring feed. A five-star rating takes a few seconds and helps recruiting teams find this source. Your feedback also guides the next improvements. |
| ★ Rate this Actor on Apify |
❓ FAQ
前程无忧会被拦截吗?
51job can return access challenges to automated clients. The Actor uses tested datacenter routing by default, bounded timeouts, and session rotation after a block. Residential routing with Singapore, Hong Kong, or Japan remains available as an opt-in fallback for larger runs that hit rate limits. If the source remains unavailable, the run fails visibly instead of returning a misleading empty dataset.
Does it collect private phone numbers?
No. The Actor reads public job listing fields only. It does not collect candidate profiles, private phone numbers, resumes, or login-only information.
前程无忧招聘数据有多新?
Each run reads the current public search surface. Rows keep the source issue date, source update date, and collection time separately, so downstream users can measure freshness.
Can it search every 51job role and city?
It supports the public search filters exposed in the input form and exact public search URLs. Search results can change, and access challenges can limit coverage. The run summary reports whether the selected scope completed.
🔄 Migrating from v1
Saved inputs using scrapeMode, searchQuery, jobArea, workYear, degree, outputFormat, or incrementalMode are accepted for one migration window. New tasks should use sourceMode, queries, cities, experience, education, outputMode, and monitorMode.
The v2 output replaces ambiguous aliases such as datePosted, applyUrl, lon, lat, experienceString, and degreeString with explicit source and normalized fields. Missing source values remain absent.
🔗 Other actors
- 💼 iGuopin Jobs Scraper 国聘: China SOE & Campus Jobs ↗: Track public Chinese state-owned enterprise, campus, and graduate roles.
- 💼 ChinaHR Jobs Scraper 中华英才网: China Hiring Data ↗: Collect broad China hiring records from ChinaHR.
- 🇨🇳 eChinaCities Jobs Scraper: English Jobs in China ↗: Find English-language jobs in China with relocation context.
- 🎓 NCSS Jobs Scraper 国家大学生就业: Graduate & Internship Data ↗: Collect graduate and internship opportunities from the national platform.