본문 바로가기
AI.IT

Scrapling 스크래핑 프레임워크, 깨진 셀렉터를 다시 찾는 방식

by bamsik 2026. 5. 27.
반응형

Scrapling 스크래핑 프레임워크는 웹사이트 구조가 바뀔 때마다 깨지는 셀렉터 문제를 줄이려는 Python 도구다. 영상에서는 안티봇 우회가 크게 강조됐지만, 실제로 더 중요한 포인트는 “데이터를 한 번 긁는 것”보다 “나중에 덜 고치는 것”에 가깝다.

핵심 답변: Scrapling은 무엇이 다른가

답부터 말하면, Scrapling은 CSS 선택자나 XPath만 믿는 기존 스크래퍼의 약점을 보완하려는 적응형 웹 스크래핑 프레임워크다. 공식 README 기준으로 Scrapling은 요소의 태그, 속성, 주변 DOM 구조 같은 힌트를 저장해뒀다가, 페이지 구조가 바뀐 뒤에도 비슷한 요소를 다시 찾는 방식을 지원한다.

이게 중요한 이유는 단순하다. 실무에서 스크래퍼가 제일 귀찮은 순간은 처음 만드는 때가 아니라, 잘 돌던 수집 코드가 어느 날 갑자기 빈 배열만 뱉을 때다. 클래스명이 바뀌거나 카드 구조가 조금 달라졌는데, 그걸 매번 사람이 따라가며 고치는 일. Scrapling은 그 유지보수 비용을 줄이는 방향으로 설계된 도구에 가깝다.

영상 제목에는 Cloudflare 우회가 강하게 들어가 있지만, 나는 그보다 “깨진 셀렉터를 어떻게 다시 찾을 것인가”가 더 현실적인 관전 포인트라고 봤다. 안티봇 대응은 사이트 정책, 트래픽 패턴, 보호 설정에 따라 결과가 달라질 수 있기 때문이다.

셀렉터가 깨졌을 때 다시 찾는 방식

기존 방식은 대체로 명확하다. .product-card .title 같은 CSS 선택자를 박아두고, DOM이 그대로 유지되길 기대한다. 문제는 웹사이트가 그렇게 친절하지 않다는 점이다. 디자인 개편, A/B 테스트, 프론트엔드 빌드 변경만으로도 선택자는 쉽게 무너진다.

Scrapling의 적응형 스크래핑은 처음 찾은 요소의 특징을 저장하고, 나중에 구조가 달라졌을 때 유사도 기반으로 대상 요소를 다시 찾는 흐름을 내세운다. 공식 문서와 README에는 adaptive=True, auto_save=True 같은 예시가 나오고, find_similar()처럼 비슷한 구조의 반복 요소를 찾는 API도 소개돼 있다.

예를 들어 쇼핑몰 상품 리스트, 리뷰 목록, 테이블 행처럼 패턴이 반복되는 데이터는 한두 개의 기준 요소만 잡아도 주변의 비슷한 항목을 이어서 찾을 수 있다. 이건 “AI가 알아서 다 긁어준다”라기보다, DOM 구조를 더 풍부하게 활용하는 파서에 가깝다. 그래서 오히려 마음에 든다. 과장보다 실용 쪽이다.

성능 수치도 있다. 공식 README의 CSS selection 벤치마크에서는 5,000개 중첩 요소 기준으로 Scrapling이 2.02ms, BS4 with Lxml이 1584.31ms로 약 784.3배 차이를 보였다고 설명한다. 다만 이건 특정 선택 작업의 평균 수치다. 전체 크롤링 속도, 네트워크 지연, 자바스크립트 렌더링, 차단 대응 성능까지 대표하는 숫자로 읽으면 곤란하다.

Fetcher·Spider·MCP까지 한 번에 묶은 구조

Scrapling은 파서만 던져놓은 라이브러리가 아니라, 가져오기 단계까지 같이 다룬다. 기본 HTTP 요청에 가까운 Fetcher, Playwright 기반 동적 페이지 대응에 가까운 DynamicFetcher, 더 강한 anti-bot 환경을 겨냥한 StealthyFetcher가 대표적이다.

공식 README는 StealthyFetcher가 Cloudflare Turnstile 같은 anti-bot 시스템 대응을 제공한다고 설명한다. 여기서 조심해야 한다. 이걸 “무조건 뚫는다”로 받아들이면 안 된다. 실제 사이트의 약관, robots.txt, 개인정보 처리 기준, 요청량 제한을 지키는 범위에서만 검토해야 한다. 기술적으로 가능하다는 말과 해도 된다는 말은 다르다.

대규모 수집 쪽에서는 Spider 프레임워크도 들어간다. concurrent multi-session crawl, pause/resume, proxy rotation 같은 기능이 언급된다. 크롤링이 중간에 끊겼을 때 이어서 돌리거나, 도메인별 요청 속도를 조절하는 흐름을 한 라이브러리 안에서 처리하려는 방향이다.

또 하나 흥미로운 건 MCP 서버와 CLI다. Claude나 Cursor 같은 AI 도구와 연결해 페이지 전체 HTML을 통째로 넘기기보다, 필요한 선택자 중심으로 컨텍스트를 줄이는 방향을 제시한다. AI 에이전트에 웹 수집 도구를 붙여본 입장에서는 이 부분이 꽤 현실적인 문제를 건드린다. HTML 전체를 LLM에 던지면 토큰도 많이 쓰고, 노이즈도 많다.

도입 전 확인할 것

Scrapling은 PyPI 기준 0.4.8 버전이고 Python 3.10 이상을 요구한다. 라이선스는 BSD 3-Clause다. 아직 빠르게 바뀌는 도구일 가능성이 있으니, 바로 프로덕션 핵심 파이프라인에 넣기보다는 작은 수집 작업에서 먼저 검증하는 편이 낫다.

내가 본 기준으로는 “안티봇 우회 도구”로만 소비하기엔 아깝다. 그 프레임은 위험하기도 하고, 도구의 진짜 장점을 좁게 만든다. Scrapling의 더 좋은 사용처는 자주 바뀌는 페이지, 반복 구조가 많은 목록, 기존 BeautifulSoup 코드의 유지보수가 점점 귀찮아지는 구간이다.

도입 체크는 이렇게 잡으면 된다. 첫째, 수집 대상 사이트의 약관과 robots.txt를 확인한다. 둘째, 기존 CSS 선택자가 자주 깨지는지 본다. 셋째, JavaScript 렌더링이 필요한 페이지인지 구분한다. 넷째, README 벤치마크가 내 데이터 구조에서도 비슷하게 의미 있는지 작게 재현한다.

자주 묻는 질문

Scrapling은 BeautifulSoup을 대체할 수 있나?
단순 HTML 파싱만 한다면 BeautifulSoup도 여전히 충분하다. 다만 선택자 유지보수, 동적 페이지, 반복 요소 탐색, 수집 파이프라인까지 한 번에 묶고 싶다면 Scrapling을 비교해볼 만하다.

Cloudflare Turnstile을 항상 우회할 수 있나?
그렇게 쓰면 안 된다. 공식 README는 anti-bot 대응 기능을 설명하지만, 실제 성공률은 사이트 설정과 탐지 정책에 따라 달라진다. 허가된 데이터 수집과 서비스 약관 준수가 먼저다.

AI 에이전트와 연결할 때 의미가 있나?
있다. MCP 서버를 통해 필요한 부분만 추출하면 페이지 전체 HTML을 LLM에 넣는 방식보다 컨텍스트를 줄일 수 있다. 다만 이 부분도 실제 프로젝트에서는 인증, 세션, 보안 정책을 따로 점검해야 한다.

참고 자료
오늘노트 YouTube 영상
Scrapling GitHub README
PyPI scrapling 패키지
Scrapling 공식 문서


📌 함께 보면 좋은 글

반응형