YC求人スクレイパー
このスキルはY Combinatorとworkatastartup.comから求人をスクレイピングするための堅牢なアーキテクチャを提供します。自動実行、ログインボトルネックの回避、および重複スクレイピングを防止するための状態維持を目的として設計されています。
アーキテクチャ
スクレイパーは信頼性を最大化し、ボット検出を最小化するためのハイブリッドアプローチを使用します。
- 認証:
scripts/auth.jsはPlaywrightを使用して人間が一度ログインし、セッションをscripts/state.jsonに保存します。 - データベース:
scripts/db.jsはbetter-sqlite3を使用してscripts/jobs.dbを管理します。これまでに確認されたすべてのcompany_slugとjob_idを追跡します。 - プライマリ抽出:
scripts/scraper.jsはstate.jsonをロードし、YCのクエリURLにアクセスし、隠されたInertia.jsのdata-pageJSONペイロードから企業スラッグを抽出します。 - 求人抽出 (JSON): 次に、認証済みの企業ページ (
/companies/[slug]) にアクセスし、バックエンドのJSONペイロードから求人を抽出して、正確な重複排除のために実際のjob_idを取得します。 - 求人抽出 (フォールバック): JSON抽出が失敗した場合、
ycombinator.com/companies/[slug]/jobsの公開HTML求人カードの解析にフォールバックします。
ワークフロー
1. 初回セットアップ
環境でスクレイパーを初めて実行する場合、または node_modules がない場合:
cd @path/scripts
npm install
npx playwright install
2. 認証 (手動ステップ)
scripts/state.json がないか有効期限が切れている場合、スクレイパーは失敗します。人間のユーザーに認証スクリプトを手動で実行するよう指示する必要があります:
cd @path/scripts
node auth.js
ユーザーに対して、ブラウザが開くのでログインする必要があることを伝えてください。Playwrightは自動的にクッキー/トークンを state.json に保存します。
3. 日次スクレイパーの実行
新しい企業と求人をスクレイピングするには:
cd @path/scripts
node scraper.js
このスクリプトは、見つかった新しい企業数と新しい求人数を正確に出力します。jobs.db のおかげで、連続して複数回実行しても 0 new jobs found という結果になります。
4. データベースのクエリ
スクレイピングしたデータを分析したり、企業/求人を表示したりする必要がある場合は、better-sqlite3 を使用して scripts/jobs.db を直接クエリできます。
例: 企業数のカウント
cd @path/scripts
node -e "const db = require('better-sqlite3')('jobs.db'); console.log('Companies:', db.prepare('SELECT COUNT(*) as count FROM companies').get().count);"
例: 最近の求人の表示
cd @path/scripts
node -e "const db = require('better-sqlite3')('jobs.db'); const jobs = db.prepare('SELECT title, company_slug, location FROM jobs ORDER BY created_at DESC LIMIT 5').all(); console.table(jobs);"