51job Scraper
Pricing
from $0.11 / 1,000 job posting saveds
51job Scraper
Scrape 51job jobs with salary, company, location, requirements, descriptions, tags, and URLs for China hiring intelligence.
Pricing
from $0.11 / 1,000 job posting saveds
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Extract public job postings from 51job (前程无忧) for China recruiting, staffing, HR-tech, and labor-market analysis workflows.
The actor searches we.51job.com, captures the public job-search response, and saves structured job records with company, salary, location, requirements, tags, descriptions, recruiter signals, and source URLs.
What does 51job Scraper do?
51job Scraper turns 51job search pages into a clean Apify dataset.
It can:
- 🔎 Search 51job by keyword.
- 🌏 Limit results to a 51job area code such as Shanghai or nationwide.
- 🧾 Extract job titles, employers, salaries, locations, and requirements.
- 🧩 Include long job descriptions when available.
- 🏢 Capture company size, company type, and company industry.
- 📍 Save province, city, district, and coordinates when 51job returns them.
- 🔗 Keep job and company URLs for verification or enrichment.
Who is it for?
Recruiters use it to monitor competing employers and active hiring signals.
Staffing agencies use it to build lead lists and identify companies with urgent demand.
HR-tech teams use it to power job-market dashboards, compensation studies, and talent-supply workflows.
Labor-market analysts use it to track demand by city, function, industry, and job family across China.
Why use this actor?
51job is a major China job-board source, but the modern search page is a dynamic SPA with anti-bot challenge behavior. This actor uses a browser session and captures the site's public search JSON after the page loads.
You get a dataset that is ready for spreadsheets, BI tools, CRMs, or downstream enrichment.
Typical use cases
- Track salary ranges for a role in Shanghai, Beijing, Guangzhou, or Shenzhen.
- Monitor which companies are hiring for a keyword such as
python,数据分析, or销售. - Build recruiter lead lists from companies posting new jobs.
- Compare demand by city or job function.
- Feed a labor-market dashboard with current postings.
- Collect job descriptions for skill-frequency analysis.
Input options
The actor supports two ways to define searches.
Use keywords for simple searches.
Use startUrls when you copied a search URL from 51job and want the actor to parse its query parameters.
Keywords
Add one or more search terms in the keywords field.
Examples:
python数据分析销售Java项目经理
Each keyword creates a separate search target.
Job area codes
Use jobArea to target a 51job region.
Common examples:
000000— nationwide010000— Beijing020000— Shanghai030200— Guangzhou040000— Shenzhen
If you are unsure, copy a 51job search URL into startUrls; the actor will parse the area code from the URL when present.
Limits and pagination
maxItems controls the total number of job records saved.
maxPages controls how many search pages are loaded for each keyword or start URL.
pageSize controls how many records 51job should return per page.
Start small, verify the dataset, and then increase limits for monitoring jobs.
Output data
Each dataset item represents one public 51job job posting.
The actor saves practical fields for analysis and verification.
Output table
| Field | Description |
|---|---|
jobId | 51job job identifier |
jobName | Job title |
companyName | Display company name |
fullCompanyName | Full legal/display company name when available |
salary | Salary text from 51job |
salaryMin / salaryMax | Parsed salary bounds when provided by 51job |
location | Human-readable job location |
province, city, district | Location breakdown |
workYear | Experience requirement |
degree | Education requirement |
jobType | Full-time, part-time, internship, etc. |
industry | Job industry |
companyType | Company ownership/type |
companySize | Company size bucket |
issueDate | Posting date/time |
updateDateTime | Last update timestamp |
jobTags | Skills, benefits, and requirement tags |
jobDescription | Long job description when enabled |
jobUrl | Public job URL |
companyUrl | Public company URL |
searchKeyword | Keyword that produced the item |
sourceUrl | 51job search URL used for the page |
scrapedAt | Actor scrape timestamp |
Example input
{"keywords": ["python"],"jobArea": "020000","maxItems": 50,"maxPages": 3,"pageSize": 20,"includeDescriptions": true}
Example output
{"jobId": "172765694","jobName": "中级大数据开发工程师","companyName": "上海海隆软件","salary": "1-1.6万","location": "上海·徐汇区","workYear": "3年及以上","degree": "本科","jobTags": ["sql", "报表", "五险一金"],"jobUrl": "https://jobs.51job.com/shanghai-xhq/172765694.html","searchKeyword": "python"}
How much does it cost to scrape 51job jobs?
This actor uses pay-per-event pricing.
You pay a small run start fee plus a per-job fee for each job posting saved to the dataset.
The final price shown on Apify is authoritative. Use low maxItems values for test runs, then scale after you confirm the dataset shape.
How to run it
- Open the actor on Apify.
- Add one or more keywords.
- Choose a 51job area code or leave
000000for nationwide. - Set
maxItemsto a small number for your first run. - Start the actor.
- Download the dataset as JSON, CSV, Excel, or via API.
Tips for better results
Use Chinese role names when your workflow is China-focused.
Use city-specific area codes for local compensation research.
Disable includeDescriptions if you only need high-level listing fields and want smaller dataset rows.
Use multiple short runs for recurring monitoring rather than one very large exploratory run.
Integrations
Send the dataset to Google Sheets for recruiter review.
Load the JSON into a data warehouse for trend analysis.
Push company URLs into an enrichment workflow.
Use Apify webhooks to trigger a Slack alert when a search finishes.
Use the Apify API to schedule recurring searches for the same keywords.
API usage
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/51job-scraper').call({keywords: ['python'],jobArea: '020000',maxItems: 50});console.log(run.defaultDatasetId);
Python
from apify_client import ApifyClientclient = ApifyClient(token='YOUR_APIFY_TOKEN')run = client.actor('automation-lab/51job-scraper').call(run_input={'keywords': ['python'],'jobArea': '020000','maxItems': 50,})print(run['defaultDatasetId'])
cURL
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~51job-scraper/runs?token=YOUR_APIFY_TOKEN' \-H 'Content-Type: application/json' \-d '{"keywords":["python"],"jobArea":"020000","maxItems":50}'
MCP usage
Use this actor from Claude Desktop or Claude Code through Apify MCP.
MCP tool URL:
https://mcp.apify.com/?tools=automation-lab/51job-scraper
Claude Code setup:
$claude mcp add apify https://mcp.apify.com/?tools=automation-lab/51job-scraper
Claude Desktop JSON setup:
{"mcpServers": {"apify-51job": {"url": "https://mcp.apify.com/?tools=automation-lab/51job-scraper"}}}
Example prompts:
- "Run 51job Scraper for python jobs in Shanghai and summarize top employers."
- "Extract 100 data analyst jobs from 51job nationwide and group them by salary range."
- "Monitor 51job postings for sales roles in Guangzhou and list companies hiring this week."
Data quality notes
The actor returns fields made public by 51job's search page.
Some postings may omit salary, recruiter activity, exact district, or long descriptions.
Salary parsing depends on fields returned by 51job; always keep the original salary text for auditability.
Troubleshooting
If a run returns zero items, check that the keyword has active postings on 51job.
If a city returns fewer jobs than expected, verify the jobArea code or use a copied startUrls value from the 51job UI.
If 51job changes its anti-bot or API behavior, the actor may need a maintenance update.
Legality and ethical use
This actor extracts public job-search data. Use it responsibly, respect applicable laws, and avoid collecting or using data in ways that violate privacy, employment, or platform rules.
Do not use the data for spam, harassment, discriminatory profiling, or unauthorized credentialed access.
Related scrapers
You may also want these automation-lab actors:
- https://apify.com/automation-lab/google-news-scraper
- https://apify.com/automation-lab/linktree-profile-scraper
- https://apify.com/automation-lab/website-contact-finder
FAQ
Can I scrape nationwide jobs?
Yes. Set jobArea to 000000.
Can I use a 51job URL instead of keywords?
Yes. Add the URL to startUrls. The actor parses supported query parameters.
Does the actor need a 51job account?
No. It uses public search pages and public search responses.
Does it scrape applicant resumes?
No. It only extracts public job posting data.
Can I monitor jobs every day?
Yes. Create an Apify task with the same input and schedule it.
Why are some fields missing?
51job does not return every field for every posting. Missing optional fields are omitted from the dataset item.
Changelog
0.1— Initial private build with keyword/search URL inputs and public job-posting extraction.