job-scraper

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Job Scraper

职位抓取工具

Search for job postings across LinkedIn and Indeed using Apify. Find open roles by keyword, location, company, or job type. Use for hiring signal detection, GTM research, or competitive intelligence.
No LinkedIn cookies. No Indeed login. Just search queries in, structured job data out.
通过Apify跨LinkedIn和Indeed搜索职位发布信息。可按关键词、地点、公司或职位类型寻找空缺职位,用于招聘信号检测、GTM调研或竞品情报分析。
无需LinkedIn Cookie,无需Indeed登录,只需输入搜索查询,即可输出结构化职位数据。

When to Auto-Load

自动加载时机

Load this skill when:
  • User says "find jobs", "who is hiring", "what roles is [company] hiring for"
  • User wants hiring signals ("find companies growing their AI team")
  • User wants competitive intelligence ("what is [competitor] hiring for")
  • User says "job search", "open roles", "job listings", "job postings"
在以下场景加载该技能:
  • 用户提及“找工作”“哪家公司在招人”“[某公司]在招聘哪些岗位”
  • 用户需要招聘信号(如“寻找正在扩充AI团队的公司”)
  • 用户需要竞品情报(如“[竞争对手]在招聘什么岗位”)
  • 用户提及“职位搜索”“空缺岗位”“职位列表”“职位发布”

Prerequisites

前提条件

Apify API Token

Apify API令牌

Required for both LinkedIn and Indeed scraping. Set in
.env
:
APIFY_API_TOKEN=your_token_here
No LinkedIn cookies, Indeed login, or any platform credentials needed. That's the only setup.

LinkedIn和Indeed抓取均需此令牌。在
.env
文件中配置:
APIFY_API_TOKEN=your_token_here
无需LinkedIn Cookie、Indeed登录或任何平台凭据,仅需完成上述配置即可。

Sources

数据源

This skill searches two job platforms via Apify actors:
SourceApify ActorBest ForCost
LinkedIn
automation-lab/linkedin-jobs-scraper
B2B, tech, SaaS, enterprise roles. Has seniority level, job function, industries.~$0.002/job
Indeed
borderline/indeed-scraper
Broadest coverage. Richest data — salary, company details, ratings, contacts, street addresses.~$0.004/job
该技能通过Apify执行器搜索两个招聘平台:
来源Apify执行器最适用场景成本
LinkedIn
automation-lab/linkedin-jobs-scraper
B2B、科技、SaaS、企业级岗位。包含职级、职位职能、行业信息。~$0.002/职位
Indeed
borderline/indeed-scraper
覆盖范围最广。数据最丰富——薪资、公司详情、评分、联系人、街道地址。~$0.004/职位

Source Selection Logic

数据源选择逻辑

Do NOT ask the user which source to use unless genuinely ambiguous. Decide based on context:
  1. User specifies a source → use that source only.
  2. Context strongly suggests one source:
    • B2B/tech/SaaS roles, enterprise companies, seniority-level filtering → LinkedIn
    • Hourly/blue-collar roles, local/retail jobs, salary-focused search → Indeed
    • Company hiring research ("what is Stripe hiring for") → LinkedIn (better company filtering)
  3. No clear signal → search both sources, deduplicate results by job title + company name, present combined results.
After deciding, tell the user which source(s) you're searching and why. Don't ask — inform.

除非确实存在歧义,否则不要询问用户选择哪个数据源,根据上下文自行判断:
  1. 用户指定数据源 → 仅使用该数据源。
  2. 上下文强烈指向某一数据源
    • B2B/科技/SaaS岗位、企业公司、职级筛选 → LinkedIn
    • 小时工/蓝领岗位、本地/零售职位、侧重薪资的搜索 → Indeed
    • 公司招聘调研(如“Stripe在招聘什么岗位”) → LinkedIn(公司筛选功能更优)
  3. 无明确信号 → 同时搜索两个数据源,按职位名称+公司名称去重后展示合并结果。
确定数据源后,告知用户你将使用哪些数据源及原因,无需询问,直接说明。

Workflow

工作流程

Phase 0: Understand the Request

阶段0:理解请求

Extract from the user's message:
  • Search term — job title, role, or keyword (required)
  • Location — city, state, country, or "Remote" (optional)
  • Company — specific company name (optional)
  • Recency — "recent", "last week", "last 30 days" (optional)
  • Job type — fulltime, parttime, contract, internship (optional)
  • Remote — whether to filter for remote jobs (optional)
  • Result count — how many results they want (default: 25)
If anything is ambiguous, pick reasonable defaults and tell the user what you chose. Do not ask clarifying questions for things you can reasonably infer.
从用户消息中提取以下信息:
  • 搜索词 — 职位名称、岗位或关键词(必填)
  • 地点 — 城市、州、国家或“Remote(远程)”(可选)
  • 公司 — 特定公司名称(可选)
  • 时效性 — “近期”“上周”“过去30天”(可选)
  • 职位类型 — 全职、兼职、合同工、实习(可选)
  • 远程属性 — 是否筛选远程职位(可选)
  • 结果数量 — 用户需要的结果数(默认:25条)
若存在歧义,选择合理默认值并告知用户你的选择。对于可合理推断的内容,无需询问用户澄清。

Phase 1: Search

阶段1:搜索

LinkedIn —
automation-lab/linkedin-jobs-scraper

LinkedIn —
automation-lab/linkedin-jobs-scraper

API call:
bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~linkedin-jobs-scraper/runs?token=$APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQuery": "AI engineer",
    "location": "San Francisco",
    "maxItems": 25
  }'
Input fields:
FieldTypeDescription
searchQuery
stringJob title or keywords (required)
location
stringCity, state, or country (optional)
maxItems
integerMax jobs to return (default: 50)
Polling for results:
bash
undefined
API调用:
bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~linkedin-jobs-scraper/runs?token=$APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQuery": "AI engineer",
    "location": "San Francisco",
    "maxItems": 25
  }'
输入字段:
字段类型描述
searchQuery
字符串职位名称或关键词(必填)
location
字符串城市、州或国家(可选)
maxItems
整数返回的最大职位数(默认:50)
轮询获取结果:
bash
undefined

Check run status (poll every 10s)

检查运行状态(每10秒轮询一次)

When status is SUCCEEDED, fetch results

状态为SUCCEEDED时,获取结果


**Output fields per job:**
- `title` — Job title
- `companyName` — Company name
- `companyLinkedinUrl` — Company LinkedIn page
- `companyLogo` — Logo URL
- `location` — City, state
- `salary` — Salary text (when available)
- `employmentType` — Full-time, Part-time, Contract, etc.
- `seniorityLevel` — Entry, Mid-Senior, Director, Executive, etc.
- `jobFunction` — Engineering, Sales, Marketing, etc.
- `industries` — Industry classification
- `descriptionText` — Full job description (plain text)
- `descriptionHtml` — Full job description (HTML)
- `applicantsCount` — Number of applicants
- `postedAt` — When posted (e.g., "6 days ago")
- `url` — Direct link to the LinkedIn job posting
- `applyUrl` — Direct apply URL

**每个职位的输出字段:**
- `title` — 职位名称
- `companyName` — 公司名称
- `companyLinkedinUrl` — 公司LinkedIn页面
- `companyLogo` — Logo链接
- `location` — 城市、州
- `salary` — 薪资文本(如有)
- `employmentType` — 全职、兼职、合同工等
- `seniorityLevel` — 初级、中高级、主管、高管等
- `jobFunction` — 工程、销售、营销等
- `industries` — 行业分类
- `descriptionText` — 完整职位描述(纯文本)
- `descriptionHtml` — 完整职位描述(HTML格式)
- `applicantsCount` — 申请人数量
- `postedAt` — 发布时间(如“6天前”)
- `url` — LinkedIn职位发布直接链接
- `applyUrl` — 直接申请链接

Indeed —
borderline/indeed-scraper

Indeed —
borderline/indeed-scraper

API call:
bash
curl -X POST "https://api.apify.com/v2/acts/borderline~indeed-scraper/runs?token=$APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "AI engineer",
    "location": "San Francisco, CA",
    "country": "us",
    "maxResults": 25
  }'
Input fields:
FieldTypeDescription
query
stringJob title or keywords (required)
location
stringCity and state (optional)
country
stringLowercase 2-letter country code (required). Common:
us
,
uk
,
ca
,
de
,
fr
,
in
,
au
maxResults
integerMax jobs to return
Important: The
country
field is required for Indeed. If the user doesn't specify a country, default to
us
. Use lowercase 2-letter codes only.
Output fields per job:
  • title
    — Job title
  • companyName
    — Company name
  • companyDescription
    — Company description
  • companyNumEmployees
    — Company size
  • companyRevenue
    — Company revenue range
  • companyUrl
    — Company Indeed page
  • location
    — Object with
    city
    ,
    postalCode
    ,
    country
    ,
    formattedAddressShort
    ,
    latitude
    ,
    longitude
    ,
    streetAddress
  • salary
    — Object with
    salaryCurrency
    ,
    salaryMin
    ,
    salaryMax
    ,
    salaryText
    ,
    salaryType
    (hourly/yearly)
  • descriptionText
    — Full job description (plain text)
  • descriptionHtml
    — Full job description (HTML)
  • datePublished
    — Posted date (YYYY-MM-DD)
  • age
    — Human-readable age ("24 days ago")
  • expired
    — Whether job is still active
  • isRemote
    — Remote flag
  • jobType
    — Employment type
  • jobUrl
    — Direct Indeed job URL
  • applyUrl
    — Direct apply URL
  • rating
    — Company rating and review count
  • emails
    — Contact emails (when available)
  • attributes
    — Job attributes list (benefits, requirements, etc.)
  • hiringDemand
    — Urgent hire / high volume hiring flags
API调用:
bash
curl -X POST "https://api.apify.com/v2/acts/borderline~indeed-scraper/runs?token=$APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "AI engineer",
    "location": "San Francisco, CA",
    "country": "us",
    "maxResults": 25
  }'
输入字段:
字段类型描述
query
字符串职位名称或关键词(必填)
location
字符串城市和州(可选)
country
字符串小写两位国家代码(必填)。常见值:
us
,
uk
,
ca
,
de
,
fr
,
in
,
au
maxResults
整数返回的最大职位数
注意: Indeed的
country
字段为必填项。若用户未指定国家,默认设为
us
,仅使用小写两位代码。
每个职位的输出字段:
  • title
    — 职位名称
  • companyName
    — 公司名称
  • companyDescription
    — 公司描述
  • companyNumEmployees
    — 公司规模
  • companyRevenue
    — 公司收入范围
  • companyUrl
    — 公司Indeed页面
  • location
    — 包含
    city
    postalCode
    country
    formattedAddressShort
    latitude
    longitude
    streetAddress
    的对象
  • salary
    — 包含
    salaryCurrency
    salaryMin
    salaryMax
    salaryText
    salaryType
    (时薪/年薪)的对象
  • descriptionText
    — 完整职位描述(纯文本)
  • descriptionHtml
    — 完整职位描述(HTML格式)
  • datePublished
    — 发布日期(YYYY-MM-DD)
  • age
    — 易读格式的发布时长(如“24天前”)
  • expired
    — 职位是否仍有效
  • isRemote
    — 远程职位标识
  • jobType
    — 雇佣类型
  • jobUrl
    — Indeed职位直接链接
  • applyUrl
    — 直接申请链接
  • rating
    — 公司评分及评论数
  • emails
    — 联系邮箱(如有)
  • attributes
    — 职位属性列表(福利、要求等)
  • hiringDemand
    — 紧急招聘/大量招聘标识

Phase 2: Filter & Deduplicate

阶段2:过滤与去重

Recency Filtering

时效性过滤

If the user asked for recent jobs, filter results by date:
  • LinkedIn: Use
    postedAt
    field (e.g., "6 days ago") — parse the text to determine recency.
  • Indeed: Use
    datePublished
    field (YYYY-MM-DD) — compare against today's date.
Remove jobs older than what the user requested. If no recency filter specified, still remove jobs older than 30 days by default to avoid stale data.
若用户要求近期职位,按日期过滤结果:
  • LinkedIn: 使用
    postedAt
    字段(如“6天前”)——解析文本判断时效性。
  • Indeed: 使用
    datePublished
    字段(YYYY-MM-DD)——与当前日期对比。
移除早于用户要求的职位。若未指定时效性过滤,默认移除发布超过30天的职位,避免数据过时。

Deduplication (when using both sources)

去重(同时使用两个数据源时)

When searching both LinkedIn and Indeed, the same job may appear on both platforms. Deduplicate by matching:
  1. Normalize company name (lowercase, strip "Inc", "LLC", "Corp", etc.)
  2. Normalize job title (lowercase)
  3. If company name AND job title match, keep the result with richer data (prefer Indeed for salary data, LinkedIn for seniority level)
同时搜索LinkedIn和Indeed时,同一职位可能出现在两个平台。通过以下规则去重:
  1. 标准化公司名称(小写,去除“Inc”“LLC”“Corp”等后缀)
  2. 标准化职位名称(小写)
  3. 若公司名称和职位名称均匹配,保留数据更丰富的结果(薪资数据优先选Indeed,职级信息优先选LinkedIn)

Phase 3: Present Results

阶段3:展示结果

Show results as a summary table:
Source: LinkedIn + Indeed (deduplicated)
Jobs found: {count}
Location: {location}
Search: "{query}"

| # | Title | Company | Location | Salary | Posted | Source |
|---|-------|---------|----------|--------|--------|--------|
| 1 | AI Engineer | Stripe | SF, CA | $200K-$300K | 3 days ago | LinkedIn |
| 2 | ML Engineer | Meta | Menlo Park, CA | $58.65/hr | Mar 14 | Indeed |
| ... |
After the table:
  • Note how many were filtered for recency
  • Note how many duplicates were removed
  • Provide the total cost of the search
If the user wants more detail on a specific job, show the full description.
以汇总表格形式展示结果:
数据源:LinkedIn + Indeed(已去重)
找到职位数:{count}
地点:{location}
搜索词:"{query}"

| 序号 | 职位名称 | 公司 | 地点 | 薪资 | 发布时间 | 数据源 |
|---|-------|---------|----------|--------|--------|--------|
| 1 | AI工程师 | Stripe | 旧金山,加州 | $200K-$300K | 3天前 | LinkedIn |
| 2 | ML工程师 | Meta | 门洛帕克,加州 | $58.65/小时 | 3月14日 | Indeed |
| ... |
表格之后:
  • 注明因时效性过滤的职位数量
  • 注明移除的重复职位数量
  • 提供本次搜索的总成本
若用户需要某一职位的详细信息,展示完整职位描述。

Phase 4: Export (Optional)

阶段4:导出(可选)

If the user wants to save results:
{search-term}-jobs-{YYYY-MM-DD}.csv
CSV columns:
title, company, location, salary, employment_type, seniority_level, posted_date, job_url, apply_url, description, source
Normalize fields across sources so the CSV has a consistent schema regardless of whether the job came from LinkedIn or Indeed.

若用户需要保存结果,导出为:
{search-term}-jobs-{YYYY-MM-DD}.csv
CSV列:
title, company, location, salary, employment_type, seniority_level, posted_date, job_url, apply_url, description, source
标准化不同数据源的字段,确保无论职位来自LinkedIn还是Indeed,CSV都具有一致的 schema。

Cost Estimates

成本估算

SearchLinkedIn OnlyIndeed OnlyBoth Sources
25 jobs~$0.05~$0.10~$0.15
50 jobs~$0.10~$0.20~$0.30
100 jobs~$0.20~$0.40~$0.60
LinkedIn is cheaper per job. Indeed returns richer data per job. Both together give the most complete picture.

搜索规模仅LinkedIn仅Indeed同时使用两个数据源
25个职位~$0.05~$0.10~$0.15
50个职位~$0.10~$0.20~$0.30
100个职位~$0.20~$0.40~$0.60
LinkedIn单个职位成本更低,Indeed单个职位返回的数据更丰富,同时使用两者可获得最完整的信息。

Common Use Cases

常见使用场景

Hiring signal detection: "Find companies hiring AI engineers in SF" → Search both sources, group by company, rank by number of open roles. Companies with 5+ AI roles are actively building.
Competitive intelligence: "What is Anthropic hiring for?" → Search LinkedIn with
searchQuery: "Anthropic"
. Shows their open roles, team growth, and strategic priorities.
Salary research: "What do ML engineers make in NYC?" → Search Indeed (richer salary data). Filter to NYC, aggregate salary ranges.
GTM prospecting: "Find companies hiring for VP of Sales" → These companies are scaling their sales org and may need sales tools. Export the company list for outreach.

招聘信号检测: “寻找旧金山招聘AI工程师的公司” → 同时搜索两个数据源,按公司分组,按空缺职位数量排序。拥有5个以上AI岗位的公司正在积极扩张团队。
竞品情报分析: “Anthropic在招聘什么岗位?” → 在LinkedIn上以
searchQuery: "Anthropic"
搜索,查看其空缺岗位、团队增长情况和战略优先级。
薪资调研: “纽约的ML工程师薪资水平如何?” → 搜索Indeed(薪资数据更丰富),筛选纽约地区,汇总薪资范围。
GTM潜在客户开发: “寻找招聘销售副总裁的公司” → 这些公司正在扩张销售团队,可能需要销售工具。导出公司列表用于客户触达。

Error Handling

错误处理

ErrorFix
APIFY_API_TOKEN
not set
Ask user to add it to
.env
Indeed:
Missing country input
Add
country
field with lowercase 2-letter code (default:
us
)
LinkedIn: 0 resultsBroaden search query or remove location filter
Indeed: 999 results returnedThe
maxResults
field may not cap results. Filter client-side.
Apify run fails or times outRetry once. If still fails, try the other source.
Stale results (30+ days old)Apply recency filter. Warn user about data freshness.
错误修复方案
APIFY_API_TOKEN
未配置
要求用户将其添加到
.env
文件
Indeed:
Missing country input
添加
country
字段,使用小写两位国家代码(默认:
us
LinkedIn:返回0条结果放宽搜索词或移除地点筛选
Indeed:返回999条结果
maxResults
字段可能无法限制结果,在客户端进行过滤
Apify运行失败或超时重试一次。若仍失败,尝试使用另一个数据源
结果过时(发布超过30天)应用时效性过滤,提醒用户数据新鲜度问题