본문 바로가기
IT/Scraping

웹 크롤러 모델: 여러 페이지 유형 크롤러 그리고 좋은 웹크로러

by Cyber_ 2025. 2. 16.

미리 정의된 페이지 집합을 크롤링하는 것과 달리, 웹 사이트 내부 링크를 모두 크롤링하면 무엇을 얻게 될지 정확히 알 수 없다는 문제가 있습니다. 다행히 페이지 유형을 식별하는 몇 가지 기본적인 방법이 있습니다.

URL에 따라

블로그 게시물이라면 특정 URL 패턴, 예를 들어 http://example.com/blog/title-of-post 같은 패턴을 포함할 수 있습니다.

특정 필드가 존재하는지 여부에 따라

페이지에 날짜는 있지만 작성자 이름이 없다면 보도 자료로 분류할 법합니다. 제목, 주 이미지, 가격은 있지만 주요 콘텐츠가 없다면 제품 페이지일 수 있습니다.

페이지를 식별할 수 있는 특정 태그 여부에 따라

태그 내에서 데이터를 수집하지 않아도 태그를 활용할 수 있습니다. 예를 들어 크롤러에서 관련 제품 정보를 수집하지 않더라도, 페이지 같은 요소가 있다면 제품 페이지라고 판단하고 이런 요소가 있는 페이지를 수집할 수 있습니다.

 

 

 

 

 

여러 가지 페이지 유형을 추적하려면 여러 유형의 페이지 객체를 파이썬으로 만들어야 합니다. 이 작업은 두 가지 방법으로 수행할 수 있습니다.

 

 

1. 페이지가 모두 비슷하다면(모두 기본적으로 같은 유형의 콘텐츠가 있다면)

페이지의 속성을 파악하는 Website 클래스에 pageType 속성을 추가하여 사용할 수 있습니다.

class Website:
    """
    Common base clases for all articles/pages
    """
    def __init__(self, pageType, name, url, searchUrl, resultListing,
        resultUrl, absoluteUrl, titleTag, bodyTag):
        self.pageType = pageType
        self.name = name
        self.url = url
        self.searchUrl = searchUrl
        self.resultListing = resultListing
        self.resultUrl = resultUrl
        self.absoluteUrl = absoluteUrl
        self.titleTag = titleTag
        self.bodyTag = bodyTag

 

이런 페이지를 SQL 같은 데이터베이스에 저장한다면, 이런 패턴 유형을 보고 이 모든 페이지가 동일한 테이블에 저장되고 pageType 열이 추가된다는 것을 알 수 있습니다.

2. 스크랩하는 페이지/콘텐츠가 서로 다르다면(서로 다른 유형의 필드가 포함되어 있다면)

각 페이지 유형에 대해 새 객체를 생성해야할 수 있습니다. 물론 URL과 이름 또는 페이지 제목처럼 모든 페이지에 공통인 것도 있습니다. 하위 클래스를 사용하면 딱 들어맞는 상황입니다.

class Webpate:
    """Common base class for all articles/pages"""

    def __init__(self, name url, titleTag):
        self.name = name
        self.url = url
        self.titleTag = titleTag

하위 클래스 예시

class Product(Website):
    """제품 페이지 스크랩에 필요한 정보를 저장하는 클래스"""
    def __init__(self, name, url, titleTag, productNumberTag, priceTag):
        Website.__init__(self, name, url, tleTag)
        self.productNumberTag = productNumberTag
        self.priceTag = priceTag

class Article(WebSite):
    """기사 페이지 스크랩에 필요한 정보를 저장하는 클래스"""
    def __init__(self, name, url, titleTag, bodyTag, dateTag):
        Website.__init__(self, name, url, titleTag)
        self.bodyTag = bodyTag
        self.dateTag = dateTag

 

위 두 클래스를 사용하면 웹사이트에 제품 종보 외에 블로그 포스트나 보도 자료가 있다 해도 문제 없이 스크랩할 수 있습니다.

좋은 웹 크롤러 아키텍처

대형 웹 스크레이핑 프로젝트를 진행한다면 첫 번째 단계에서 "어떤 정보가 필요한지", "어떻게 정보를 얻을 것인지" 와 같은 질문에 답해야 합니다.

 

여려 도메인, 또는 여러 소스에서 유사한 데이터를 수집할 때는 항상 일반화를 시도해야 합니다. 데이터 필드가 모두 일치하고 서로 비교할 수 있게 일반화 한다면 원래 소스의 형식에 완전히 의존하는 데이터를 다루기보다 훨씬 쉽습니다.

 

스크레이퍼를 만들 때는 추후 더 많은 데이터 소스가 추가될 것이라 가정하고, 새 소스를  추가하는 데 필요한 프로그래밍 노력을 최소화하는 방향으로 설계해야 합니다.

 

소프트웨어 아키텍처는 마스트하기 위해 평생을 바쳐야 할 수도 있는 광범위하고 중요한 주제입니다. 다행스럽게도 웹 스크레이핑 관련된 소프트웨어 아키텍처는 상대적으로 쉽게 익힐 수 있는, 훨씬 좁고 관리하기 쉬운 기술 집합입니다. 데이터를 계속 스크랩하다 보면 똑같은 기본 패턴이 반복적으로 발생하는 것을 찾을 수 있습니다.

 

프로젝트 자체애 대해 생각하는 시간은 많은 시간을 절약해 줄 것입니다.