51job China Jobs Scraper: Aliyun WAF Bypass & Bilingual Fields
Pricing
from $3.99 / 1,000 jobs
51job China Jobs Scraper: Aliyun WAF Bypass & Bilingual Fields
China's leading 51job (前程无忧) job board scraper. Extracts detailed job listings, salaries, experience/degree requirements, company type, size, and HR contact coordinates. Bypasses Aliyun WAF, normalizes salary currencies, and translates fields to English. $3.99 per 1,000 results.
Pricing
from $3.99 / 1,000 jobs
Rating
0.0
(0)
Developer
GetAScraper
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
31 minutes ago
Last modified
Categories
Share
Get live China tech and corporate job listings: normalized JPY/CNY salary bands, degree requirements, company structures, and HR response times. Ready for your spreadsheet in under 60 seconds.
51job (前程无忧, 51job.com) is one of China's largest job boards. This Scraper extracts detailed job listings, salaries, experience requirements, and recruiter response rates directly from Aliyun WAF-protected single-page app endpoints. No complex setups. No API keys.
What does 51job China Jobs Scraper do?
The Actor extracts structured corporate and startup jobs from 51job and saves them to the Apify dataset. It provides 5 massive competitive advantages:
- Automated Aliyun WAF Bypass: Built specifically on Playwright to clear the dynamic Alibaba cookie challenge. Paired with residential proxies, it operates completely unblocked.
- Normalized Salaries (CNY): Parses complex Chinese salary formats (e.g. 1.5万-2.5万 or 30万-50万) into standardized monthly minimum and maximum integers in CNY (
minSalaryMonthlyCnyandmaxSalaryMonthlyCny). - Bilingual Translations: Mapped educational and corporate categories into standard English. Field groupings like
本科➔"Bachelor's",大专➔"Associate's",民营➔"Private Enterprise", and国企➔"State-Owned Enterprise"are returned as clean English strings. - Zero-Maintenance API Interception: Intercepts 51job's backend JSON search payload directly. No brittle CSS selectors: you capture the exact 40+ fields (including geographic coordinates, HR response times, company logos, and active hiring tags) natively.
- Cost Efficiency: Flat pay-per-result pricing with no hidden monthly fees.
Who is this for
- I am a global recruiter looking to build or backfill China-specific talent pools for my international B2B clients. I need clean English translations for degree levels and company types ready to feed my ATS.
- I am an investment analyst tracking corporate hiring velocities and salary inflation inside Chinese tech hubs. I need normalized monthly CNY salary bands to run bulk regressions.
- I am a database administrator syncing international job boards. I need a stable JSON feed with coordinates and company metadata to map locations accurately.
- I am an HR tech product manager building a competitor research tool. I need structured, deduplicated listings with direct application links.
How to use
- Configure Search: Set search query keywords (e.g.
pythonorAI), area codes (e.g.020000for Shanghai), required experience, degree, or company type. - Set limits: Specify the maximum number of job records to extract.
- Execute Run: Click the Start button. The browser will clear the challenge and collect results.
- Download: Export your dataset as CSV, Excel, XML, or JSON.
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
scrapeMode | String | Yes | "search" | "search" maps the form filters. "urls" uses direct search board URLs in startUrls. |
searchQuery | String | No | "python" | Search keyword (e.g. python, AI, 销售). |
jobArea | String | No | "000000" | Mapped area codes (e.g. Shanghai = 020000, Beijing = 010000, Shenzhen = 040000). |
workYear | String | No | "all" | Required experience years: 0 (No exp), 1 (Intern), 2 (1-2 yrs), 3 (3-4 yrs), 4 (5-10 yrs), 5 (10+ yrs). |
degree | String | No | "all" | Required degree: 1 (Associate's), 2 (Bachelor's), 3 (Master's), 4 (PhD). |
companyType | String | No | "all" | Company type: 01 (Private), 02 (State-Owned), 03 (Joint Venture), 04 (Foreign-invested), 05 (Listed). |
companySize | String | No | "all" | Employee headcount: 01 (0-50), 02 (50-150), 03 (150-500), 04 (500-1000), 05 (1000-5000), 06 (5000+). |
startUrls | Array | No | [] | Direct search result URLs from we.51job.com/pc/search?... when scrapeMode is urls. |
outputFormat | String | No | "flat" | "flat" (one row per job) or "normalized" (separate tables for jobs and companies linked by foreign key). |
maxItems | Integer | No | 50 | Maximum number of job records to extract. |
proxyConfiguration | Object | Yes | {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"SG"} | Residential proxy. Singapore (SG), Hong Kong (HK), or Japan (JP) are recommended for speed. |
Output
Every record outputs with the canonical listing URL and company metadata.
Example row
{"jobId": "154242431","jobUrl": "https://jobs.51job.com/wuhan-wcq/154242431.html","applyUrl": "https://jobs.51job.com/wuhan-wcq/154242431.html#apply","dedupeKey": "51job:project:154242431","title": "法国奢侈品zilli 高级导购","datePosted": "2026-06-02T15:48:43.000Z","daysSincePosted": 6,"jobAreaString": "武汉·武昌区","jobLocation": {"province": "湖北省","city": "武汉","district": "武昌区"},"lon": "114.345175","lat": "30.563347","isRemote": false,"isIntern": false,"salaryDisclosed": true,"salaryString": "5千-1万","salaryRangeCny": {"min": 5000,"max": 10000,"period": "monthly"},"minSalaryMonthlyCny": 5000,"maxSalaryMonthlyCny": 10000,"experienceString": "2年","experienceMinYears": 2,"degreeString": "大专","degreeEnglish": "Associate's","jobDescribe": "1、根据公司服务标准,向顾客介绍、展示商品。2、负责销售区域卫生...","company": {"companyId": "BGUAZFE0UW8GZANpVTU","name": "北京金方同瑞贸易有限责任公司","logo": "https://img04.51jobcdn.com/...","employees": "150-500人","type": "民营","typeEnglish": "Private Enterprise","industry": "批发/零售","url": "https://jobs.51job.com/all/coBGUAZFE0UW8GZANpVTU.html"},"scrapedAt": "2026-06-08T..."}
You can download the dataset in JSON, HTML, CSV, or Excel from the Apify Console dataset tab.
Data table
| Field | Type | Description |
|---|---|---|
jobId | string | 51job's primary numeric job ID |
jobUrl | string | Canonical detailed job listing URL |
applyUrl | string | Direct apply link |
dedupeKey | string | Stable hash for duplicate filtering |
title | string | Job title |
datePosted | string | ISO 8601 posting date |
daysSincePosted | integer | Computed: days since datePosted |
jobAreaString | string | Formatted Chinese region string (e.g. "武汉·武昌区") |
jobLocation | object | Structured: province, city, district |
lon / lat | string | Geographic coordinates for mapping |
isRemote | boolean | Is remote work supported |
isIntern | boolean | Is this an internship position |
salaryString | string | Original Chinese salary range (e.g. "5千-1万") |
minSalaryMonthlyCny | number | Computed: normalized minimum monthly salary in CNY (¥) |
maxSalaryMonthlyCny | number | Computed: normalized maximum monthly salary in CNY (¥) |
experienceString | string | Experience text requirement (e.g. "2年") |
experienceMinYears | number | Normalized years of experience |
degreeString | string | Chinese degree requirement (e.g. "大专") |
degreeEnglish | string | English degree mapping: "Associate's", "Bachelor's", "Master's", "PhD", "All Degrees" |
company.name | string | Company name |
company.typeEnglish | string | English company type: "Private Enterprise", "State-Owned Enterprise", "Wholly Foreign-Owned", "Sino-Foreign Joint Venture", "Listed Company" |
jobDescribe | string | Complete, clean job description |
scrapedAt | string | ISO 8601 scraping timestamp |
API quickstart
Curl
curl --request POST \--url "https://api.apify.com/v2/acts/getascraper~51job-scraper/runs?token=YOUR_API_TOKEN" \--header 'Content-Type: application/json' \--data '{"searchQuery": "python","maxItems": 50,"jobArea": "000000"}'
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_API_TOKEN')run = client.actor('getascraper/51job-scraper').call(run_input={'searchQuery': 'python','maxItems': 50,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item)
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('getascraper/51job-scraper').call({searchQuery: 'python',maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Pricing
Pay-per-result and billed per row successfully saved to your dataset. Empty runs and blocked requests cost exactly $0.00.
- Rate: $3.99 per 1,000 results ($0.00399 per result)
- 100 listings typically cost $0.40
- 1,000 listings cost exactly $3.99
- 10,000 listings cost exactly $39.90
- No fixed monthly subscriptions or hidden maintenance fees
Your Apify subscription tier applies an automatic volume discount on top of the per-result rate.
FAQ
Does it get blocked?
China's leading job platforms utilize aggressive Aliyun WAF firewalls that instantly drop standard datacenter requests. Setting proxyConfiguration to use Singapore (SG) or Hong Kong (HK) residential proxies guarantees stable, unblocked runs.
Does it extract recruiter phone numbers?
The scraper only extracts publicly visible contact details, including headquarters addresses, official websites, and representative names displayed on the company outline page. It does not bypass login walls or click-walls for private personal contact information.
How fresh is the data?
Every run crawls 51job.com live, ensuring you receive the exact, real-time vacancies currently open. There are no stale databases or cached layers. Each row contains a scrapedAt ISO 8601 timestamp.
Legal compliance
This Actor only extracts data that is publicly visible on 51job.com. Users must comply with local privacy regulations and the platform's terms of service. 51job is a trademark of KE Holdings Inc. This is an independent scraping tool and is not affiliated with, endorsed by, or sponsored by KE Holdings.
Support
Open an issue on the Issues tab for bugs, feature requests, or layout additions. We respond within 48 hours.