crawl4ai
무엇인가
Crawl4AI는 페이지 수집과 LLM 입력 생성을 한 프로세스로 합친 크롤링 라이브러리다. HTTP 요청으로 HTML을 받아 파서로 본문을 뽑고 다시 Markdown으로 직렬화하는 조합을 대체하는 자리에 놓인다. 출력 단위가 원시 HTML이나 아이템 목록이 아니라 Markdown 문서와 JSON 레코드라는 점이 이 계열 안에서의 위치를 정한다.
어떻게 동작하나
중심은 `AsyncWebCrawler`다. `arun()`은 단일 URL, `arun_many()`는 URL 목록을 받아 Playwright 기반 브라우저 풀에서 렌더링하고, `BrowserConfig`와 `CrawlerRunConfig`가 브라우저·세션·프록시·쿠키·훅을 지정한다. 수집한 DOM은 `DefaultMarkdownGenerator`를 거치며, `PruningContentFilter`나 `BM25ContentFilter`가 노이즈를 제거해 `fit_markdown`을 만든다. 링크는 번호가 붙은 참조 목록으로 변환된다. 구조화 추출은 `JsonCssExtractionStrategy`가 XPath·CSS 선택자로, `LLMExtractionStrategy`가 청킹과 코사인 유사도 기반 청크 선택으로 처리한다. 대량 실행은 `MemoryAdaptiveDispatcher`·`SemaphoreDispatcher`가 동시성을 조절하고, 딥 크롤은 `resume_state`와 `on_state_change` 콜백으로 중단 지점부터 재개한다.
무엇과 다른가
Scrapy가 스파이더와 규칙 기반 파이프라인을 중심에 두고 브라우저 렌더링을 별도 미들웨어로 붙이는 반면, 여기서는 단일 URL 호출이 기본 단위이고 렌더링이 기본 경로다. 호스팅 스크래핑 API와 달리 계정·API 키·호출 과금 없이 로컬에서 돌고, Docker로 자체 서버를 세울 수 있다. Playwright를 단독으로 쓰는 경우와 비교하면 추출·정제·Markdown 변환 단계가 이미 안에 들어 있다.
어떻게 쓰나
설치는 `pip install crawl4ai`이고, 브라우저 바이너리는 별도 설치 명령으로 받는다. Python에서는 `AsyncWebCrawler().arun(url)` 결과의 `markdown` 속성을 읽는 것이 최소 사용법이다. 같은 기능을 CLI로 호출할 수 있고, Docker 이미지로 API 서버를 띄우면 토큰 인증 아래 HTTP로 크롤을 요청한다.
전제와 한계
Python 실행 환경과 Playwright 브라우저 바이너리가 전제다. LLM 기반 추출은 외부 LLM 제공자 키를 요구한다. 브라우저 렌더링 경로는 정적 HTTP 요청보다 느리고 자원을 더 쓴다. Docker API 서버는 토큰이 없으면 루프백에만 바인딩되며, 요청 본문은 신뢰 경계 밖으로 취급된다. PDF 처리 경로와 Docker Playground에는 임의 파일 쓰기·SSRF·서비스 거부·XSS 권고가 있었고 v0.9.3에서 수정됐다.
유사 도구
- firecrawl웹 페이지를 검색·스크래핑·크롤링해 LLM이 읽는 Markdown이나 구조화 JSON으로 변환하는 API 서버이자 CLI다.
- crawleeNode.js용 웹 스크래핑·브라우저 자동화 라이브러리다. HTTP와 헤드리스 브라우저를 같은 인터페이스로 다루고 프록시 회전과 요청 큐를 내장한다.
- browser-useLLM이 브라우저를 직접 조작하도록 만드는 파이썬 에이전트 라이브러리다. 자연어 작업을 주면 페이지를 읽고 클릭·입력·스크롤을 스스로 결정해 실행한다.
- playwrightChromium, Firefox, WebKit을 단일 API로 구동하는 웹 자동화·E2E 테스트 프레임워크다. 테스트 러너, CLI, MCP 서버, 라이브러리를 함께 제공한다.
- markitdownPDF·오피스 문서·이미지·오디오를 Markdown으로 변환해 LLM 파이프라인에 넣는 Python CLI 겸 라이브러리다. 문서 구조를 보존한다.
- doclingPDF·DOCX·PPTX 등 여러 문서 형식을 레이아웃과 표 구조까지 해석해 Markdown·JSON으로 내보내는 Python 라이브러리 겸 CLI다.