Scrapling: 사이트가 바뀌어도 안 깨지는 파이썬 크롤러
Scrapling: 사이트가 바뀌어도 안 깨지는 파이썬 크롤러
웹에서 데이터를 긁어본 적 있나요? 참고 자료를 모으거나, 가격을 비교하거나, 튜토리얼 목록을 뽑거나요.
처음엔 잘 돌아가요. 그런데 2주쯤 지나면 이런 일이 생겨요. 어제까지 100개씩 가져오던 스크립트가 오늘 아침엔 빈 목록을 뱉어요. 코드는 한 줄도 안 건드렸는데요.
범인은 보통 사이트예요. 개발자가 class="product-title"을 class="ProductTitle_a8f2"로 바꿨을 뿐인데, 내 코드는 그걸 못 찾는 거죠.
오늘 소개할 Scrapling은 이 문제를 정면으로 다루는 파이썬 라이브러리예요.
Scrapling이 뭐예요?
파이썬으로 웹페이지를 가져오고, 원하는 정보만 골라내는 도구예요. 이름은 스크래핑(scraping, 긁어오기)에서 왔어요.
기본 정보부터 볼게요.
- 만든 사람: D4Vinci
- 주소: github.com/D4Vinci/Scrapling
- 버전: 0.4.11 (2026년 7월 기준)
- 라이선스: BSD-3-Clause. 상업적으로 써도 돼요
- 필요 환경: 파이썬 3.10 이상
- 깃허브 별: 7만 개 이상
기존에 이 일을 하던 조합은 보통 셋이었어요. requests로 가져오고, BeautifulSoup으로 파싱하고, 자바스크립트로 그려지는 페이지는 Selenium을 켜는 식이죠. Scrapling은 이 셋이 하던 일을 하나의 문법 안에 넣었어요.
1. 셀렉터가 깨져도 알아서 다시 찾아요
Scrapling의 간판 기능이에요. 공식 문서에서는 Smart Element Tracking, 우리말로 옮기면 똑똑한 요소 추적이라고 불러요.
원리는 이래요. 처음 성공했을 때 그 요소가 어떻게 생겼는지를 기억해 둬요. 태그 종류, 부모 자식 관계, 형제 요소의 배치, 텍스트 모양 같은 것들을요. 나중에 지정한 셀렉터가 안 먹으면, 기억해 둔 생김새와 가장 비슷한 요소를 찾아서 대신 돌려줘요.
사람이 하는 일과 비슷해요. 우리도 쇼핑몰 리뉴얼 후에 버튼 색이 바뀌어도 "장바구니" 버튼을 금방 찾잖아요. 위치와 모양이 비슷하니까요.
덕분에 사이트가 클래스 이름을 갈아엎어도 스크립트가 바로 죽지는 않아요. 물론 구조 자체를 통째로 새로 짜면 손을 봐야 해요. 마법은 아니에요.
2. 상황에 따라 세 가지 방식으로 가져와요
웹페이지를 가져오는 방법은 하나가 아니에요. 상황에 따라 난이도가 달라요.
| 가져오는 방식 | 속도 | 자바스크립트 | 봇 차단 뚫기 |
|---|---|---|---|
Fetcher | 가장 빠름 | 안 됨 | 약함 |
DynamicFetcher | 보통 | 됨 | 보통 |
StealthyFetcher | 보통 | 됨 | 가장 강함 |
고르는 법은 간단해요. 맨 위부터 쓰고, 안 될 때만 한 칸씩 내려가요. 아래로 갈수록 크롬 브라우저를 실제로 띄우기 때문에 느리고 메모리도 많이 먹거든요.
어떤 상황에 내려가야 할까요.
- 결과가 텅 비어 있거나 뼈대만 온다 → 자바스크립트로 그려지는 페이지예요.
DynamicFetcher - 403이 뜨거나 클라우드플레어 확인 화면이 온다 → 봇으로 걸린 거예요.
StealthyFetcher
중요한 건 셋 다 똑같은 응답 객체를 돌려준다는 점이에요. 그래서 방식을 바꿔도 파싱 코드는 그대로예요. 고칠 게 한 줄뿐이죠.
from scrapling.fetchers import Fetcher, DynamicFetcher, StealthyFetcher
page = Fetcher.get('https://example.com', impersonate='chrome')
page = DynamicFetcher.fetch('https://example.com', network_idle=True)
page = StealthyFetcher.fetch('https://example.com', solve_cloudflare=True)
Selenium을 써본 분은 이 부분이 반가울 거예요. 보통은 브라우저 자동화로 갈아탈 때 코드 구조를 다시 짜야 하니까요.
3. 파싱 문법이 짧아요
가져온 페이지에서 원하는 값만 꺼내는 부분이에요.
page.css('.product h2::text').get() # 첫 번째 제목
page.css('.price::text').getall() # 가격 전부
page.css('a::attr(href)').get() # 링크 주소
page.xpath('//h1/text()').get() # XPath도 됨
::text와 ::attr()이 편해요. 요소를 뽑은 다음에 다시 .text를 부르지 않고, 셀렉터 안에서 바로 값까지 꺼내요.
BeautifulSoup 문법이 손에 익은 분을 위해 find_all('div', class_='x') 같은 메서드도 그대로 있어요. 텍스트로 찾는 find_by_text('로그인'), 정규식으로 찾는 find_by_regex(r'₩[\d,]+')도 있고요.
4. 코드 없이 페이지를 읽을 수도 있어요
그냥 페이지 하나 읽고 싶을 때가 있잖아요. 그럴 땐 파이썬 파일을 만들 필요가 없어요. 터미널에서 바로 돼요.
scrapling extract get 'https://example.com' out.md
scrapling extract get 'https://example.com' out.txt --css-selector '#content'
scrapling extract stealthy-fetch 'https://example.com' out.html --solve-cloudflare
확장자에 따라 형식이 정해져요. .md면 마크다운, .txt면 순수 텍스트, .html이면 원본이에요.
AI에게 페이지를 읽히는 상황이면 --css-selector가 특히 유용해요. 광고와 메뉴를 걷어내고 본문만 남기니까 넘겨야 할 글자 수가 확 줄거든요.
5. 클로드나 커서에 바로 붙일 수 있어요
Scrapling에는 MCP 서버가 들어 있어요. Claude Code나 Cursor 같은 AI 도구가 외부 기능을 끌어다 쓰는 표준 통로예요.
연결해 두면 AI에게 "이 페이지 읽고 표로 정리해줘"라고 말했을 때, AI가 직접 Scrapling을 불러서 가져와요. 크롤링 코드를 짜라고 시키고 그 코드를 다시 실행하는 단계가 사라져요.
속도는 어느 정도인가요
공식 저장소에 있는 측정값이에요. 5000개가 중첩된 요소에서 텍스트를 뽑는 테스트예요.
- Scrapling: 1.98ms
- BeautifulSoup + lxml: 1535.19ms
- BeautifulSoup + html5lib: 3388.16ms
lxml 조합 기준으로 약 775배 차이예요. 만든 쪽에서 잰 숫자라는 점은 감안해서 보세요. 다만 페이지 몇천 개를 도는 작업이면 이 차이는 체감돼요.
설치는 이렇게 해요
pip install "scrapling[fetchers]" "scrapling[shell]"
scrapling install
여기서 자주 걸리는 지점이 두 개 있어요.
첫째, scrapling install을 빼먹으면 안 돼요. 이건 크롬 실행 파일을 받아오는 별도 단계예요. 안 하면 브라우저 방식에서 Executable doesn't exist 오류가 나요.
둘째, [shell] 옵션을 빼면 CLI로 마크다운을 뽑을 때 ModuleNotFoundError: markdownify가 떠요. 두 옵션 다 넣는 게 편해요.
전체 흐름 한 번에 보기
from scrapling.fetchers import Fetcher
page = Fetcher.get('https://quotes.toscrape.com/', impersonate='chrome')
if page.status != 200:
raise RuntimeError(f'가져오기 실패: {page.status}')
rows = [
{
'text': q.css('.text::text').get(),
'author': q.css('.author::text').get(),
'tags': q.css('.tag::text').getall(),
}
for q in page.css('.quote')
]
가져오고, 상태 코드를 확인하고, 필요한 값만 딕셔너리로 담는 순서예요. .get()은 못 찾으면 오류를 내지 않고 None을 돌려줘요. 그래서 값이 비어 있을 수 있는 항목은 나중에 None 처리를 해줘야 해요. 안 그러면 이상한 행 하나 때문에 전체가 멈춰요.
쓰기 전에 챙길 것
도구가 좋아질수록 예의가 중요해져요.
- 요청 사이에 간격을 둬요. 상대 서버도 남의 컴퓨터예요
- 사이트 이용약관과 robots.txt를 확인해요
- 개인정보는 수집하지 않아요
- 로그인 뒤에 있는 데이터는 대체로 선을 넘는 영역이에요
기술적으로 뚫린다고 해서 가져와도 된다는 뜻은 아니에요.
정리하면
Scrapling이 해결하는 건 세 가지예요.
사이트가 바뀌어도 셀렉터가 덜 깨지고, 정적 페이지부터 클라우드플레어까지 같은 문법으로 다루고, 간단한 읽기는 터미널 한 줄로 끝나요.
크롤러를 짜다가 유지보수에 지친 적이 있다면 한 번 볼 만해요.
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기