Scrapy vs. Beautiful Soup

Scrapy vs. Beautiful Soup 비교. 웹 스크래핑을 위한 두 가지 인기 선택지에 대해 알아보세요.
2 분 읽기
Scrapy vs Beautiful Soup

웹 스크래핑에 있어 파이썬은 선택할 수 있는 다양한 도구를 제공합니다. 셀레늄(Selenium), 메카니컬 수프(MechanicalSoup), 스크래피(Scrapy), 리퀘스트(Requests), 뷰티풀 수프(Beautiful Soup), lxml 등이 이 분야에서 흔히 사용됩니다. 그러나 이들 도구는 각각 특화된 사용 사례에서 빛을 발하므로 동등하게 만들어진 것은 아닙니다. 본 글에서 보여드리듯 일부는 상호 보완적이기까지 합니다.

이 글에서는 웹 스크래핑에 널리 쓰이는 두 가지 도구인 Scrapy와 Beautiful Soup을 자세히 살펴보겠습니다.

Beautiful Soup은 파싱 라이브러리입니다. XPath와 CSS 선택자를 사용하여 문서 내 탐색을 가능하게 합니다. 이는 마크업 언어(HTML, XML 등)의 데이터를 구조화된 데이터로 변환하는 작업을 용이하게 합니다. 반면 Scrapy는 문서를 로드하고 (선택적으로) 저장하는 완전한 웹 스크래핑 프레임워크입니다.

Beautiful Soup을 활용한 웹 스크래핑에 대해 자세히 알아보세요.

이 비교에서는 크롤링 사용성, 스크래핑 사용성, 속도, 다단계 실행, 프록시 로테이션, CAPTCHA 해결 등 여러 측면을 고려할 것입니다.

Scrapy vs. Beautiful Soup: 빠른 비교

급하신 분들을 위해 Python을 이용한 웹 스크래핑에 대한 Scrapy와 Beautiful Soup의 빠른 비교를 소개합니다.

Scrapy는 포괄적인 웹 스크래핑 프레임워크로 대규모 데이터 추출 프로젝트에 적합하며 크롤링 기능을 내장하고 있습니다. 반면 Beautiful Soup은 내장 크롤링 기능 없이 소규모의 단순한 스크래핑 작업에 최적화된 파싱 라이브러리입니다.

Scrapy는 광범위한 스크래핑 작업에서 속도와 효율성이 뛰어나고, Beautiful Soup은 간단한 작업에서 단순성과 사용 편의성이 뛰어납니다. 복잡한 프로젝트에는 Scrapy를, 간단하고 직접적인 파싱이 필요한 경우에는 Beautiful Soup을 선택하세요.

Scrapy

Scrapy는 웹 크롤링, 문서 다운로드, 처리, 결과 데이터의 접근 가능한 형식 저장까지 아우르는 올인원 솔루션입니다. pip 또는 conda로 간편하게 설치 가능합니다:

pip install scrapy
conda install -c conda-forge scrapy

Scrapy를 이용한 웹 크롤링

Scrapy는 페이지 및 웹사이트 집합을 크롤링하여 스크래핑할 URL을 수집하거나 특정 정보를 포함하는지 확인하는 데 도움을 줍니다. Scrapy는 스파이더(spider)를 사용합니다. 스파이더는 웹사이트 탐색 방식, 웹사이트 구조 내 탐색 깊이, 추출할 데이터, 저장 방식을 정의할 수 있는 Python 클래스입니다. URL 목록을 구성하기 위해 Scrapy는 HTML, XML, CSV 문서를 탐색하고 사이트맵(sitemap)을 로드할 수도 있습니다.

또한 Scrapy는 특정 페이지에서 XPath 및 CSS 표현식을 테스트하고 디버깅할 수 있는 대화형 셸인 Scrapy 셸을 제공합니다. 셸을 사용하면 변경할 때마다 스파이더를 재시작할 필요가 없어 크롤링 및 스크래핑 시간을 절약할 수 있습니다.

Scrapy를 활용한 웹 스크래핑

스크래핑 작업에는 일반적으로 높은 유연성이 요구됩니다. Scrapy는 문서 내 항목 선택을 위해 XPath와 CSS 표현식이라는 두 가지 방식을 제공합니다. 전자는 주로 XML 문서에 사용되며, 후자는 HTML 문서 전용입니다.

Scrapy의 독특한 기능은 파이프라인을 정의할 수 있다는 점입니다. 항목이 스크래핑되면 파이프라인으로 전송되어 일련의 작업(정제, 검증, 해싱, 중복 제거, 보강)이 수행됩니다.

속도

웹 문서 스크래핑의 또 다른 중요한 측면은 소요 시간입니다. Scrapy의 속도를 평가하는 것은 처리해야 할 많은 오버헤드가 존재하기 때문에 쉽지 않습니다. 이러한 이유로 오버헤드는 한 번만 로드되고, 크롤링과 추출은 열 번 수행됩니다.

다음 예시에서는 단순한(, 동적이지 않은) 웹 페이지의 h2 태그를 추출합니다. 모든 코드는 Jupyter Notebook에서 실행됩니다.

먼저 필요한 Scrapy 라이브러리를 로드합니다:

import scrapy
from scrapy.crawler import CrawlerProcess

둘째, 스크래핑 작업을 정의하는 MySpider 클래스를 설정합니다:

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = [
        'https://edition.cnn.com' # 또는 한계 시간 계산 위해 10회 반복
    ]
    def parse(self, response):
        yield {'output': response.css('h2.container_lead-package__title_url-text::text').extract()}
process = CrawlerProcess(
    settings={
        "FEEDS": {
            "scrapy_output.json": {"format": "json", "overwrite": True}
        }
    })

process.crawl(MySpider)

셋째, 스크립트를 실행하고 시간을 측정합니다:

%%timeit -n 1 -r 1
process.start()

단일 웹 문서의 크롤링, 스크래핑, 저장 순서는 약 400밀리초가 소요되었습니다. 그러나 동일한 과정을 10회 반복하면 1,200밀리초가 걸렸습니다. 이는 단일 순서가 약 80밀리초 정도 소요됨을 의미하며, 이는 인상적입니다. 오버헤드를 고려할 때, 집약적인 작업에는 Scrapy를 우선적으로 선택해야 합니다.

Scrapy를 활용한 다단계 스크래핑

X/트위터, 서브스택, 링크드인과 같은 가장 인기 있는 웹사이트를 포함해 많은 웹사이트는 동적입니다. 이는 로그인 화면, 검색 쿼리, 팝업, 스크롤 또는 마우스 오버 뒤에 방대한 정보가 숨겨져 있음을 의미합니다. 따라서 스파이더가 단순히 페이지를 방문하는 것만으로는 데이터를 추출하기에 종종 부족합니다.

Scrapy는 독립형 도구로서 이러한 작업을 처리하기 위한 다양한 접근 방식을 제공합니다. 필요한 HTTP 요청을 생성하거나 관련 자바스크립트 스니펫을 실행할 수 있습니다. 그러나 헤드리스 브라우저를 사용하는 것이 가장 유연합니다. 예를 들어, 동적 요소와 인터페이스하기 위해 사용할 수 있는 Scrapy용 Playwright 및 Selenium 통합 기능이 있습니다.

Scrapy를 활용한 프록시 로테이션 및 CAPTCHA 방지

대규모 언어 모델의 등장으로 많은 기업이 모델을 미세 조정하려 하지만, 이는 특정(종종 스크랩된) 데이터가 필요합니다. 또한 많은 조직은 봇이 웹사이트 서버에 부담을 주는 것을 원치 않으며, 데이터 공유에 상업적 관심이 없습니다. 이 때문에 많은 웹사이트는 동적으로 구성될 뿐만 아니라 자동 IP 차단 및 CAPTCHA와 같은 안티스크래핑 기술을 도입합니다.

차단을 방지하기 위해 Scrapy는 프록시(및 IP 주소) 회전을 위한 기본 제공 도구를 제공하지 않습니다. 그러나 Scrapy는 요청 및 응답 프로세스를 수정하는 일련의 훅인 미들웨어 프레임워크를 통해 확장할 수 있습니다. 프록시 회전을 위해 scrapy-rotating-proxies와 같이 이를 위해 특별히 제작된 Python 모듈을 연결할 수 있습니다. 동일한 메커니즘을 통해 DeCAPTCHA 모듈도 연결할 수 있습니다.

Beautiful Soup

Scrapy와 달리 Beautiful Soup은 웹 문서에서 데이터를 추출하고 처리하는 전체 솔루션을 제공하지 않습니다. 스크래핑 기능만 제공합니다. 다운로드한 문서를 Beautiful Soup에 입력하기만 하면 CSS 및 XPath 선택자를 통해 구조화된 데이터로 변환할 수 있습니다.

Beautiful Soup 설치는 pip 및 conda를 통해 수행할 수 있습니다:

pip install BeautifulSoup4
conda install -c anaconda beautifulsoup4

Beautiful Soup을 이용한 웹 크롤링

Scrapy가 웹사이트 탐색을 위해 스파이더를 배포하는 반면, Beautiful Soup은 그러한 기능을 제공하지 않습니다. 그러나 Beautiful Soup과 Requests 라이브러리를 함께 활용하는 Python의 창의성을 발휘하면 특정 깊이까지 웹사이트를 탐색하는 스크립트를 작성할 수 있습니다. 그럼에도 불구하고 Scrapy만큼 쉽지는 않습니다.

Beautiful Soup을 이용한 웹 스크래핑

웹 스크래핑은 Beautiful Soup 4의 핵심 기능입니다. CSS 및 XPath 선택자를 제공할 뿐만 아니라, 문서를 탐색하기 위한 다양한 메서드를 갖추고 있습니다. 문서 구조가 복잡할 경우, .parent나 .next_sibling 같은 메서드를 사용하면 접근하기 어려운 요소들도 추출할 수 있습니다. 또한 find_all() 및 유사한 메서드를 통해 텍스트 필터, 정규 표현식, 심지어 사용자 정의 함수까지 지정하여 필요한 요소를 찾을 수 있습니다.

마지막으로 Beautiful Soup은 출력을 깔끔하게 표시하고, 인코딩하며, 마이크로소프트 스마트 따옴표를 제거하고, HTML을 파싱 및 검증하는 다양한 출력 포맷터를 제공합니다.

속도

Scrapy와 달리 Requests와 Beautiful Soup은 오버헤드가 없어 속도 측정을 위해 간단히 10회 실행할 수 있습니다.

먼저 필요한 라이브러리를 로드합니다:

import requests, json
from bs4 import BeautifulSoup

둘째, timeit 매직 명령어로 코드를 감싸 실행 시간을 측정합니다:

%%timeit -n 10 -r 1
page = requests.get('https://edition.cnn.com')
page_html = BeautifulSoup(page.text, 'html.parser')
page_html = page_html.select_one('h2.container_lead-package__title_url-text').text
json_object = json.dumps({'output': page_html})
with open("bs4_output.json", "w") as output_file:
    output_file.write(json_object)

한 번 실행하는 데 약 300밀리초가 소요됩니다. 열 번 실행하면 3,000밀리초가 걸리는데, 이는 Scrapy보다 상당히 느립니다. 그러나 훨씬 적은 설정과 특정 프레임워크에 대한 상대적으로 적은 지식이 필요합니다.

Beautiful Soup을 이용한 다단계 스크래핑

Beautiful Soup은 크롤링 기능이 없으므로 동적 웹 페이지를 처리할 수 없습니다. 그러나 Scrapy와 마찬가지로 Playwright, Puppeteer, Selenium과 같은 자동화 도구와 완벽하게 연동됩니다. 자동화 도구와 Beautiful Soup의 조합은 항상 동일한 방식으로 작동합니다: 헤드리스 브라우저가 동적 요소를 처리하고, Beautiful Soup은 해당 브라우저에서 렌더링된 데이터를 추출합니다.

Beautiful Soup을 활용한 프록시 로테이션 및 CAPTCHA 방지

Beautiful Soup은 크롤링 도구가 아닌 스크래핑 도구이므로, 웹사이트 서버에 의해 차단되는 것을 방지하는 기능을 제공하지 않습니다. 이러한 기능이 필요하다면, 선택한 크롤링 도구에 해당 기능이 포함되어 있어야 합니다.

결론

이 글에서는 Beautiful Soup과 Scrapy가 웹 크롤링 및 웹 스크래핑에서 속도, 동적 웹 문서 처리, 스크래핑 방지 조치 우회 측면에서 사용성 차이가 어떻게 나타나는지 설명했습니다.

종단간 도구로서 Scrapy는 일상적인 스크래핑 작업에 확실히 선호되는 선택입니다. 다만 동적 웹사이트를 스크래핑하고 차단되지 않도록 하려면 일부 중간 소프트웨어가 필요합니다.

Beautiful Soup(request 패키지와 함께)은 상당히 느리지만, 즉석 스크래핑 작업에 매우 친숙하고 간단한 방식을 제공합니다. Scrapy와 마찬가지로 동적 웹사이트 스크래핑 및 차단 방지를 위해서는 추가 도구가 필요합니다.

웹사이트 스크래핑을 위한 원스톱 솔루션을 찾고 있다면 Bright Data를 고려해 보세요. Bright Data는 프록시 서비스와 Web Unlocker 등 다양한 제품을 제공하여 어떤 옵션을 선택하든 모든 웹 스크래핑 요구사항을 지원합니다.

Bright Data 프록시 통합 방법을 배우고 싶으신가요? Scrapy 프록시 통합 가이드와 BeautifulSoup 프록시 가이드를 읽어보세요.