51job Scraper 前程无忧: China Jobs, Salaries & Hiring Data avatar

51job Scraper 前程无忧: China Jobs, Salaries & Hiring Data

Pricing

from $3.99 / 1,000 jobs

Go to Apify Store
51job Scraper 前程无忧: China Jobs, Salaries & Hiring Data

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. Filter by city, industry, job function, employment type, and posting recency, with webhook notifications for new listings.

Pricing

from $3.99 / 1,000 jobs

Rating

5.0

(1)

Developer

GetAScraper

GetAScraper

Maintained by Community

Actor stats

0

Bookmarked

25

Total users

7

Monthly active users

2 days ago

Last modified

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, a recruiter responsiveness score, and a monitoring mode for recurring hiring change feeds.
China jobs source comparison   •  Zhaopin, 51Job, Liepin, and ChinaHR listings side by side
 Zhaopin
Jobs, salary & hiring-change monitoring
 51job
➤ You are here
 Liepin
White-collar roles & salary data
 ChinaHR
Job titles, salary & employer data
Public 51job listings turned into a hiring dataset with a recruiter responsiveness score
Search 51job (前程无忧) by keyword and city, and get deduplicated jobs with source dates, normalized CNY salary, a 0-100 recruiter responsiveness score derived from the source's own reply and resume-activity signals, 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.
📨 Recruiter responsiveness
A 0-100 score from the source's own reply-recency and resume-activity signals. Filter with `minRecruiterResponsiveness`.
🔔 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

FieldTypeRequiredDescription
sourceModeenumYesChoose generated keyword and city searches or exact public 51job search URLs.
queriesarray of stringsNoKeywords in Chinese or English. Each keyword is combined with every selected city.
citiesarray of stringsNo51job city codes from the input form. Common first-tier cities are included.
startUrlsarray of URLsNoPublic search-result URLs. Detail pages and unrelated hosts are rejected.
experienceenumNoSource work-experience filter, from any experience to senior experience bands.
educationenumNoMinimum education filter from the source search form.
employmentTypestringNoOptional employment-type code copied from a supported public search URL.
companyTypeenumNoCompany structure filter such as private, state-owned, joint venture, foreign-owned, or listed.
companySizeenumNoEmployer headcount range from the source search form.
industriesarray of stringsNoOptional industry codes from a supported public search URL.
jobFunctionsarray of stringsNoOptional job-function codes from a supported public search URL.
salaryBandstringNoOptional salary-band code copied from a supported public search URL.
postedWithinstringNoOptional issue-date code copied from a supported public search URL.
sortBystringNoOptional source sort code.
excludeKeywordsarray of stringsNoRemove rows matching the supplied text in titles, employers, descriptions, industries, functions, or tags.
includeRecruiterSignalsbooleanNoKeep public recruiter name, role, labels, online status, status, and responsiveness fields when available.
minRecruiterResponsivenessintegerNoKeep only jobs whose recruiter responsiveness score meets this minimum (0-100). Leave empty for no filtering.
maxItemsintegerNoGlobal result cap from 1 to 5,000.
maxPagesPerSearchintegerNoPage cap from 1 to 100 for each keyword and city search.
outputModeenumNoChoose full research records or compact workflow rows.
monitorModeenumNoReturn a current snapshot or compare this run with a durable monitoring scope.
stateNamestringNoStable watchlist name for recurring changes mode. Use a distinct name for each schedule.
includeUnchangedbooleanNoInclude unchanged rows in changes mode when a complete comparison is required.
notifyOnNoChangesbooleanNoSend a heartbeat when a complete monitoring run has no selected changes.
proxyConfigurationobjectYesDatacenter routing is the tested default. The Actor automatically retries a blocked request through residential routing.
notificationWebhookUrlstringNoOptional private HTTPS destination for selected monitoring events.
notificationEventsarray of stringsNoSelect 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.

FieldTypeDescription
schemaVersionintegerOutput contract version.
jobIdstringStable 51job listing identifier.
titlestringPublic role title.
jobUrlURLPublic source page for the role.
applicationUrlURLDistinct public application destination when published by the source.
dedupeKeystringStable key used to remove repeated listings.
sourcePlatformstringSource label, currently 51job.
listingUrlURLSearch-result URL that produced the row.
scrapedAtdatetimeTime the Actor collected the row.
sourcePostedAtdatetimeSource issue date when published.
sourceUpdatedAtdatetimeSource update date when published.
daysSincePostednumberAge calculated from the source issue date.
provincestringSource province when published.
citystringSource city when published.
districtstringSource district when published.
locationRawstringOriginal source location text.
addressstringPublic work address when published.
longitudenumberNumeric longitude when published and valid.
latitudenumberNumeric latitude when published and valid.
isRemotebooleanPublic remote-work signal when published.
isInternbooleanPublic internship signal when published.
salaryRawstringOriginal public salary text.
salaryDisclosedbooleanWhether the source salary text produced a reliable range.
salaryNegotiablebooleanWhether the source marks compensation as negotiable.
currencystringCurrency label when a salary value is published, currently CNY.
salaryMinCnynumberMinimum value in the source salary period.
salaryMaxCnynumberMaximum value in the source salary period.
salaryPeriodstringSource salary period, such as daily, monthly, or annual.
salaryMonthsPerYearnumberBonus-month count when the source publishes it.
minSalaryMonthlyCnynumberMonthly equivalent derived from the source range.
maxSalaryMonthlyCnynumberMonthly equivalent derived from the source range.
annualMinCnynumberAnnual equivalent derived from the source range.
annualMaxCnynumberAnnual equivalent derived from the source range.
experienceRawstringOriginal experience requirement.
experienceMinYearsnumberParsed minimum experience when available.
experienceMaxYearsnumberParsed maximum experience when available.
educationRawstringOriginal education requirement.
educationEnglishstringEnglish education label when the source text is recognized.
employmentTypestringPublic employment type when published.
jobCategorystringPublic role category when published.
jobFunctionstringPublic role function or function code.
industrystringPublic role industry or industry code.
tagsarray of stringsPublic source tags.
openingsintegerNumber of openings when published as a valid count.
companyIdstringPublic employer identifier.
companyNamestringPublic employer name.
companyFullNamestringFull employer name when published.
companyLogoURLPublic employer logo URL when published.
companyEmployeesstringPublic employee-size text.
companyTypestringOriginal public company type text.
companyTypeEnglishstringEnglish company type label when recognized.
companyIndustrystringPublic employer industry.
companyUrlURLPublic employer page when published.
descriptionstringCleaned public job description.
descriptionShortstringShort public description for compact previews.
recruiterNamestringPublic recruiter name when published.
recruiterTitlestringPublic recruiter role when published.
recruiterLabelsarray of stringsPublic recruiter labels.
recruiterOnlinebooleanPublic recruiter online signal.
recruiterStatusstringPublic recruiter status.
recruiterLastReplyMinutesAgonumberMinutes since the recruiter's last reply, when published.
recruiterRepliesTodaynumberReplies sent today, when published (source caps the displayed count at 10+).
recruiterRepliesToday10PlusbooleanWhether today's reply count hit the source's display ceiling.
recruiterLastResumeViewMinutesAgonumberMinutes since the recruiter last viewed a resume, when published.
recruiterLastResumeProcessedMinutesAgonumberMinutes since the recruiter last processed a resume, when published.
recruiterResumeViewsThisWeeknumberResumes viewed this week, when published.
recruiterResumesProcessedThisWeeknumberResumes processed this week, when published.
recruiterResponsivenessScorenumber0-100 score derived from the fields above; higher means a more recently or frequently responsive recruiter.
applicationDeadlineTextstringPublic application deadline text.
searchQuerystringKeyword used for the row's search scope.
searchCitystringCity code used for the row's search scope.
changeTypestringMonitoring lifecycle event: new, updated, reappeared, unchanged, or expired.
changedFieldsarray of stringsFields that changed since the previous stored observation.
firstSeenAtdatetimeFirst successful observation in this monitoring scope.
lastSeenAtdatetimeMost recent successful observation in this monitoring scope.
expiredAtdatetimeTime 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

💰 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, then automatically retries the next request through residential routing (Singapore) if the block persists. A run with multiple keyword and city searches keeps the jobs already collected from other searches even if one search is blocked outright; the run summary reports which search, if any, was affected.

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.

How is the recruiter responsiveness score calculated?

51job publishes recruiter-activity labels on many listings, such as a reply sent a few minutes ago, a reply count for today, or a resume viewed or processed recently. The Actor parses these into structured fields and a single 0-100 score, weighted toward the most recent reply signal. A listing with no published activity label gets a null score rather than a guessed value.

🔄 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