Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Scrapy로 웹 스크래핑 구현하기: 기초부터 실전까지

이 글에서는 Python에서 제공하는 Scrapy 모듈을 활용해 웹 스크래핑을 구현하는 방법을 알아보겠습니다.

웹 스크래핑이란?

웹 스크래핑(Web Scraping)은 크롤러(Crawler) 또는 스캐너를 이용해 웹사이트로부터 데이터를 수집·추출하는 기술입니다. API 기능을 제공하지 않는 웹 페이지에서 데이터를 가져와야 할 때 특히 유용하게 사용됩니다.

Python에서는 Beautiful Soup, Scrapy, lxml 등 다양한 모듈로 웹 스크래핑을 구현할 수 있으며, 이번 글에서는 그중 Scrapy 모듈을 사용하는 방법을 다룹니다.

1. Scrapy 설치하기

먼저 터미널 또는 명령 프롬프트에 아래 명령어를 입력해 Scrapy를 설치합니다.

pip install scrapy

2. 프로젝트 생성하기

Scrapy는 단순한 라이브러리가 아니라 하나의 프레임워크이기 때문에, 초기화 명령어로 프로젝트를 먼저 생성해야 합니다.

scrapy startproject tutpts

프로젝트가 생성되면 웹사이트에서 데이터를 가져올 웹 크롤러(스파이더)를 만들 차례입니다.

3. 크롤러(스파이더) 작성하기

크롤러를 만들기 위해 별도의 스크립트 파일인 tutptscraw.py를 생성합니다. 이 파일 안에는 콘텐츠를 추출하기 위한 클래스를 선언하고, 크롤러의 이름을 지정한 뒤 .requests를 통해 지정된 URL에서 데이터를 가져옵니다.

가져온 데이터는 제너레이터(generator) 함수를 통해 순차적으로 반환(yield)됩니다.

기본 예제 코드

import scrapy

class ExtractUrls(scrapy.Spider):
    name = "fetch"

    # 제너레이터 함수
    def start_requests(self):
        # 대상 URL 입력
        urls = ['https://www.tutorialspoint.com/index.htm/']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

위 코드는 요청(request) 함수를 통해 앵커 태그(<a>) 안에 담긴 모든 데이터를 가져옵니다. Scrapy는 미니 프레임워크 형태이므로, 관련 기능들은 Scrapy 셸(Shell)에서 실행할 수 있습니다.

4. Scrapy 셸 활용하기

다음 명령어로 Scrapy 셸을 실행할 수 있습니다.

scrapy shell https://www.tutorialspoint.com/index.htm/

셸이 활성화되면 CSS 셀렉터 또는 XPath 같은 선택자(selector)를 사용해 앵커 태그에서 데이터를 추출할 수 있습니다.

response.css('a')
links = response.css('a').extract()

5. parse 메서드로 전체 링크 수집하기

웹 페이지에 있는 모든 링크를 가져오려면 parse 메서드를 작성합니다. Scrapy는 내부적으로 이미 방문한 URL을 자동으로 건너뛰기 때문에, 결과를 렌더링할 때 처리 시간을 크게 줄여줍니다.

import scrapy

class ExtractUrls(scrapy.Spider):
    name = "fetch"

    # 제너레이터 함수
    def start_requests(self):
        urls = ['https://www.tutorialspoint.com/index.htm/']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    # parse 함수
    def parse(self, response):
        title = response.css('title::text').extract_first()
        # 앵커 태그 가져오기
        links = response.css('a::attr(href)').extract()
        for link in links:
            yield {
                'title': title,
                'links': link
            }
        if 'tutorialspoint' in link:
            yield scrapy.Request(url=link, callback=self.parse)

위 코드의 동작 흐름은 다음과 같습니다.

  • response.css('title::text')로 페이지 제목을 추출합니다.
  • a::attr(href) 선택자로 모든 링크(href 속성)를 가져옵니다.
  • 각 링크와 제목을 딕셔너리 형태로 yield하여 결과를 저장합니다.
  • 링크에 'tutorialspoint' 도메인이 포함되어 있으면 해당 링크를 다시 요청해 재귀적으로 크롤링을 이어갑니다.

마무리

이번 튜토리얼에서는 Python의 Scrapy 모듈을 사용해 웹 크롤러를 구현하는 방법을 살펴보았습니다. Scrapy는 설치부터 프로젝트 생성, 스파이더 작성, 셸을 통한 데이터 추출까지 체계적인 구조를 갖추고 있어, 대규모 웹 스크래핑 작업에도 효율적으로 활용할 수 있습니다. 실제 프로젝트에서는 대상 사이트의 robots.txt와 이용약관을 반드시 확인하고, 요청 간격 조절 등 매너 있는 크롤링 습관을 함께 지키시기 바랍니다.