etc

[Python] Scrapy 웹 크롤링

_GU_ 2024. 5. 11. 22:40
반응형

Scrapy

Scrapy는 BeautifulSoup 처럼 단순히 HTML 또는 XML 문서를 파싱하기 위한 라이브러리가 아니라,
웹 스크래핑과 크롤링을 위해 설계된 종합적인 도구이다.
비동기 처리, 분산 처리, 내장 파이프라인 등의 특징으로 작업을 효율적으로 처리할 수 있다.
또한, 자동으로 해당 웹사이트의 robots.txt를 파싱하여 규칙을 준수한다는 장점이 있다.

Scrapy 아키텍처

출처: https://wikidocs.net/198941

  • Scheduler
    • URL을 스크래핑할 순서를 제어
  • Downloader
    • 인터넷에서 웹페이지를 가져와 Spider에 전달
  • Response
    • Downloader가 가져온 웹페이지의 HTML 내용
  • Spider
    • Response를 처리하고 데이터를 추출하며 새로운 스크래핑 작업 생성
  • Item Pipeline
    • 추출한 데이터를 처리하고 저장하는데 사용

Scrapy 프로젝트

Scrapy 설치는 pip install scrapy를 통해 간단하게 진행할 수 있다.

scrapy startproject project_name

설치 후, 위 커맨드를 통해 scrapy 프로젝트를 생성할 수 있다.
프로젝트 구조는 다음과 같다.

scrapy_project/
├── scrapy.cfg
└── scrapy_project
    ├── __init__.py
    ├── items.py  # 아이템 정의 파일
    ├── middlewares.py  # 미들웨어 정의 파일
    ├── pipelines.py  # 아이템 파이프라인 정의 파일
    ├── settings.py  # 프로젝트 설정 파일
    └── spiders
        └── __init__.py

Spider

spider 디렉토리 내부에 spider파일을 생성한다.

cd project_name/project_name/spiders

scrapy genspider spider_name sample.com  
# scrapy genspider {이름} {크롤링할 사이트 도메인}

이렇게 생성된 Spider 파일은 다음과 같다.

import scrapy

class SampleSpider(scrapy.Spider):
    name = "sample_spider"
    allowed_domains = ["sample.com"]
    start_urls = ["https://sample.com"]

    def parse(self, response):
        # 데이터 추출 로직

Item

Scrapy의 Item은 수집할 데이터의 모델을 정의한다. 예를 들어, 제목과 설명을 추출하려는 경우 다음과 같이 Item을 정의할 수 있다.

# items.py
import scrapy

class SampleItem(scrapy.Item):
    title = scrapy.Field()
    description = scrapy.Field()

Field
특정 데이터 조각을 저장하는 key-value 쌍
각각의 Field는 웹 페이지에서 추출한 데이터의 특정 부분에 대응한다.
단순 데이터 저장 뿐 아니라, meta 인자로 각 필드의 특성을 세밀하게 설정 가능
ex. 기본값 설정, 필수 필드 여부 등

Pipeline

파이프라인에서는 수집된 데이터를 처리하는 로직을 정의한다.
데이터를 저장하거나 후처리 하는 등의 작업이 해당된다.

class SamplePipeline:
    def process_item(self, item, spider):
        # 데이터 처리 코드
        return item

Setting

settings.py에서 Spider의 동작을 설정한다.
파이프라인 활성화, 동시 요청 수 조정 등 다양한 설정을 변경할 수 있다.


크롤링 진행

모든 준비가 끝났으면, scrapy crawl project_name 커맨드로 크롤링을 진행할 수 있다.

반응형