YC 職缺爬蟲
此技能提供一個強大的架構,用於從 YCombinator 與 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.jsdata-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 會自動將 Cookie/Token 儲存至 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);"