웹 스크래핑을 위한 Scrapy 대 Puppeteer

웹 스크래핑에 널리 쓰이는 두 가지 도구인 Puppeteer와 Scrapy에 대해 알아보세요.
1 분 읽기
Scrapy vs Puppeteer

TL;DR

  • Scrapy는 웹 스크래핑을 위해 클래스와 파이프라인 구조에 대한 지식이 필요한 Python 프레임워크입니다.
  • Puppeteer는 탐색 및 요소 상호작용 기능을 갖춘 Node.js 헤드리스 브라우저 도구입니다.
  • Scrapy는 HTTP 요청을 통해 수십 개의 페이지를 초 단위 미만의 지연 시간으로 비동기적으로 처리합니다.
  • Puppeteer는 모든 리소스를 다운로드하고 전체 페이지를 렌더링하므로 속도가 느리고 리소스 소모가 큽니다.
  • Scrapy는 대량의 정적 페이지 스크래핑에 탁월하지만 동적 콘텐츠에는 미들웨어가 필요합니다.
  • Puppeteer는 동적 사이트, 사용자 상호작용, JavaScript 렌더링 및 스크린샷 생성을 기본적으로 처리합니다.

ChatGPT나 Gemini와 같은 AI 어시스턴트는 대규모 언어 모델(LLM)이 훈련된 방대한 콘텐츠가 없었다면 결코 탄생하지 못했을 것입니다. 이 콘텐츠의 상당 부분은 웹 스크래핑을 통해 획득되었습니다.

웹 스크래핑은 LLM 훈련에 유용할 뿐만 아니라 시장 분석, 가격 모니터링, 리드 생성에도 활용될 수 있습니다.

이 글에서는 웹 스크래핑에 널리 사용되는 두 가지 도구인 Scrapy와 Puppeteer를 비교합니다. Scrapy는 웹 스크래핑을 염두에 두고 설계된 반면, Puppeteer는 헤드리스 브라우저 에뮬레이션 프레임워크입니다. Scrapy는 Python용으로, Puppeteer는 Node.js용으로 개발되었다는 점을 참고할 필요가 있습니다. 다만 Puppeteer의 Python 포팅 버전인 pyppeteer가 존재합니다.

본문에서는 각 도구의 사용 편의성, 스크래핑 속도, 기능, 커뮤니티 지원, 활용 사례를 살펴볼 것입니다. 글을 마치면 여러분에게 적합한 도구가 무엇인지 더 명확히 이해할 수 있을 것입니다.

Scrapy vs. Puppeteer: 사용 편의성

Scrapy는 시작하기 전에 클래스에 대한 지식이 필요한 완전한 프레임워크입니다. 예를 들어 Scrapy의 핵심 클래스는 스파이더(spider)로, 어떤 페이지를 크롤링하고 어떤 요소를 파싱할지 정의합니다. 아이템(item), 셀렉터(selector), ItemLoader 등 수많은 다른 클래스도 존재합니다. 그리고 이 모든 클래스는 파이프라인(pipeline) 개념 내에서 사용하는 것이 가장 효과적입니다.

문서는 방대하지만, Scrapy를 사용하려면 코드 구조에 대한 사전 지식이 필요합니다.

터미널에서 다음 명령어를 실행하여 Scrapy를 설치하고 프로젝트 구조를 생성할 수 있습니다:

pip install scrapy
scrapy startproject <project_name>

이에 비해 Puppeteer는 단순히 헤드리스 브라우저 조작에 사용할 수 있는 다양한 기능을 제공합니다: 웹사이트로 이동하고 요소를 선택하거나 클릭하는 등. 코드를 적절히 구조화하는 것은 개발자의 몫입니다.

Puppeteer 시작은 단 한 줄의 명령어로 가능합니다. 특별한 프로젝트 구조를 만들 필요도 없습니다:

npm install puppeteer

반면 Puppeteer는 헤드리스 브라우저 조작에 활용할 수 있는 다양한 기능만을 제공합니다: 웹사이트로 이동하거나 요소를 선택/클릭하는 등. 코드 구조는 개발자가 직접 적절히 설계해야 합니다.

Puppeteer 시작은 단 한 줄의 명령어로 가능합니다. 특별한 프로젝트 구조를 만들 필요 없습니다:

npm install puppeteer

Scrapy vs. Puppeteer: 성능

접근 방식의 차이로 인해 Scrapy와 Puppeteer는 스크래핑 속도 측면에서 크게 다릅니다.

Scrapy는 서버에 HTTP 요청을 보내고 해당 단일(주로 HTML) 리소스에 대한 응답을 처리합니다. 이 접근 방식 덕분에 Scrapy는 수십 개의 페이지를 비동기적으로 처리하고, DOM을 탐색하며, 필요한 요소를 선택하는 모든 작업을 1초 미만의 지연 시간으로 수행할 수 있습니다.

Puppeteer는 완전히 다른 접근 방식을 취합니다. 브라우저 에뮬레이션 소프트웨어로서 웹사이트로 이동하여 모든 리소스(이미지나 외부 스크립트 등)를 다운로드하고 브라우저 메모리에 로드합니다. 비동기적으로 여러 헤드리스 브라우저를 실행하는 것은 기기 성능에 큰 부담을 주어 스크래핑 절차를 더욱 방해할 수 있으므로 권장되지 않습니다. 분명히 Puppeteer는 속도 면에서 뛰어나지 않습니다.

Scrapy vs. Puppeteer: 주요 기능

Scrapy는 세 가지 주목할 만한 기능을 갖추고 있습니다—Scrapy 셸, 미들웨어, 계약:

  • Scrapy shell
  • Scrapy는 특정 사용 사례를 처리하기 위해 미들웨어 클래스를 통해 다양한 다른 라이브러리와 통합을 지원합니다. 예를 들어, Chompjs는 JavaScript 객체 파싱에 사용될 수 있으며, Python용 Playwright는 동적으로 로드되는 콘텐츠가 있는 웹사이트를 탐색하기 위해 스파이더 내에서 사용될 수 있습니다. 이러한 기능들은 Scrapy 미들웨어 클래스를 사용하여 Scrapy에 쉽게 통합될 수 있습니다.
  • 스파이더가 로드한 페이지가 기대에 부합하는지 확인하는 일종의 테스트인 계약(contract)으로 스파이더를 제한할 수 있습니다. 예를 들어 페이지 로딩 속도가 충분히 빠른지, 필요한 수의 요소를 포함하는지 테스트하는 계약을 추가할 수 있습니다. 사용자 정의 계약을 개발하는 것도 가능합니다.

Scrapy는 또한 안티봇 조치에 의해 차단되는 것을 방지하기 위한 풍부한 기능 세트를 자랑합니다. 여기에는 프록시 서버 통합 및 브라우저 지문(예: User-Agent) 회전이 포함됩니다.

퍼피티어(Puppeteer)는 스크린샷 생성, 상호작용, 타임라인 추적 등 독특한 기능도 제공합니다. 퍼피티어는 완전한 브라우저를 에뮬레이트하므로 웹 페이지를 전체적으로 렌더링합니다. 그 결과 렌더링된 페이지를 스크린샷이나 PDF로 변환할 수 있습니다.

Puppeteer는 동적 웹사이트 렌더링에도 문제없으며, 상호작용을 위한 필수 도구도 제공합니다. 요소 선택, 텍스트 삽입, 버튼 클릭을 통해 양식 제출까지 가능하며, 이는 Puppeteer 선택의 주요 이유 중 하나입니다(후술).

Puppeteer는 회전 프록시도 지원하며, 브라우저 매개변수를 개별적으로 조정하여 브라우저 지문을 조작할 수 있습니다. 이러한 매개변수를 수동으로 조정하기 어려운 경우, Puppeteer에는 작업을 용이하게 해주는stealth라는 플러그인도 있습니다.

Puppeteer의 또 다른 흥미로운 기능은 웹 성능 감사 생성이 가능합니다. 이는 웹사이트 테스트에 유용할 뿐만 아니라, 웹사이트 서버가 스파이더를 제한하는지 식별하는 데도 활용할 수 있습니다:

Scrapy vs. Puppeteer: 커뮤니티 지원

2024년 2월 28일 기준, Scrapy는 GitHub에서 1,800명의 팔로워와 52,000개의 스타를 보유하고 있으며, 다양한 사용자들의 커밋이 거의 매일 이루어지고 있습니다. Scrapy는 또한 매주 여러 질문이 올라오고 대부분 6개 이상의 답변을 받는 Reddit 커뮤니티를 보유하고 있습니다. 더 많은 지원을 원한다면 Scrapy는 Discord 커뮤니티를 운영 중이며, 17,000개 이상의 Scrapy 관련 질문이 올라온 Stack Overflow에도 존재합니다.

반면 GitHub에서 Puppeteer는 Scrapy보다 팔로워 수는 적지만(1,200명), 더 많은 스타(86,000개)를 보유하고 있으며 다양한 기여자들의 일일 커밋이 이루어지고 있습니다. Puppeteer는 공식적으로 지원되는 Reddit이나 Discord 커뮤니티는 없지만, Stack Overflow에는 8,000개 이상의 Puppeteer 관련 질문이 등록되어 있습니다.

마지막으로, Puppeteer와 Scrapy 모두 특정 사용 사례에 맞춤화된 커뮤니티 지원 플러그인 또는 확장 기능이 풍부합니다. 예를 들어, Scrapy를 헤드리스 브라우저와 통합하거나 동적 웹사이트를 파싱하는 용도로 활용됩니다.

Scrapy와 Puppeteer 사용 사례

지금까지 이 글에서는 두 가지 사용 사례와 두 도구가 각각 어떤 부분에서 뛰어난지 간략히 살펴보았습니다: 대량의 정적 데이터 스크래핑 또는 동적으로 로드되는 데이터 접근입니다.

대량의 정적 웹 페이지 스크래핑

Scrapy는 단순히 대상 페이지의 DOM을 로드하기 때문에 수천 페이지에 걸쳐 데이터가 분산된 대규모 스크래핑 프로젝트에 최적의 선택입니다. 비동기적으로 작동하며 추가 리소스를 다운로드하지 않기 때문에 Scrapy는 동시에 여러 웹사이트를 방문할 수 있으며, 수십 개의 웹사이트를 1초 미만의 지연 시간으로 쉽게 스크래핑할 수 있습니다. 예를 들어, 즐겨 찾는 뉴스 웹사이트의 모든 기사 댓글 섹션에서 댓글을 모두 다운로드하려는 경우 Scrapy가 탁월합니다.

반면, Puppeteer로 동일한 작업을 수행하려면 개별 페이지만 브라우저에 완전히 로드할 수 없습니다. 웹 애플리케이션 테스트 도구로 설계된 특성상 웹사이트를 완전히 렌더링하기 위해 추가 이미지, 스크립트 및 기타 임베디드 객체까지 다운로드하게 됩니다. 이는 페이지 목록이 순수 정적 콘텐츠로만 구성될 때 불필요한 많은 오버헤드를 발생시키며, Scrapy 사용보다 훨씬 느릴 것입니다.

동적 웹 페이지에서 콘텐츠 스크래핑하기

오늘날 웹은 단순히 웹 페이지에 정보를 표시하는 데만 초점을 맞추지 않고 상호작용성에도 중점을 둡니다. 많은 웹사이트가 그래픽 사용자 인터페이스(GUI)로 진화했으며, 이는 다음과 같은 시나리오가 발생할 수 있음을 의미합니다:

  • 댓글이 ‘댓글 읽기’ 버튼 뒤에 숨겨져 있으며, 이 버튼을 클릭하면 페이지에 댓글이 추가됩니다.
  • 콘텐츠가 탭으로 그룹화되어 표시됩니다.
  • 기사가 유료화(페이월) 뒤에 숨겨져 로그인 및 CAPTCHA 제출이 필요합니다.
  • 일부 웹사이트는 단일 페이지로 구성되며 사용자의 탐색 행동에 따라 콘텐츠가 결정됩니다.

Scrapy는 기본적으로 이러한 유형의 콘텐츠를 처리할 수 없습니다. 동적 웹사이트를 스크래핑하려면 Splash와 같은 미들웨어를 통합하거나 Playwright 또는 Selenium과 같은 브라우저 에뮬레이션 도구를 사용해야 합니다.

이 사용 사례에서 Puppeteer는 Scrapy를 확실히 능가합니다. 헤드리스 브라우저 패러다임을 통해 웹 페이지를 완전히 로드할 수 있으며, 자바스크립트 코드를 통해 웹사이트의 상호작용성을 구현합니다. Puppeteer는 아직 로드되지 않은 특정 HTML 요소에 접근하려고 시도하는 대신, 웹 애플리케이션과 상호작용하며 HTML 요소가 로드될 때까지 대기(존재 여부를 폴링)하고, 요소가 사용 가능해지면 선택하여 콘텐츠를 다운로드할 수 있습니다.

Scrapy와 Puppeteer는 scrapy-pyppeteer 모듈을 통해 통합될 수 있다는 점을 유의해야 합니다. Scrapy 프레임워크의 장점은 인정하지만 동적으로 로드되는 콘텐츠에 접근하기 위해 헤드리스 브라우저가 필요한 경우 이 모듈이 유용할 수 있습니다.

결론

Scrapy와 Puppeteer는 완전히 다른 패러다임을 따르는 도구이며, 설계 목표조차 다릅니다. 그러나 둘 다 웹 콘텐츠 스크래핑에 활용될 수 있습니다. 이러한 접근 방식의 차이로 인해, 방대한 양의 데이터 스크래핑에는 Scrapy가 최적의 솔루션인 반면, 특정 사용자 상호작용 후에 콘텐츠를 렌더링하는 웹사이트 탐색에는 Puppeteer가 최선의 선택입니다.

그러나 이 도구들에는 공통점도 있습니다. 커뮤니티 규모가 비슷하며 사용 편의성 측면에서도 대체로 동등합니다. 브라우저 지문 인식 및 프록시 로테이션과 같은 공통 기능도 갖추고 있습니다.

스크래핑 작업을 산업화할 도구 스택을 찾고 있다면,Bright Data를 고려해 보세요. Bright Data는 수백만 개의 프록시 서버, 스크래핑 API, 스크래핑 전용 브라우저, 그리고 쉽게 접근 가능한 데이터 세트를 제공합니다. Bright Data는 또한 훌륭한 웹 스크래핑 문서를 많이 보유하고 있습니다. 예를 들어,Puppeteer 웹 스크래핑에대해 더 자세히 알아보고Puppeteer와Scrapy 모두와의 통합을 탐색할 수 있습니다.

다음으로 Puppeteer와 Selenium을 비교해 보세요.