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 에서 바로 쓸 수 있다.
- 가입 후 새 대화 시작
- 아래 프롬프트를 복사해 붙여넣기
- 받은 코드를
crawler.py로 저장 - 터미널에서
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가 page → recruitPage 로 수정해 준다.
잡코리아 크롤러에서 총 건수가 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를 확인하고 허용 범위를 지킨다- 사이트 이용약관의 크롤링 조항을 준수한다
- 수집한 데이터를 재배포하지 않는다
- 요청 간격을 두고 서버 부담을 최소화한다
- 개인정보(이메일·전화번호)는 수집·저장하지 않는다
- 상업적 용도로 사용하지 않는다