mcpField
J
job-scraper

job-scraper

github.com/gooseworks-ai生产力1.3k149 次安装3 天前更新
代码仓库

关于 job-scraper

job-scraper 是通过 Apify 搜索 LinkedIn 和 Indeed 招聘信息的技能,适用于求职信息检索、招聘趋势分析和竞争研究。它整理结构化职位数据,可按条件筛选、去重并导出 CSV。

主要功能

  1. 01搜索 LinkedIn 和 Indeed 职位
  2. 02按关键词、地点和公司检索
  3. 03筛选职位日期和类型
  4. 04合并去重并整理结果
  5. 05将职位结果导出为 CSV

适用场景

  1. 01发现企业招聘增长信号
  2. 02研究竞争对手的招聘岗位
  3. 03比较特定地区的薪资信息
  4. 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最适合费用
LinkedInautomation-lab/linkedin-jobs-scraperB2B、科技、SaaS、企业职位。提供资历级别、职位职能和行业信息。约 $0.002/职位
Indeedborderline/indeed-scraper覆盖面最广。数据最丰富——薪资、公司详情、评分、联系人和街道地址。约 $0.004/职位
来源选择逻辑

除非确实无法判断,否则不要询问用户要使用哪个来源。 根据上下文决定:

  1. 用户指定来源 → 仅使用该来源。
  2. 上下文明确指向某个来源:
    • B2B/科技/SaaS 职位、企业公司、按资历级别筛选 → LinkedIn
    • 时薪制/蓝领职位、本地/零售工作、侧重薪资的搜索 → Indeed
    • 公司招聘研究(“Stripe 正在招聘哪些职位”)→ LinkedIn(公司筛选效果更好)
  3. 没有明确信号 → 搜索两个来源,按职位名称和公司名称去重,并呈现合并后的结果。

决定后,告知用户你要搜索哪些来源以及原因。 不要询问,直接告知。


工作流

阶段 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
  }'

输入字段:

字段类型说明
searchQuerystring职位名称或关键词(必填)
locationstring城市、州或国家(可选)
maxItemsinteger返回职位数量上限(默认: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 URL
  • location — 城市、州
  • 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
  }'

输入字段:

字段类型描述
querystring职位名称或关键词(必填)
locationstring城市和州(可选)
countrystring小写的 2 位国家代码(必填)。常见值:us、uk、ca、de、fr、in、au
maxResultsinteger返回的职位数量上限

重要提示: 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 时,同一职位可能会出现在两个平台上。根据以下方式去重:

  1. 规范化公司名称(转为小写,去掉 “Inc”、“LLC”、“Corp” 等)
  2. 规范化职位名称(转为小写)
  3. 如果公司名称和职位名称均匹配,则保留数据更丰富的结果(薪资数据优先选 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 天以上)应用时效性筛选条件。提醒用户注意数据的时效性。

评论

支持 Markdown