mcpField
J
job-scraper

job-scraper

github.com/gooseworks-ai生産性1.3k149 回インストール3 日前に更新
リポジトリ

job-scraper について

job-scraper は Apify を通じて LinkedIn と Indeed の求人情報を検索するスキルです。求人調査、採用動向の分析、競合調査に使え、条件での絞り込みや重複排除、CSV 出力に対応します。

主な機能

  1. 01LinkedIn と 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 トークン

LinkedIn と Indeed のスクレイピングの両方で必要です。.env に設定します:

APIFY_API_TOKEN=your_token_here

LinkedIn の Cookie、Indeed へのログイン、その他のプラットフォーム認証情報は不要です。必要な設定はこれだけです。


情報源

このスキルは Apify アクターを介して、2 つの求人プラットフォームを検索します:

情報源Apify アクター最適な用途コスト
LinkedInautomation-lab/linkedin-jobs-scraperB2B、テクノロジー、SaaS、エンタープライズの職種。役職レベル、職務、業界で絞り込めます。約 $0.002/件
Indeedborderline/indeed-scraper最も幅広い求人を網羅します。給与、企業情報、評価、連絡先、番地を含む住所など、最も豊富なデータを取得できます。約 $0.004/件
情報源の選択ロジック

本当に判断が難しい場合を除き、どの情報源を使うかユーザーに尋ねないでください。 文脈に応じて判断します:

  1. ユーザーが情報源を指定している → 指定された情報源のみを使用します。
  2. 文脈から情報源を強く推測できる:
    • B2B/テクノロジー/SaaS の職種、エンタープライズ企業、役職レベルでの絞り込み → LinkedIn
    • 時給制/ブルーカラーの職種、地域密着型/小売の求人、給与重視の検索 → Indeed
    • 企業の採用調査(「Stripe はどんな職種を募集している?」) → LinkedIn(企業での絞り込みに適しています)
  3. 明確な判断材料がない → 両方の情報源を検索し、求人タイトルと企業名で重複を除いて、結果をまとめて提示します。

選択したら、どの情報源を検索するのか、理由とともにユーザーに伝えてください。 質問ではなく、知らせてください。


ワークフロー

フェーズ 0:リクエストを把握する

ユーザーのメッセージから、次の情報を抽出します:

  • 検索語 — 職種名、役割、またはキーワード(必須)
  • 勤務地 — 都市、州、国、または「リモート」(任意)
  • 企業 — 特定の企業名(任意)
  • 掲載時期 — 「最近」「先週」「過去 30 日間」(任意)
  • 雇用形態 — fulltime、parttime、contract、internship(任意)
  • リモート — リモート勤務の求人で絞り込むかどうか(任意)
  • 結果件数 — 希望する結果数(デフォルト: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 — ロゴの 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
  }'

入力フィールド:

フィールド型説明
query文字列職種名またはキーワード(必須)
location文字列市区町村と州(任意)
country文字列2 文字の小文字の国コード(必須)。一般的な値:us、uk、ca、de、fr、in、au
maxResults整数返す求人の最大数

重要: 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 days ago」)
  • expired — 求人がまだ有効かどうか
  • isRemote — リモート勤務のフラグ
  • jobType — 雇用形態
  • jobUrl — Indeed の求人への直接 URL
  • applyUrl — 応募先への直接 URL
  • rating — 会社の評価とレビュー件数
  • emails — 連絡先メールアドレス(利用可能な場合)
  • attributes — 求人属性のリスト(福利厚生、応募要件など)
  • hiringDemand — 急募/大量採用のフラグ
フェーズ 2:フィルタリングと重複の削除
掲載時期によるフィルタリング

ユーザーが新しい求人を求めている場合は、日付で検索結果を絞り込みます。

  • LinkedIn: postedAt フィールド(例:「6 days ago」)を使用し、テキストを解析して掲載時期を判断します。
  • 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

求人 1 件あたりの費用は LinkedIn のほうが安く、Indeed は求人 1 件あたりの情報がより豊富です。両方を併用すると、最も包括的な結果が得られます。


一般的なユースケース

採用シグナルの検出: 「SFでAIエンジニアを採用している企業を探してください」→ 両方のソースを検索し、企業ごとにまとめ、募集中の職種数で順位付けします。AI関連の職種を5件以上募集している企業は、積極的に事業を拡大しています。

競合インテリジェンス: 「Anthropicはどのような職種を募集していますか?」→ searchQuery: "Anthropic" を指定してLinkedInを検索します。募集中の職種、チームの拡大状況、戦略上の優先事項が表示されます。

給与調査: 「NYCのMLエンジニアの給与はいくらですか?」→ Indeedを検索します(より充実した給与データがあります)。NYCに絞り込み、給与範囲を集計します。

GTMの見込み客開拓: 「営業担当副社長を募集している企業を探してください」→ こうした企業は営業組織を拡大しており、営業ツールを必要としている可能性があります。営業活動に向けて企業リストをエクスポートします。


エラー処理

エラー対処方法
APIFY_API_TOKEN が設定されていないユーザーに .env への追加を依頼します
Indeed:Missing country input小文字2文字のコード(デフォルト:us)を指定した country フィールドを追加します
LinkedIn:結果が0件検索クエリの範囲を広げるか、勤務地のフィルターを解除します
Indeed:999件の結果が返されるmaxResults フィールドで結果数を制限できない場合があります。クライアント側で絞り込みます。
Apifyの実行が失敗する、またはタイムアウトする1回再試行します。それでも失敗する場合は、もう一方のソースを試します。
古い結果(30日以上前)新しさのフィルターを適用します。データの鮮度についてユーザーに注意を促します。

コメント