이 튜토리얼에서는 현대적인 구직 포털인 JOBKOREA의 채용 공고를 스크래핑하는 방법을 배웁니다.
다음 내용을 다룹니다:
- – 내장된 Next.js 데이터 추출을 통한 수동 Python 스크래핑
- 더 안정적이고 확장 가능한 솔루션 인 Bright Data Web MCP를 활용한 스크래핑
- Bright Data의 AI 스크레이퍼 스튜디오를 활용한 노코드 스크래핑
각 기법은 이 저장소에서 제공하는 프로젝트 코드를 사용하여 구현되며, 저수준 스크래핑에서 완전한 에이전트 기반의 AI 지원 추출로 진행됩니다.
필수 준비 사항
이 튜토리얼을 시작하기 전에 다음을 준비하세요:
- Python 3.9 이상
- Python 및 JSON에 대한 기본적인 이해
- MCP 접근 권한이 있는 Bright Data 계정
- Claude Desktop 설치 (노코드 접근 방식의 AI 에이전트로 사용)
프로젝트 설정
프로젝트 저장소를 복제하고 종속성을 설치합니다:
python -m venv venv
source venv/bin/activate # macOS / Linux
venvScriptsactivate # Windows
pip install -r requirements.txt
프로젝트 구조
각 스크래핑 기법을 쉽게 따라할 수 있도록 저장소가 구성됨:
jobkorea_scraper/
│
├── manual_scraper.py # 수동 Python 스크래핑
├── mcp_scraper.py # Bright Data Web MCP 스크래핑
├── parsers/
│ └── jobkorea.py # 공유 파싱 로직
├── schemas.py # 채용 데이터 스키마
├── requirements.txt
├── README.md
각 스크립트는 원하는 방법을 탐색하기 위해 독립적으로 실행할 수 있습니다.
기법 1: 수동 Python 스크래핑
가장 기본적인 접근법으로 시작하겠습니다: 브라우저, MCP 또는 AI 에이전트 없이 순수 Python으로 JOBKOREA를 스크래핑하는 방법입니다.
이 기법은 JOBKOREA가 데이터를 제공하는 방식을 이해하고, 보다 강력한 솔루션으로 넘어가기 전에 스크레이퍼를 빠르게 프로토타이핑하는 데 유용합니다.
페이지 가져오기
manual_scraper.py를 엽니다.
스크레이퍼는 requests를 사용해 표준 HTTP 요청을 보내는 것으로 시작합니다. 즉시 차단되는 것을 피하기 위해 브라우저와 유사한 헤더를 포함시킵니다.
headers = {
"User-Agent": "Mozilla/5.0 (...)",
"Accept": "text/html,application/xhtml+xml,*/*",
"Accept-Language": "en-US,en;q=0.9,ko;q=0.8",
"Referer": "https://www.jobkorea.co.kr/"
}
목표는 단순히 요청이 일반 웹 트래픽처럼 보이도록 하는 것입니다. 그런 다음 페이지를 가져오고 한국어 텍스트 관련 문제를 피하기 위해 UTF-8 인코딩을 강제 적용합니다:
response = requests.get(url, headers=headers, timeout=20)
response.raise_for_status()
response.encoding = "utf-8"
html = response.text
디버깅을 위해 원본 HTML을 로컬에 저장합니다:
with open("debug.html", "w", encoding="utf-8") as f:
f.write(html)
사이트가 변경되어 파싱이 갑자기 작동하지 않을 때 이 파일이 매우 유용합니다.
응답 파싱
HTML이 다운로드되면 공유 파싱 함수로 전달됩니다:
jobs = parse_job_list(html)
이 함수는 parsers/jobkorea.py에 있으며 JOBKOREA 특화 로직을 모두 포함합니다.
기존 HTML 파싱 시도
parse_job_list 내부에서는 먼저 JOBKOREA가 전통적인 서버 렌더링 사이트인 것처럼 BeautifulSoup을 사용하여 채용 공고 목록을 추출하려고 시도합니다.
soup = BeautifulSoup(html, "html.parser")
job_lists = soup.find_all("div", class_="list-default")
목록을 찾지 못하면 보조 선택자를 시도합니다:
job_lists = soup.find_all("ul", class_="clear")
이 방법이 성공하면 스크레이퍼는 다음과 같은 필드를 추출합니다:
- 직무명
- 회사명
- 근무지
- 게시일
- 구인 링크
그러나 이 방법은 JOBKOREA가 의미 있는 HTML 요소를 노출할 때만 작동하며, 항상 그런 것은 아닙니다.
대안: Next.js 하이드레이션 데이터 추출
HTML 파싱을 통해 일자리를 찾지 못하면 스크레이퍼는 내장된 Next.js 하이드레이션 데이터를 대상으로 하는 대체 전략으로 전환합니다.
nextjs_jobs = parse_nextjs_data(html)
이 함수는 클라이언트 측 렌더링 중에 주입된 JSON 문자열을 페이지에서 스캔합니다. 매칭 로직의 단순화된 버전은 다음과 같습니다:
pattern = r'\"id\":\"(?P<id>d+)\",\"title\":\"(?P<title>.*?)\",\"postingCompanyName\":\"(?P<company>.*?)\"'
이 데이터로부터 채용 공고 URL을 재구성합니다:
link = f"https://www.jobkorea.co.kr/Recruit/GI_Read/{job_id}"
이 대체 방식을 통해 스크레이퍼는 브라우저를 실행하지 않고도 작동할 수 있습니다.
결과 저장
공유 스키마를 사용하여 각 채용 공고를 검증하고 디스크에 기록합니다:
with open("jobs.json", "w", encoding="utf-8") as f:
json.dump(
[job.model_dump() for job in jobs],
f,
ensure_ascii=False,
indent=2
)
스크레이퍼는 다음과 같이 실행합니다:
python manual_scraper.py "https://www.jobkorea.co.kr/Search/?stext=python"
이제 추출된 목록이 포함된 jobs.json 파일이 생성됩니다.

이 접근법이 이상적인 경우
수동 스크래핑은 사이트 작동 방식을 탐색하거나 빠른 프로토타입을 구축할 때 유용합니다. 빠르고 간단하며 외부 서비스에 의존하지 않습니다.
그러나 이 방법은 JOBKOREA의 현재 페이지 구조에 밀접하게 의존합니다. 특정 HTML 레이아웃과 내장된 하이드레이션 패턴에 의존하기 때문에 사이트가 변경되면 작동하지 않을 수 있습니다.
더 안정적이고 장기적인 스크래핑을 위해서는 렌더링과 사이트 변경을 자동으로 처리해주는 도구를 사용하는 것이 좋습니다. 바로 다음 단계에서 Bright Data Web MCP를 활용해 이를 구현해 보겠습니다.
기법 2: Bright Data Web MCP를 활용한 스크래핑
이전 섹션에서는 HTML을 수동으로 다운로드하고 내장된 데이터를 추출하여 JOBKOREA를 스크래핑했습니다. 이 접근 방식도 작동하지만, 사이트의 현재 구조에 밀접하게 의존합니다.
이 기술에서는 Bright Data Web MCP를 사용하여 페이지 가져오기 및 렌더링을 처리합니다. 그런 다음 반환된 콘텐츠를 구조화된 채용 정보 데이터로 변환하는 데만 집중합니다.
이 접근법은 mcp_scraper.py에 구현되어 있습니다.
Bright Data API 키/토큰 획득하기
- Bright Data 대시보드에 로그인합니다.

- 왼쪽 사이드바에서 설정을 엽니다
- 사용자 및 API 키로 이동
- API 키 복사
이 튜토리얼 후반부에 해당 페이지 위치와 토큰 표시 위치를 정확히 보여주는 스크린샷이 제공됩니다.
프로젝트 루트에 .env 파일을 생성하고 다음을 추가하세요:
BRIGHT_DATA_API_TOKEN=your_token_here
스크립트는 런타임에 토큰을 로드하며, 토큰이 누락된 경우 조기에 중단됩니다.
MCP 요구 사항
Bright Data Web MCP는 npx를 사용하여 로컬에서 실행되므로 다음이 설치되어 있는지 확인하세요:
- Node.js 설치
- PATH에 npx가 설정되어 있음
MCP 서버는 Python에서 다음 명령으로 시작됩니다:
server_params = StdioServerParameters( command="npx", args=["-y", "@brightdata/mcp"], env={"API_TOKEN": BRIGHT_DATA_API_TOKEN, **os.environ} )
MCP 스크레이퍼 실행
JOBKOREA 검색 URL로 스크립트 실행:
python mcp_scraper.py "https://www.jobkorea.co.kr/Search/?stext=python"
스크립트가 MCP 세션을 열고 연결을 초기화합니다:
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
연결이 완료되면 스크레이퍼는 콘텐츠를 가져올 준비가 됩니다.
MCP를 사용한 페이지 가져오기
이 프로젝트에서 스크레이퍼는 MCP 도구인 scrape_as_markdown을 사용합니다:
result = await session.call_tool(
"scrape_as_markdown",
arguments={"url": url}
)
반환된 콘텐츠는 수집되어 로컬에 저장됩니다:
with open("scraped_data.md", "w", encoding="utf-8") as f:
f.write(content_text)
이를 통해 MCP가 반환한 내용을 읽기 쉬운 스냅샷으로 확인할 수 있으며, 디버깅 및 파싱에 유용합니다.
마크다운에서 작업 파싱
MCP가 반환한 마크다운은 구조화된 작업 데이터로 변환됩니다.
구문 분석 로직은 마크다운 링크를 검색합니다:
link_pattern = re.compile(r"[(.*?)]((.*?))")
다음 내용을 포함하는 URL로 채용 공고를 식별합니다:
if "Recruit/GI_Read" in url:
일자리 링크가 발견되면, 주변 줄을 활용하여 회사명, 위치, 게시 날짜를 추출합니다.
마지막으로 결과를 디스크에 기록합니다:
with open("jobs_mcp.json", "w", encoding="utf-8") as f:
json.dump(
[job.model_dump() for job in jobs],
f,
ensure_ascii=False,
indent=2
)
출력 파일
스크립트 실행 후 다음 파일이 생성됩니다:
scraped_data.md
Bright Data Web MCP에서 반환된 원시 마크다운
jobs_mcp.json
구조화된 JSON 형식으로 파싱된 채용 공고 목록
이 접근 방식이 이상적인 경우
신뢰할 수 있고 반복 가능한 스크레이퍼를 원할 때 Python에서 Bright Data Web MCP를 직접 사용하는 것이 적합합니다.
MCP가 렌더링, 네트워킹 및 기본적인 사이트 방어 기능을 처리하기 때문에, 이 접근 방식은 수동 스크래핑보다 레이아웃 변경에 훨씬 덜 민감합니다. 동시에, Python에서 로직을 유지하면 자동화, 스케줄링 및 대규모 데이터 파이프라인에 통합하기가 쉽습니다.
이 기술은 시간이 지나도 일관된 결과가 필요하거나 여러 검색 페이지나 키워드를 스크래핑할 때 효과적입니다. 또한 AI 기반 워크플로로 완전히 전환하지 않고도 수동 스크래핑에서 명확한 업그레이드 경로를 제공합니다.
다음으로 세 번째 기법으로 넘어가겠습니다. 여기서는 Claude Desktop을 Bright Data Web MCP에 연결된 AI 에이전트로 활용하여 스크래핑 코드를 작성하지 않고도 JOBKOREA를 스크래핑합니다.
기법 3: Bright Data IDE를 활용한 AI 생성 스크래핑 코드
이 마지막 기법에서는 웹 스크래핑 IDE 내 Bright Data의 AI 지원 스크래퍼를 사용하여 스크래핑 코드를 생성합니다.
스크래핑 로직을 처음부터 수동으로 작성할 필요가 없습니다. 원하는 내용을 설명하면 IDE가 스크래퍼 생성과 개선을 지원합니다.
스크레이퍼 IDE 열기
Bright Data 대시보드에서:
왼쪽 사이드바에서 ‘데이터 열기’ 선택
- 내 스크레이퍼를 클릭합니다

- 오른쪽 상단에서 ‘새로 만들기’ 선택
- ‘웹 스크레이퍼 직접 개발’ 선택

자바스크립트 통합 개발 환경(IDE)이 열립니다
대상 URL “https://www.jobkorea.co.kr/Search/”을 입력하고 “코드 생성”을 클릭하세요
IDE가 요청을 처리하여 바로 사용 가능한 코드 템플릿을 생성합니다. 준비 완료 시 이메일 알림을 받게 됩니다. 이후 필요에 따라 코드를 편집하거나 실행할 수 있습니다.
세 가지 스크래핑 기법 비교
이 프로젝트의 각 기법은 동일한 문제를 해결하지만 서로 다른 워크플로에 적합합니다. 아래 표는 실제적인 차이점을 강조합니다.
| 기술 | 설정 노력 | 신뢰성 | 자동화 | 실행 환경 | 최적 사용 사례 |
|---|---|---|---|---|---|
| 수동 Python 스크래핑 | 낮음 | 낮음에서 중간 | 제한적 | 로컬 머신 | 학습, 빠른 실험 |
| Bright Data MCP (Python) | 중간 | 높음 | 높음 | 로컬 + Bright Data | 프로덕션 스크래핑, 예약 작업 |
| AI 생성 스크레이퍼 (Bright Data IDE) | 낮음 | 높음 | 높음 | Bright Data 플랫폼 | 빠른 설정, 재사용 가능한 관리형 스크레이퍼 |
마무리
이 튜토리얼에서는 JOBKOREA를 스크래핑하는 세 가지 방법, 즉 수동 Python 스크래핑, 보다 안정적인 Bright Data Web MCP 기반 워크플로우, 그리고 코딩 없이 Bright Data의 AI 스크래퍼 스튜디오를 사용하는 방법을 다루었습니다.
각 기법은 이전 기법을 기반으로 합니다. 수동 스크래핑은 사이트 작동 방식을 이해하는 데 도움이 되고, MCP 기반 스크래핑은 안정성과 자동화를 제공하며, AI 에이전트 접근 방식은 최소한의 설정으로 구조화된 데이터에 가장 빠르게 도달할 수 있는 방법을 제공합니다.
JOBKOREA와 같은 현대적인 클라이언트 렌더링 웹사이트를 스크래핑하고 있으며, 취약한 선택자나 브라우저 자동화에 대한 보다 안정적인 대안이 필요하다면, Bright Data Web MCP는 기존 스크립트와 AI 기반 워크플로우 모두와 호환되는 강력한 기반을 제공합니다.