Scrapy vs Pyspider: 웹 스크래핑에 더 적합한 도구는?

웹 스크래핑을 위한 Scrapy와 Pyspider를 비교하고 웹 스크래핑 요구사항에 가장 적합한 도구를 선택하십시오.
3 분 읽기
Scrapy vs Pyspider blog image

이 Scrapy 대 Pyspider 가이드에서 다음을 배우게 됩니다:

  • Scrapy와 Pyspider의 정의
  • 웹 스크래핑을 위한 Scrapy와 Pyspider 비교
  • 웹 스크래핑에 Scrapy와 Pyspider를 함께 사용하는 방법
  • 웹 스크래핑 시나리오에서 Scrapy와 Pyspider의 공통적인 한계점

자, 시작해 보겠습니다!

Scrapy란 무엇인가?

Scrapy는Python으로 작성된 오픈소스 웹 스크래핑 프레임워크입니다. 주요 목표는 웹사이트에서 데이터를 빠르고 효율적으로 추출하는 것입니다. 구체적으로 다음과 같은 작업을 수행할 수 있습니다:

  • 하나 이상의 웹 페이지에서 정보를 탐색하고 수집하는 방법을 정의합니다.
  • HTTP 요청, 링크 추적, 데이터 추출과 같은 측면을 처리합니다.
  • 스로틀링 및 비동기 요청을 통해 요청 속도를 조절하여 차단되는 것을 방지합니다.
  • 사용자 정의 미들웨어나scrapy-rotating-proxies라이브러리를 통해 프록시 및프록시 로테이션관리.

Pyspider란 무엇인가요?

Pyspider는Python으로 작성된 오픈 소스 웹 크롤링 프레임워크입니다. 웹사이트에서 데이터를 쉽고 유연하게 추출할 수 있도록 설계되었으며, 다음을 가능하게 합니다:

  • CLI 또는 사용자 친화적인 웹 인터페이스를 통해 하나 이상의 웹 페이지에서 정보를 탐색하고 수집하는 방법을 정의합니다.
  • 작업 스케줄링, 재시도, 데이터 저장 등의 측면을 처리합니다.
  • 분산 크롤링 및 우선순위 지정된 작업을 지원하여 블록을 제한합니다.
  • 내장된 데이터베이스 및 메시지 큐 지원을 통해 복잡한 워크플로우와 데이터 처리를 관리합니다.

Scrapy vs Pyspider: 웹 스크래핑 기능 비교

Scrapy와 Pyspider가 무엇인지 알아보았으니, 이제 웹 스크래핑을 위한 두 도구를 비교해 보겠습니다:

기능 Scrapy Pyspider
사용 사례 대규모 및 복잡한 스크래핑 프로젝트 예약된 스크래핑 작업
스크래핑 관리 CLI CLI 및 UI
구문 분석 방법 XPath 및 CSS 선택기 CSS 선택기
데이터 저장 CSV 및 기타 파일 형식으로 데이터 내보내기 가능 데이터를 데이터베이스에 자동 저장
재시도 수동 개입이 필요한 재시도 실패한 작업 자동 재시도
작업 스케줄링 외부 통합 필요 기본적으로 지원됨
프록시 로테이션 미들웨어를 통한 프록시 로테이션 지원 수동 개입 필요
커뮤니티 현재54,000개 이상의GitHub 스타를 보유한 활발한 커뮤니티가 기여 중 거대한 커뮤니티, 현재GitHub에서 16,000개 이상의스타를 보유하고 있지만, 2024년 6월 11일 이후로 보관됨

위의 Scrapy 대 Pyspider 비교표는 두 라이브러리가 유사함을 보여줍니다. 주요 차이점은 다음과 같습니다:

  • Scrapy는 CLI를 통해서만 사용할 수 있는 반면, Pyspider는 UI도 제공합니다.
  • Scrapy는XPath 및 CSS 선택자를 파싱할 수 있는 반면, Pyspider는 CSS 선택자만 지원합니다.
  • Scrapy는 사용자 정의 미들웨어 로직을 통해 프록시 자동 교체를 지원합니다.

그러나 정말 고려해야 할 중요한 점은Pyspider가 더 이상 지원되지 않는다는 것입니다:

Pyspider archived GitHub repository

Scrapy vs Pyspider: 직접 스크래핑 비교

Scrapy와 Pyspider를 비교해 본 결과, 두 프레임워크가 유사한 웹 스크래핑 기능을 제공한다는 점을 알게 되었습니다. 따라서 실제 코딩 예제를 통해 비교하는 것이 가장 좋은 방법입니다.

다음 두 섹션에서는 동일한 사이트를 스크래핑하기 위해 Scrapy와 Pyspider를 사용하는 방법을 보여드립니다. 구체적으로, 대상 페이지는Scrape This Site의 “Hokey Teams” 페이지입니다. 여기에는 표 형식으로 된 하키 데이터가 포함되어 있습니다:

The tabular data to scrape

이 섹션들의 목표는 표의 모든 데이터를 추출하여 로컬에 저장하는 것입니다. 어떻게 하는지 살펴보겠습니다!

웹 스크래핑을 위한 Scrapy 사용법

이 단락에서는 Scrapy를 사용하여 대상 웹사이트에서 제공하는 테이블의 모든 데이터를 추출하는 방법을 배웁니다.

필수 조건

이 튜토리얼을 따라하려면 컴퓨터에Python 3.7이상이 설치되어 있어야 합니다.

1단계: 환경 설정 및 종속성 설치

프로젝트의 메인 폴더를 hockey_scraper/라고 가정합니다 . 이 단계가 완료되면 폴더 구조는 다음과 같아집니다:

hockey_scraper/
   └── venv/

다음과 같이venv/가상 환경디렉터리를 생성할 수 있습니다:

python -m venv venv

활성화하려면 Windows에서 다음 명령을 실행하세요:

venvScriptsactivate

macOS/Linux에서는 다음과 같이 실행합니다:

source venv/bin/activate

이제 Scrapy를 설치할 수 있습니다:

pip install scrapy

2단계: 새 프로젝트 시작

이제 새로운 Scrapy 프로젝트를 시작할 수 있습니다. hockey_scraper/ 메인 폴더 내에서 다음을 입력하세요:

scrapy startproject hockey

이 명령어로 Scrapy가 hockey/ 폴더를 생성합니다. 해당 폴더 내부에 필요한 모든 파일이 자동으로 생성됩니다. 결과 폴더 구조는 다음과 같습니다:

hockey_scraper/ 
    ├── hockey/ # 메인 Scrapy 프로젝트 폴더
    │   ├── __init__.py  
    │   ├── items.py # 스크랩된 항목의 데이터 구조 정의 
    │   ├── middlewares.py # 커스텀 미들웨어
    │   ├── pipelines.py # 스크랩된 데이터의 후처리 처리  
    │   ├── settings.py # 프로젝트 설정  
    │   └── spiders/ # 모든 스파이더용 폴더  
    ├── venv/  
    └── scrapy.cfg # Scrapy 구성 파일

3단계: 스파이더 생성

대상 웹사이트를 크롤링할 새 스파이더를 생성하려면 먼저 hockey/ 폴더로 이동하세요:

cd hockey

그런 다음 다음 명령어로 새 스파이더를 생성합니다:

scrapy genspider data https://www.scrapethissite.com/pages/forms/

이 스크립트에서 data는 스파이더의 이름을 나타냅니다. Scrapy는 spiders/ 폴더 내에 data.py 파일을 자동으로 생성합니다. 해당 파일에는 하키 팀 데이터를 가져오기 위한 필수 스크래핑 로직이 포함됩니다.

단계 #4: 스크래핑 로직 정의

스크래핑 로직을 코딩할 준비가 되었습니다. 먼저 브라우저에서 관심 데이터가 포함된 테이블을 확인하세요. 데이터가.table요소 안에 포함되어 있음을 확인할 수 있습니다:

The table class in the HTML n the HTML code of the target web page

모든 데이터를 가져오려면 data.py 파일에 다음 코드를 작성하세요:

import scrapy

class DataSpider(scrapy.Spider):
    name = "data"
    allowed_domains = ["www.scrapethissite.com"]
    start_urls = ["https://www.scrapethissite.com/pages/forms/"]
    
    def parse(self, response):
        for row in response.css("table.table tr"):
            yield {
                "name": row.css("td.name::text").get(),
                "year": row.css("td.year::text").get(),
                "wins": row.css("td.wins::text").get(),
                "losses": row.css("td.losses::text").get(),
                "ot_losses": row.css("td.ot-losses::text").get(),
                "pct": row.css("td.pct::text").get(),
                "gf": row.css("td.gf::text").get(),
                "ga": row.css("td.ga::text").get(),
                "diff": row.css("td.diff::text").get(),
            }

변수 name, allowed_domains, start_urls는 이전 단계에서 Scrapy가 자동 생성한 것임을 유의하십시오.

parse() 메서드 역시 Scrapy가 자동 생성했습니다. 따라서 이 단계에서는 for 루프 아래에 스크래핑 로직만 추가하면 됩니다.

자세히 설명하면, response.css() 메서드는 테이블을 검색합니다. 그런 다음 코드는 테이블의 모든 행을 반복하며 데이터를 가져옵니다.

5단계: 크롤러 실행 및 데이터 CSV 파일 저장

크롤러를 실행하고 스크래핑된 데이터를 CSV 파일에 저장하려면 다음 명령어를 입력하세요:

scrapy crawl data -o output.csv

이 코드를 통해 Scrapy는:

  • 스크래핑 로직이 포함된data.py파일을 실행합니다
  • 스크랩된 데이터를output.csv라는 CSV 파일에 저장합니다

스크레이퍼가 생성하는 예상output.csv파일은 다음과 같습니다:

The expected CSV file

이 방법은 Scrapy 사용법 중 가장 간결하지만 유일한 방법은 아닙니다. Scrapy는 다양한 커스터마이징과 설정을 제공하며, 이에 대한 자세한 내용은Scrapy vs Requests 비교 글에서 확인하실 수 있습니다.

웹 스크래핑을 위한 Pyspider 사용법

동일한 대상 웹사이트를 Pyspider로 스크래핑하는 방법을 확인하세요.

필요 사항

Pyspider는 최신 버전으로Python3.6을지원합니다. 더 최신 버전의 Python이 설치된 경우, 3.6 버전을 사용하는 방법을 알아보려면 다음 단계를 참조하세요.

1단계: 환경 설정 및 종속성 설치

프로젝트의 메인 폴더를 hockey_scraper/라고 가정합니다 .

Python 3.7 이상 버전을 사용 중인 경우, Python 3.6을 사용하려면pyenv를설치하세요.

다음 명령어로 pyenv를 사용하여 Python 3.6을 설치하세요:

pyenv install 3.6.15

그런 다음 시스템 전체에 다른 버전이 영향을 미치지 않도록 로컬 Python 버전으로 설정하세요:

pyenv local 3.6.15

모든 작업이 정상적으로 완료되었는지 확인하려면 Python 버전을 확인하세요:

python --version

결과는 다음과 같아야 합니다:

Python 3.6.15

올바른 Python 버전을 선택하여 가상 환경을 생성하세요:

python3.6 -m venv venv

이 가이드의 이전 장에서 설명한 대로 가상 환경을 활성화하세요. 이제 다음 명령어로 Pyspider를 설치할 수 있습니다:

pip install pyspider

UI를 실행하려면 다음을 실행하세요:

pyspider

참고: 이 저장소는 아카이브되어 있으며 Python 3.6을 사용 중이므로 일부 오류가 발생할 수 있습니다. 이를 해결하려면 다음 라이브러리를 설치해야 할 수 있습니다:

pip install tornado==4.5.3 requests==2.25.1

또한 webdav.py 파일과 관련된 다른 오류가 발생할 수 있습니다. 해당 파일을 찾아 다음을 수정하세요:

  • ScriptProvider()클래스에서getResourceInst()메서드 이름을get_resource_inst()로 변경하세요.
  • 파일 하단에서config = DEFAULT_CONFIG.copy()변수를 찾아 이후 모든 코드를 다음과 같이 변경하세요:
config = DEFAULT_CONFIG.copy()
config.update({
    "mount_path": "/dav",
    "provider_mapping": {
        "/": ScriptProvider(app)
    },
    "domaincontroller": NeedAuthController(app),
    "verbose": 1 if app.debug else 0,
    "dir_browser": {"davmount": False,
                    "enable": True,
                    "msmount": False,
                    "response_trailer": ""},
})
dav_app = WsgiDAVApp(config)

이제 pyspider의 웹 UI를 시작할 수 있습니다. 브라우저에서 http://localhost:5000/ 로 접속하면 다음과 같은 화면이 표시됩니다:

The Pyspider UI

2단계: 새 프로젝트 생성

“Create”를 클릭하여 새 프로젝트를 생성하고 필드를 채우세요:

  • 원하는 프로젝트 이름을 선택하세요. 예를 들어Hockey_scraper.
  • 시작 URL 필드에https://www.scrapethissite.com/pages/forms/을설정하세요.

결과는 다음과 같아야 합니다:

The result of the project creation in Pyspider

단계 #3: 스크래핑 로직 정의

UI 오른쪽 부분의 편집기에 직접 Python 코드를 작성하여 스크래핑 로직을 구현하세요:

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {}

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl("https://www.scrapethissite.com/pages/forms/", callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc("table.table tr").items():
            self.crawl(each.attr.href, callback=self.detail_page)

    @config(priority=2)
    def detail_page(self, response):
        return {
            "name": row.css("td.name::text").get(),
            "year": row.css("td.year::text").get(),
            "wins": row.css("td.wins::text").get(),
            "losses": row.css("td.losses::text").get(),
            "ot_losses": row.css("td.ot-losses::text").get(),
            "pct": row.css("td.pct::text").get(),
            "gf": row.css("td.gf::text").get(),
            "ga": row.css("td.ga::text").get(),
            "diff": row.css("td.diff::text").get(),
        }

기본 코드에서 변경된 사항은 다음과 같습니다:

  • response.doc()메서드는 대상 테이블을 검색합니다.
  • detail_page()row.css() 메서드를 통해 가로챈 행들을 반환합니다.

“저장” 및 “실행”을 클릭하여 스크래핑 프로세스를 시작하세요. 결과 데이터는 Scrapy로 얻은 것과 유사할 것입니다.

훌륭합니다! 이제 웹 스크래핑을 위해 Scrapy와 Pyspider를 모두 사용하는 방법을 알게 되었습니다.

Scrapy vs Pyspider: 어떤 것을 사용할까?

Scrapy와 Pyspider의 비교를 통해 사용법을 살펴보았지만, 어느 쪽이 더 나을까요? 알아볼 시간입니다!

Scrapy를 선택해야 하는 경우:

  • 병렬 크롤링 및 스로틀링과 같은 고급 기능이 필요한 고성능 프로젝트의 경우.
  • 외부 파이프라인이나 다른 도구와 스크래핑을 통합해야 하는 경우.
  • CLI 사용에 익숙하고 웹 스크래핑 시나리오에 자신 있으며 최신 프레임워크를 선호하는 경우.

Pyspider를 선택하세요:

항상 그렇듯이, 절대적인 승자는 없습니다. 최고의 스크래핑 도구는 전적으로 여러분의 특정 요구사항과 사용 사례에 달려 있습니다.

Scrapy와 Pyspider의 한계

Scrapy와 Pyspider는 웹 스크래핑을 위한 강력한 프레임워크이지만, 한계가 있습니다.

첫째, 자바스크립트를 사용하여 렌더링하거나 데이터를 검색하는동적 콘텐츠 사이트를 스크래핑하는데 어려움을 겪습니다. 두 프레임워크 모두 자바스크립트 기반 사이트를 스크래핑하도록 확장할 수 있지만, 본질적으로 그 측면에서는 한계가 있습니다. 이는 또한일반적인 스크래핑 방지 조치에 더 취약하게 만듭니다.

또한, 두 프레임워크 모두 자동화된 요청을 많이 발생시키기 때문에IP 차단에 취약합니다. 이는 속도 제한기를 작동시켜 IP가 블랙리스트에 오르게 할 수 있습니다. IP 차단을 방지하는 해결책은코드에 프록시를 통합하는 것입니다.

프록시 로테이션에 대해서는Python에서 프록시를 사용하여 IP 주소를 로테이션하는 방법 가이드를 참조하십시오.

마지막으로, 신뢰할 수 있는 프록시 서버를 찾고 계시다면, Bright Data의 프록시 네트워크가 포춘 500대 기업과 전 세계 20,000명 이상의 고객으로부터 신뢰받고 있다는 점을 기억하세요. 이 광범위한 네트워크에는 다음이 포함됩니다:

결론

이 Scrapy 대 Pyspider 블로그 글에서는 웹 스크래핑에서 두 라이브러리의 역할을 알아보았습니다. 데이터 추출 기능을 살펴보고 실제 페이지네이션 시나리오에서 성능을 비교했습니다.

Pyspider는 사용자 친화적인 UI를 제공하지만, 안타깝게도 더 이상 개발되지 않습니다. 반면 Scrapy는 구조화된 스크래핑에 필요한 대부분의 도구를 제공하며 최신 Python 버전과 호환되는 최신 기술을 기반으로 하기 때문에 대규모 프로젝트에 유용합니다.

또한 IP 차단 가능성 같은 한계점도 발견하셨을 겁니다. 다행히프록시나Bright Data의웹 스크레이퍼 API 같은 전용 웹 스크래핑 솔루션을사용하면이러한 문제를 극복할 수 있습니다. 이 스크래핑 전용 API는 Scrapy, Pyspider 및 기타 HTTP 클라이언트나 웹 스크래핑 도구와 원활하게 연동되어 제한 없는 데이터 추출을 가능하게 합니다.

지금 바로 무료 Bright Data 계정을 생성하여 당사의 프록시 및 스크레이퍼 API를 경험해 보세요!