YC Jobs Scraper
이 스킬은 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가 자동으로 쿠키/토큰을 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);"