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/令牌保存到state.json。
3. 运行每日抓取器
要抓取新公司和职位:
cd @path/scripts
node scraper.js
此脚本将输出找到的新公司和新职位的准确数量。由于jobs.db的存在,连续多次运行将导致“找到0个新职位”。
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);"