scrapy
무엇인가
Scrapy는 파이썬으로 작성된 오픈소스 웹 크롤링·스크래핑 프레임워크다. HTTP 요청을 스케줄링해 여러 페이지를 순회하고, 응답에서 뽑아낸 값을 구조화된 레코드로 내보내는 작업을 프레임워크 수준에서 다룬다. 단일 스크립트가 아니라 스파이더·미들웨어·파이프라인으로 역할이 나뉜 실행 엔진이며, Zyte가 유지보수한다.
어떻게 동작하나
실행 흐름은 Spider에서 시작한다. Spider가 start_urls 또는 start_requests()로 초기 Request를 만들면 Scheduler가 이를 큐에 넣고 중복 URL 필터를 통과시킨다. Downloader가 Twisted 기반 비동기 이벤트 루프에서 요청을 수행하고, Downloader Middleware가 요청·응답을, Spider Middleware가 파싱 입출력을 가공한다. Spider의 parse 콜백이 Response에서 Item 또는 새 Request를 반환하면 Item Pipeline이 검증·정제·저장을 맡는다. 결과는 Feed Export로 JSON, JSON Lines, CSV, XML 형태로 파일이나 원격 저장소에 기록한다.
무엇과 다른가
requests와 BeautifulSoup을 조합한 스크립트는 페이지 하나를 가져와 파싱하는 데는 충분하지만, 크롤 큐·중복 제거·재시도·동시성 제한·지연 조절을 직접 작성해야 한다. Scrapy는 이 요소를 프레임워크에 내장하고 settings.py 값으로 제어한다. BeautifulSoup이나 lxml이 파서 라이브러리인 반면 Scrapy는 파싱 결과를 수집 파이프라인까지 연결하는 실행 환경이다. 브라우저 렌더링이 필요한 페이지는 기본 Downloader로 처리되지 않으며 scrapy-playwright 같은 별도 미들웨어를 붙여야 한다.
어떻게 쓰나
pip install scrapy로 설치한 뒤 scrapy startproject <name>으로 프로젝트를 만들고 scrapy genspider로 스파이더를 생성한다. scrapy crawl <spider>로 실행하며, scrapy shell로 응답을 대화형으로 검사한다. 프로젝트 루트의 scrapy.cfg가 설정 모듈 위치를 지정하고, settings.py에서 동시 요청 수(CONCURRENT_REQUESTS), 다운로드 지연, robots.txt 준수 여부, AutoThrottle, User-Agent, 미들웨어와 파이프라인 활성화를 설정한다. scrapy crawl <spider> -o out.json처럼 -o 옵션으로 출력 형식을 지정한다.
전제와 한계
Python 3.10 이상이 필요하고 Windows, macOS, Linux에서 동작한다. 기본 설정은 robots.txt를 준수하며, 대상 사이트의 크롤링 정책과 이용약관은 사용자가 확인해야 한다. JavaScript로 렌더링되는 콘텐츠, 로그인 세션, CAPTCHA는 기본 구성만으로 처리되지 않는다. Twisted 리액터 위에서 돌기 때문에 asyncio 기반 코드와 섞을 때는 명시적인 통합이 필요하다.
유사 도구
- Scrapling적응형 파서와 안티봇 우회 fetcher, Scrapy 스타일 스파이더를 한 라이브러리에 묶은 Python 웹 스크래핑·크롤링 프레임워크다.
- firecrawl웹 페이지를 검색·스크래핑·크롤링해 LLM이 읽는 Markdown이나 구조화 JSON으로 변환하는 API 서버이자 CLI다.
- crawleeNode.js용 웹 스크래핑·브라우저 자동화 라이브러리다. HTTP와 헤드리스 브라우저를 같은 인터페이스로 다루고 프록시 회전과 요청 큐를 내장한다.
- wigoloAI 에이전트에 검색·fetch·크롤·추출·캐시를 MCP 한 표면으로 제공하는 로컬 우선 웹 계층이다. API 키 없이 공개 엔진을 직접 호출하고 결과를 ~/.wigolo/에 캐시한다.
- llama_index사설 데이터를 수집·구조화해 LLM이 검색·질의할 수 있게 하는 Python 프레임워크다. 코어와 300여 개 통합 패키지를 조합해 RAG·에이전트 앱을 만든다.