关于 job-scraper
job-scraper 是通过 Apify 搜索 LinkedIn 和 Indeed 招聘信息的技能,适用于求职信息检索、招聘趋势分析和竞争研究。它整理结构化职位数据,可按条件筛选、去重并导出 CSV。
主要功能
- 01搜索 LinkedIn 和 Indeed 职位
- 02按关键词、地点和公司检索
- 03筛选职位日期和类型
- 04合并去重并整理结果
- 05将职位结果导出为 CSV
适用场景
- 01发现企业招聘增长信号
- 02研究竞争对手的招聘岗位
- 03比较特定地区的薪资信息
- 04寻找潜在销售拓展公司
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ gooseworks-ai/ goose-skills --skill job-scraper安装后在 Claude Code 中输入/job-scraper确认已加载。
附带文件skill.meta.json
详细介绍
职位抓取工具
使用 Apify 搜索 LinkedIn 和 Indeed 上的职位信息。按关键词、地点、公司或职位类型查找开放职位。可用于招聘信号检测、GTM 研究或竞争情报分析。
无需 LinkedIn Cookie,也无需登录 Indeed。只需输入搜索词,即可获取结构化职位数据。
自动加载时机
在以下情况下加载此技能:
- 用户说“找工作”“哪些公司在招聘”或“[company] 正在招聘哪些职位”
- 用户想了解招聘信号(“找出正在扩充 AI 团队的公司”)
- 用户想获取竞争情报(“[competitor] 正在招聘哪些职位”)
- 用户说“职位搜索”“开放职位”“职位列表”或“职位发布”
前提条件
Apify API Token
抓取 LinkedIn 和 Indeed 都需要此令牌。在 .env 中设置:
APIFY_API_TOKEN=your_token_here
无需 LinkedIn Cookie、Indeed 登录信息或任何平台凭据。只需完成这一项设置。
来源
此技能通过 Apify Actor 搜索两个招聘平台:
| 来源 | Apify Actor | 最适合 | 费用 |
|---|---|---|---|
automation-lab/linkedin-jobs-scraper | B2B、科技、SaaS、企业职位。提供资历级别、职位职能和行业信息。 | 约 $0.002/职位 | |
| Indeed | borderline/indeed-scraper | 覆盖面最广。数据最丰富——薪资、公司详情、评分、联系人和街道地址。 | 约 $0.004/职位 |
来源选择逻辑
除非确实无法判断,否则不要询问用户要使用哪个来源。 根据上下文决定:
- 用户指定来源 → 仅使用该来源。
- 上下文明确指向某个来源:
- B2B/科技/SaaS 职位、企业公司、按资历级别筛选 → LinkedIn
- 时薪制/蓝领职位、本地/零售工作、侧重薪资的搜索 → Indeed
- 公司招聘研究(“Stripe 正在招聘哪些职位”)→ LinkedIn(公司筛选效果更好)
- 没有明确信号 → 搜索两个来源,按职位名称和公司名称去重,并呈现合并后的结果。
决定后,告知用户你要搜索哪些来源以及原因。 不要询问,直接告知。
工作流
阶段 0:理解请求
从用户的消息中提取:
- 搜索词 — 职位名称、角色或关键词(必填)
- 地点 — 城市、州、国家或“远程”(可选)
- 公司 — 特定公司名称(可选)
- 时效性 — “近期”“上周”“过去 30 天”(可选)
- 职位类型 — 全职、兼职、合同工、实习(可选)
- 远程 — 是否筛选远程职位(可选)
- 结果数量 — 用户想要的结果数(默认:25)
如果有内容不明确,请选择合理的默认值,并告知用户你的选择。对于可以合理推断的内容,不要提出澄清问题。
阶段 1:搜索
LinkedIn — automation-lab/linkedin-jobs-scraper
API 调用:
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 | string | 职位名称或关键词(必填) |
location | string | 城市、州或国家(可选) |
maxItems | integer | 返回职位数量上限(默认:50) |
轮询获取结果:
# Check run status (poll every 10s)
curl "https://api.apify.com/v2/acts/automation-lab~linkedin-jobs-scraper/runs/{RUN_ID}?token=$APIFY_API_TOKEN"
# When status is SUCCEEDED, fetch results
curl "https://api.apify.com/v2/datasets/{DATASET_ID}/items?token=$APIFY_API_TOKEN"
每个职位的输出字段:
title— 职位名称companyName— 公司名称companyLinkedinUrl— 公司 LinkedIn 页面companyLogo— Logo URLlocation— 城市、州salary— 薪资文本(如果有)employmentType— 全职、兼职、合同工等seniorityLevel— 入门级、中高级、总监、高管等jobFunction— 工程、销售、市场营销等industries— 行业分类descriptionText— 完整职位描述(纯文本)descriptionHtml— 完整职位描述(HTML)applicantsCount— 申请人数postedAt— 发布时间(例如,“6 天前”)url— LinkedIn 职位发布页面的直接链接applyUrl— 直接申请 URL
Indeed — borderline/indeed-scraper
API 调用:
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 | string | 职位名称或关键词(必填) |
location | string | 城市和州(可选) |
country | string | 小写的 2 位国家代码(必填)。常见值:us、uk、ca、de、fr、in、au |
maxResults | integer | 返回的职位数量上限 |
重要提示: Indeed 的 country 字段为必填项。如果用户未指定国家/地区,则默认使用 us。仅使用小写的 2 位代码。
每个职位的输出字段:
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— 急招/大量招聘标记
第 2 阶段:筛选与去重
按发布时间筛选
如果用户要求查找近期职位,请按日期筛选结果:
- LinkedIn: 使用
postedAt字段(例如“6 天前”),解析文本以确定发布时间。 - Indeed: 使用
datePublished字段(YYYY-MM-DD),并与今天的日期比较。
移除早于用户指定时间范围的职位。如果用户未指定时间范围,仍默认移除超过 30 天的职位,以避免数据过时。
去重(同时使用两个来源时)
同时搜索 LinkedIn 和 Indeed 时,同一职位可能会出现在两个平台上。根据以下方式去重:
- 规范化公司名称(转为小写,去掉 “Inc”、“LLC”、“Corp” 等)
- 规范化职位名称(转为小写)
- 如果公司名称和职位名称均匹配,则保留数据更丰富的结果(薪资数据优先选 Indeed,资历级别优先选 LinkedIn)
第 3 阶段:展示结果
以汇总表格的形式展示结果:
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 |
| ... |
表格之后:
- 说明有多少职位因发布时间而被筛除
- 说明移除了多少重复项
- 提供搜索总费用
如果用户想了解某个职位的更多详情,请展示完整描述。
第 4 阶段:导出(可选)
如果用户想要保存结果:
{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 都具有一致的架构。
费用估算
| 搜索 | 仅 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 为每个职位提供更丰富的数据。两者结合能提供最完整的信息。
常见用例
招聘信号检测: “查找在旧金山招聘 AI 工程师的公司” → 搜索两个来源,按公司分组,并根据空缺职位数量排序。拥有 5 个以上 AI 职位的公司正在积极扩张。
竞争情报:
“Anthropic 在招聘什么职位?” → 使用 searchQuery: "Anthropic" 搜索 LinkedIn。查看其空缺职位、团队扩张情况和战略重点。
薪资调研: “纽约的机器学习工程师薪资是多少?” → 搜索 Indeed(薪资数据更丰富)。筛选纽约地区,并汇总薪资范围。
GTM 潜在客户挖掘: “查找招聘销售副总裁的公司” → 这些公司正在扩张销售团队,可能需要销售工具。导出公司列表以便联系。
错误处理
| 错误 | 解决方法 |
|---|---|
未设置 APIFY_API_TOKEN | 请用户将其添加到 .env |
Indeed:Missing country input | 添加 country 字段,并使用小写的 2 个字母代码(默认值:us) |
| LinkedIn:结果为 0 | 扩大搜索范围或移除位置筛选条件 |
| Indeed:返回 999 条结果 | maxResults 字段可能无法限制结果数量。请在客户端进行筛选。 |
| Apify 运行失败或超时 | 重试一次。如果仍然失败,请尝试另一个来源。 |
| 结果过时(30 天以上) | 应用时效性筛选条件。提醒用户注意数据的时效性。 |