구인업체 데이터 수집 크롤러 만들기 (바이브 코딩)

Claude나 Gemini 같은 AI에게 시켜서 잡코리아·사람인 채용공고 크롤러를 직접 실행해 본다. 파이썬을 한 줄도 써 본 적이 없어도 프롬프트만 잘 주면 완성된 Excel 파일을 받을 수 있다.

1. 준비물

항목 설명
컴퓨터 맥·윈도우·리눅스 모두 가능
Python 3.10+ python.org에서 설치
AI 도구 Claude 또는 Gemini CLI
VS Code code.visualstudio.com (선택)

2. 파이썬 "가상환경" 만들기

프로젝트마다 독립된 파이썬 환경을 쓰면 패키지 충돌을 막을 수 있다. 상자를 따로 두는 느낌이다.

# 1) 작업 폴더 만들기
mkdir ~/crawler && cd ~/crawler

# 2) 가상환경 생성
python3 -m venv .venv

# 3) 활성화
source .venv/bin/activate

# 프롬프트 앞에 (.venv) 가 붙으면 성공

# 1) 작업 폴더 만들기
mkdir $HOMEcrawler
cd $HOMEcrawler

# 2) 가상환경 생성
python -m venv .venv

# 3) 활성화
.venvScriptsActivate.ps1

# 실행 정책 오류가 나면 한 번만:
# Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

mkdir %USERPROFILE%crawler
cd %USERPROFILE%crawler

python -m venv .venv
.venvScriptsactivate.bat

2-1. 패키지 설치

가상환경이 활성화된 상태에서 실행한다.

pip install requests beautifulsoup4 lxml openpyxl


`pip` 명령이 없다는 오류가 나면 가상환경 활성화가 안 된 것이다.
프롬프트 앞에 `(.venv)` 가 있는지 확인한다.

3. AI 도구 준비

# 설치 (Node.js 필요)
npm install -g @google/gemini-cli

# 로그인 (브라우저가 열린다)
gemini auth login

# 실행 — 대화창이 열린다
gemini

장점: 터미널 안에서 파일 읽기·쓰기·실행까지 AI가 해준다.
단점: Node.js 설치 필요.

claude.ai 에서 바로 쓸 수 있다.

  1. 가입 후 새 대화 시작
  2. 아래 프롬프트를 복사해 붙여넣기
  3. 받은 코드를 crawler.py 로 저장
  4. 터미널에서 python crawler.py 실행

장점: 설치 불필요, 긴 코드도 잘 쓴다.
단점: 파일 저장·실행은 직접 해야 한다.

4. 잡코리아 크롤러 프롬프트

역할: 30년차 풀스택 개발자

작업: 잡코리아 채용공고를 자동 수집해 Excel 파일로 저장하는
     파이썬 크롤러를 작성한다.

수집 조건:
- 직무 코드(duty): 1000255(웹디자이너), 1000256(UI·UX디자이너)
  → CONFIG 딕셔너리로 만들어 쉽게 변경할 수 있게 한다
- 지역: 서울 전지역(local=I010001)
- 경력: 신입(careerType=1)
- 확인한 공고 제외(filter=1)

수집 방법:
- URL: https://www.jobkorea.co.kr/Search/
- 페이지 파라미터 이름은 Page_No (페이지당 20개)
- HTML 안 self.__next_f.push([1,"..."]) 블록에서 JSON 데이터를 이중 디코딩
- "JOB_LIST queryKey" 이전에 위치한 마지막 totalElements를 선택
  (가장 큰 값은 전체 공고 수 69만건이라 잘못된 값이다)

후처리 필터:
- areaCodeList에 서울 구 코드(I010~I250)가 있는 공고만 남긴다
  (areaCodeList가 None일 수 있으니 "or []" 로 방어)
- receptionOptionType 마지막 자리가 "1"이면 홈페이지 지원이라 제외
- ThreadPoolExecutor(max_workers=8)로 직원수 병렬 조회
- 직원수 10명 이상만 남긴다 (미확인은 포함)

출력:
- openpyxl로 Excel 저장: 헤더 고정·자동필터·하이퍼링크 포함
- 파일명: 잡코리아_YYYYMMDD.xlsx
- 컬럼: 공고제목, 회사명, 직원수, 지역, 마감일, 링크

제약:
- 요청 간 time.sleep(0.3) 딜레이
- User-Agent 헤더 실제 브라우저 값
- 파일은 하나로 (crawler.py)

작성 후 잠재 버그를 검토하고 실행 방법을 알려달라.


직무나 지역을 바꾸고 싶으면 프롬프트 맨 위 조건 부분만 바꿔서 다시 보내면 된다. 예를 들어 “프론트엔드개발자(1000230)만” 또는 “경력 3년 이상(careerType=2)” 으로.

4-1. 주요 직무 코드 목록

코드 직무
1000248 그래픽디자이너
1000252 광고디자이너
1000253 시각디자이너
1000255 웹디자이너
1000256 UI·UX디자이너
1000258 편집디자이너
1000250 일러스트레이터
1000230 프론트엔드개발자
1000245 웹퍼블리셔
1000279 웹기획
1000188 PL·PM·PO
1000388 영상편집자

5. 사람인 크롤러 프롬프트

역할: 30년차 풀스택 개발자

작업: 사람인 채용공고를 자동 수집해 Excel 파일로 저장하는
     파이썬 크롤러를 작성한다.

수집 조건:
- 직무 코드(cat_kewd): 1502(웹디자인), 1690(UI/UX)
  → CONFIG 딕셔너리로 만들어 쉽게 변경할 수 있게 한다
- 지역: 서울 전지역(loc_mcd=101000)
- 경력: 신입(exp_cd=1)

수집 방법:
- URL: https://www.saramin.co.kr/zf_user/search/recruit
- 페이지 파라미터 이름은 recruitPage (주의: "page"가 아니다!)
- 페이지당 40개
- BeautifulSoup으로 .item_recruit 엘리먼트를 파싱
- 공고마다 rec_idx, title, company, csn, conditions 추출
- .sri_btn_homepage_apply 엘리먼트가 있으면 홈페이지 지원(제외 대상)

후처리 필터:
- conditions[0]이 "서울전체"인 공고는 제외 (구 단위 공고만 남김)
- 홈페이지 지원 공고는 제외
- 기업정보 페이지(csn 필요)에서 사원수 조회:
  URL: https://www.saramin.co.kr/zf_user/company-info/view?csn={csn}
  p.company_summary_desc 텍스트가 "사원수"인 li에서 strong.company_summary_tit
- ThreadPoolExecutor(max_workers=8)로 병렬 조회
- 직원수 10명 이상만 남긴다

출력:
- openpyxl로 Excel 저장: 헤더 고정·자동필터·하이퍼링크 포함
- 파일명: 사람인_YYYYMMDD.xlsx
- 컬럼: 공고제목, 회사명, 직원수, 지역, 고용형태, 마감일, 링크

제약:
- 요청 간 time.sleep(0.3) 딜레이
- User-Agent 헤더 실제 브라우저 값
- 파일은 하나로 (crawler.py)

작성 후 잠재 버그를 검토하고 실행 방법을 알려달라.

5-1. 주요 cat_kewd 코드 목록

코드 직무
1484 그래픽디자인
1483 광고디자인
1496 시각디자인
1502 웹디자인
1519 편집디자인
1504 일러스트레이터
1690 UI/UX
92 프론트엔드
91 퍼블리셔
1637 웹기획
1649 PM
1373 영상편집

6. 통합 크롤러 프롬프트 (잡코리아 + 사람인)

두 사이트 결과를 하나의 Excel로 합치고 싶을 때 쓴다.

역할: 30년차 풀스택 개발자

작업: 잡코리아와 사람인에서 같은 조건의 채용공고를 수집한 뒤
     결과를 하나의 Excel에 통합해 저장한다.

수집 조건:
- 직무: 웹디자이너 + UI/UX
  * 잡코리아 duty: 1000255, 1000256
  * 사람인 cat_kewd: 1502, 1690
- 지역: 서울 (서울전체 표기 공고 제외 → 구 단위만)
- 경력: 신입
- 홈페이지 지원 제외
- 사원수 10명 이상

모듈 구조 (파일 3개):
1. jobkorea.py  — 잡코리아 크롤러
2. saramin.py   — 사람인 크롤러
3. merge.py     — 진입점. 두 크롤러를 호출한 뒤 결과를 합쳐 Excel 저장

통합 시 스키마:
- 공통 컬럼: 출처(jobkorea/saramin), 공고제목, 회사명, 직원수,
            지역, 경력, 마감일, 링크
- 중복 판단: (회사명 + 공고제목) 이 같으면 중복
  → 중복은 '출처' 컬럼에 "jobkorea, saramin" 처럼 함께 표기

출력:
- 파일명: 통합채용공고_YYYYMMDD.xlsx
- 시트 3개: [전체통합], [잡코리아원본], [사람인원본]
- 전체통합 시트는 직원수 오름차순 정렬
- 상위 탭에 요약 정보(수집일·총건수·사이트별 건수)

제약:
- 사이트별 크롤러는 병렬이 아닌 순차 실행 (차단 방지)
- 같은 사이트 안에서만 ThreadPoolExecutor 사용
- 작성 후 잠재 버그 검토 및 실행 방법 안내

7. 실행하기

AI에게서 받은 코드를 crawler.py 로 저장한 뒤 실행한다.

# 가상환경이 활성화된 상태에서
python crawler.py

진행 상황이 터미널에 출력된다. 종료되면 같은 폴더에 Excel 파일이 생긴다.

============================================================
  잡코리아 직무별 채용공고 크롤러
============================================================
  [페이지   1/40] 20개 (20개 신규) | 누적   20개
  [페이지   2/40] 20개 (20개 신규) | 누적   40개
  ...
  → 수집 완료: 782개
  → 서울 구 필터 후: 523개
  → 홈페이지지원 제외 후: 498개
  직원수 병렬 조회 (workers=8)...
    직원수 확인 100/498
    ...
  → 최종 471개
  Excel 저장: 잡코리아_20260417.xlsx

8. 오류가 나면 AI에게 다시 시키기

에러 메시지를 그대로 복사해 AI에게 보내면 된다.

아래 에러를 수정해라:

Traceback (most recent call last):
  File "crawler.py", line 123, in has_gu_address
    return any(c in SEOUL_GU_CODES for c in codes)
TypeError: 'NoneType' object is not iterable

문제가 된 줄: codes = job.get("areaCodeList", [])

AI가 job.get("areaCodeList") or [] 로 수정해 준다.

사람인 크롤러가 페이지를 넘겨도 같은 공고만 반복해서 수집한다.
params에 "page"를 쓰고 있는데 문제인지 확인해라.

AI가 pagerecruitPage 로 수정해 준다.

잡코리아 크롤러에서 총 건수가 69만건으로 나오는데 실제는 훨씬 적다.
__next_f.push 블록에서 totalElements를 여러 개 찾은 뒤
"가장 큰 값"을 선택하고 있는데 이게 잘못된 것 같다.
"JOB_LIST queryKey 이전에 위치한 마지막 totalElements"를 쓰도록 고쳐라.

AI가 파싱 로직을 고친다.

크롤링 중 429 Too Many Requests 에러가 뜬다.
- time.sleep 간격을 0.3초에서 0.8초로 늘려라
- ThreadPoolExecutor max_workers를 8에서 4로 줄여라
- User-Agent 헤더를 최신 크롬 값으로 갱신해라

9. 조건 바꾸기

수집 조건을 바꾸고 싶으면 AI에게 간단히 요청하면 된다.

현재 코드는 웹디자이너 대상이다.
직무를 프론트엔드개발자(잡코리아 1000230, 사람인 92)로 바꿔라.

신입이 아니라 경력 3~5년으로 바꿔라.
- 잡코리아: careerType=2, careerMin=3, careerMax=5
- 사람인:   exp_cd=2 (+ 경력연차 파라미터 확인)

서울이 아니라 경기도로 바꿔라.
- 잡코리아: local 파라미터로 경기도 코드 찾아라
- 사람인:   loc_mcd 경기도 코드로 바꿔라

직원수 필터를 10명 이상에서 50명 이상으로 바꿔라.
CONFIG 딕셔너리의 min_employees 값만 고치면 되는 구조여야 한다.

10. 보안·윤리

크롤링은 상대 서버에 부담을 주는 행위다. 아래 원칙을 지킨다.

  • robots.txt 를 확인하고 허용 범위를 지킨다
  • 사이트 이용약관의 크롤링 조항을 준수한다
  • 수집한 데이터를 재배포하지 않는다
  • 요청 간격을 두고 서버 부담을 최소화한다
  • 개인정보(이메일·전화번호)는 수집·저장하지 않는다
  • 상업적 용도로 사용하지 않는다

11. 참고 자료

댓글 남기기