구인 게시판 애그리게이터 구축하기: 소스, 중복 제거 및 신선도

좋은 구인 애그리게이터는 세 가지 엔지니어링 문제로 구성됩니다: 목록을 어디에서 소싱할 것인지, 어떻게 중복을 제거할 것인지, 그리고 어떻게 신선도를 유지할 것인지입니다. 이 문제들을 해결하면 스크래핑은 쉬운 부분입니다 — 여기에 청사진이 있습니다.

구인 게시판 애그리게이터는 구인 게시물을 위한 검색 엔진입니다: 여러 소스에서 목록을 가져와 한 곳에 보여줍니다. 어려운 부분은 HTTP 요청이 아니라 올바른 소스를 선택하고, 다섯 개 사이트에 나타나는 동일한 구인을 중복 제거하며, 지난달에 채워진 역할을 보여주지 않도록 모든 것을 신선하게 유지하는 것입니다. 이 세 가지를 제대로 하면 방어 가능한 제품이 되고, 잘못하면 신뢰를 떨어뜨리는 오래된 중복된 피드가 됩니다. 이 가이드는 엔지니어링 청사진입니다: 소스 믹스, 표준 중복 제거, 신선도, 구인 SERP 수직, 그리고 법적 경계를 존중하는 것입니다. 이는 정보 제공용이며, 법적 조언이 아닙니다.

소스 1단계: 공개 ATS 엔드포인트

인터넷에서 가장 깨끗한 구인 데이터는 구인 게시판에 있지 않습니다 — 그것은 지원자 추적 시스템으로 구동되는 회사 채용 페이지에 있습니다. 대부분은 구조화된 JSON을 노출합니다. Greenhouse, Lever, Ashby, BambooHR, iCIMS, Paylocity 및 Workday는 모두 직접 요청할 수 있는 목록을 제공합니다. 모든 일곱 개에서 가져오는 오픈 소스 애그리게이터는 병렬로 가져오고 각 플랫폼의 속도 제한에 맞춰 작업자 수를 조정합니다 — 대략 Workday는 50개 동시, Greenhouse/Lever/iCIMS는 30개, BambooHR는 10개, 가장 엄격한 제한자는 5개입니다. 이 단계는 고용주로부터 직접 가져온 표준 제목, 위치, 급여 범위 및 지원 URL을 제공하여 진지한 애그리게이터의 중추가 됩니다.

import httpx

# Greenhouse exposes a public board JSON endpoint per company slug
def fetch_greenhouse(slug: str) -> list[dict]:
    url = f"https://boards-api.greenhouse.io/v1/boards/{slug}/jobs?content=true"
    r = httpx.get(url, timeout=20)
    r.raise_for_status()
    jobs = r.json().get("jobs", [])
    return [{
        "source": "greenhouse",
        "external_id": str(j["id"]),
        "title": j["title"],
        "company": slug,
        "location": (j.get("location") or {}).get("name"),
        "apply_url": j["absolute_url"],
        "updated_at": j.get("updated_at"),
    } for j in jobs]

rows = fetch_greenhouse("examplecompany")
print(len(rows), "roles")

조사할 회사를 찾기 위해서는 수작업이 아닌 웹 인덱스에서 ATS 슬러그를 대량으로 수집하세요 — Common Crawl의 URL 아카이브를 스캔하여 ATS 도메인 패턴을 찾으면 수만 개의 회사 식별자를 발견할 수 있습니다. 그 발견 크롤은 자체적으로 스크래핑 작업입니다; 인덱스가 관대하고 속도가 IP 평판보다 더 중요하기 때문에 데이터센터 프록시 풀을 통해 라우팅하세요.

소스 2단계: 구인 SERP 수직

ATS 피드는 애그리게이터 사이트, 지역 게시판 또는 Google의 자체 구인 경험에만 게시된 모든 것을 놓칩니다. 개별적으로 여러 게시판을 스크래핑하지 않고 그 긴 꼬리를 효율적으로 커버하는 방법은 구인 SERP 수직입니다 — 역할과 위치에 대해 Google이 표면화하는 구인을 반환하는 구조화된 쿼리입니다. 우리의 SERP API는 뉴스, 이미지 및 쇼핑과 함께 구인 수직을 노출하여 키워드와 지리로 역할 목록을 JSON으로 가져와 동일한 파이프라인에 통합할 수 있습니다:

import httpx

def fetch_jobs_serp(query: str, location: str) -> list[dict]:
    r = httpx.get(
        "https://api.quantumproxies.io/serp",
        params={"engine": "google_jobs", "q": query,
                "location": location, "api_key": "QP_API_KEY"},
        timeout=30,
    )
    jobs = r.json().get("jobs", [])
    return [{
        "source": "jobs_serp",
        "external_id": j.get("job_id"),
        "title": j.get("title"),
        "company": j.get("company_name"),
        "location": j.get("location"),
        "apply_url": (j.get("apply_options") or [{}])[0].get("link"),
    } for j in jobs]

serp_rows = fetch_jobs_serp("react developer", "Austin, TX")

대상 도시에서 동일한 쿼리를 일정에 따라 실행하면 단일 ATS 피드가 제공하지 않는 지리적 커버리지를 얻을 수 있습니다. SERP 결과는 위치에 따라 변동하므로 각 쿼리를 지리적으로 타겟팅하세요 — 2026년 SERP 스크래핑 작동 방식에 대한 우리의 게시물은 지리 및 페이지 매김 메커니즘을 다룹니다.

SERP API에서 구인 수직을 가져오기

ATS API, 구인 SERP 및 직접 게시판에서 소싱된 구인 데이터를 보여주는 파이프라인 다이어그램, 그런 다음 표준화, 중복 제거 및 새로 고침
세 개의 소스 계층이 하나의 스키마를 공급합니다; 중복 제거와 신선도 창은 원시 목록을 신뢰할 수 있는 애그리게이터로 변환합니다.

표준 키로 중복 제거

동일한 구인은 회사 사이트, 두 개의 애그리게이터 및 Google 구인 카드에 정기적으로 나타납니다. 네 번 보여주는 것은 고장난 것처럼 보이는 가장 빠른 방법입니다. 표준 수정은 표준 키입니다: 구인 제목, 회사, 위치 및 — 사용 가능한 경우 — 소스의 외부 구인 ID의 조합을 표준화하고 해시합니다. 해시하기 전에 소문자로 변환하고, 구두점을 제거하고, 공백을 축소하여 "Sr. Software Engineer"와 "senior software engineer"가 함께 축소되도록 합니다.

import re, hashlib

def canonical_key(job: dict) -> str:
    def norm(s):
        return re.sub(r"[^a-z0-9]+", " ", (s or "").lower()).strip()
    basis = "|".join([
        norm(job.get("title")),
        norm(job.get("company")),
        norm(job.get("location")),
        (job.get("external_id") or ""),
    ])
    return hashlib.sha1(basis.encode()).hexdigest()

def dedupe(rows: list[dict]) -> list[dict]:
    seen, out = set(), []
    for job in rows:
        k = canonical_key(job)
        if k not in seen:
            seen.add(k)
            out.append(job)
    return out

신선도는 사후 고려가 아닌 기능입니다

구인 게시판의 신뢰성은 그 신선도입니다. 두 가지 메커니즘이 그것을 정직하게 유지합니다: 각 소스를 일정에 따라 다시 가져오기 (대량 ATS 피드의 경우 시간별, 긴 꼬리의 경우 일별), 그리고 롤링 윈도우 내에서 다시 보지 않은 모든 것을 가지치기 — 30일은 합리적인 기본값이며, 빠르게 움직이는 시장의 경우 더 짧습니다. 소스별 마지막으로 본 타임스탬프와 일일 수량을 추적하여 소스가 조용히 고장날 때를 감지할 수 있습니다; 자체 볼륨을 감시하는 애그리게이터는 플랫폼의 수치가 급격히 떨어질 때 경고를 열 수 있습니다. 프로덕션 소프트웨어로 스크래퍼 실행하기에 대한 우리의 노트는 일정 관리, 드리프트 감지 및 경고를 다룹니다.

존중해야 할 법적 경계

구인 데이터는 스크래핑 법이 현실화되는 곳입니다, 왜냐하면 게시물에는 개인 데이터(채용 담당자 이름, 연락처 정보)가 포함될 수 있고 상세한 설명은 저작권이 있을 수 있기 때문입니다. 프랑스의 데이터 보호 당국은 LinkedIn 연락처 데이터를 적절한 동의 없이 스크래핑한 KASPR 회사에 €240,000의 벌금을 부과했습니다; GDPR 벌금은 €2천만 또는 전 세계 매출의 4%에 이를 수 있으며, 저작권 손해는 미국 사례에서 작업당 $150,000에 이른 적이 있습니다. 더 안전한 자세는 구조적입니다: 승인된 ATS 피드와 구인 SERP를 선호하고 로그인 벽이 있는 게시판을 무차별 공격하는 것을 피하며, 전체 저작권 설명을 재게시하는 대신 사실적 필드(제목, 회사, 위치)를 저장하고 필요하지 않은 개인 데이터를 제거하세요. 2026년 웹 스크래핑 합법성에 대한 우리의 개요와 LinkedIn 준수 사가는 더 깊이 다룹니다.

LinkedIn 스크래핑으로 인한 KASPR의 240,000 유로 벌금과 30일 신선도 창을 보여주는 7개의 ATS 플랫폼 통계 패널
구조화된 ATS 피드와 표준 중복 제거는 비용, 커버리지 및 법적 노출에서 무차별 HTML 스크래핑을 능가합니다.

프록시의 역할

ATS 계층은 거의 주거 IP가 필요하지 않지만, 발견 크롤, SERP 수직 및 모든 직접 게시판 스크래핑은 필요합니다 — Google과 더 큰 게시판은 IP로 속도 제한을 하고 결과를 지리적으로 변동시킵니다. 각 도시 쿼리가 일치하는 위치에서 오는 것처럼 회전 주거 프록시를 통해 요청별 회전 및 지리적 타겟팅을 사용하여 라우팅하세요. 계층을 분리하세요: 관대한 인덱스에는 저렴한 데이터센터, 민감한 대상에는 주거용을 사용하세요.

자주 묻는 질문

구인 게시판 애그리게이터란 무엇인가요?

구인 게시물에 대한 검색 엔진으로, 여러 소스 — 회사 채용 페이지, ATS 플랫폼, 다른 게시판 및 구인 SERP — 에서 목록을 수집하여 하나의 스키마로 표준화하고, 중복을 제거하며, 구직자에게 단일 검색 가능한 장소로 제공합니다. 엔지니어링 작업은 소싱, 중복 제거 및 신선도에 있으며, 단순한 스크래핑에 그치지 않습니다.

여러 소스에서 구인 목록을 어떻게 중복 제거하나요?

구인 제목, 회사, 위치 및 소스의 외부 구인 ID를 표준화하고 해시하여 표준 키를 만드세요. 먼저 소문자로 변환하고, 구두점을 제거하고, 공백을 축소하여 변형된 철자가 함께 축소되도록 합니다. 첫 번째 발생을 유지하고 일치 항목을 삭제하세요. 이는 고용주 사이트, 애그리게이터 및 Google 구인에 나타나는 동일한 역할을 잡아냅니다.

구인 게시판 스크래핑은 합법인가요?

소스, 데이터 및 귀하의 관할권에 따라 다릅니다. 공개된 사실적 목록 필드는 개인 데이터나 전체 저작권 설명보다 위험이 낮으며, 로그인 벽을 우회하는 것은 CFAA 스타일의 노출을 증가시킵니다. 승인된 ATS 피드와 구인 SERP는 더 깨끗한 경로입니다. 개인 데이터를 스크래핑한 기업은 무거운 벌금을 부과받았습니다 — 상업적 사용을 위해 법적 조언을 받으세요.

집계된 구인 데이터는 얼마나 신선해야 하나요?

ATS 피드와 같은 대량 소스를 시간별로 다시 가져오고 긴 꼬리는 일별로 다시 가져온 다음 롤링 윈도우 내에서 다시 보지 않은 모든 목록을 가지치기하세요 — 30일은 일반적인 기본값입니다. 구인별 마지막으로 본 타임스탬프를 추적하고 소스별 볼륨을 모니터링하여 사용자가 오래된 역할을 보기 전에 고장난 소스를 잡아내세요.

집계를 세 가지 문제로 취급하세요 — 소스, 중복 제거, 신선도 — 그러면 스크래핑은 지원 세부 사항이 됩니다. 깨끗한 ATS 피드와 구인 SERP 수직을 선도하고, 표준 키로 중복 제거하며, 공격적으로 가지치기하고, 민감한 크롤은 회전 주거 IP에서 유지하세요. 그것이 사람들이 신뢰하는 제품과 죽은 링크의 묘지의 차이입니다.

Scraper API로 애그리게이터를 강화하세요