미리 정의된 페이지 집합을 크롤링하는 것과 달리, 웹 사이트 내부 링크를 모두 크롤링하면 무엇을 얻게 될지 정확히 알 수 없다는 문제가 있습니다. 다행히 페이지 유형을 식별하는 몇 가지 기본적인 방법이 있습니다.
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
위 두 클래스를 사용하면 웹사이트에 제품 종보 외에 블로그 포스트나 보도 자료가 있다 해도 문제 없이 스크랩할 수 있습니다.
좋은 웹 크롤러 아키텍처
대형 웹 스크레이핑 프로젝트를 진행한다면 첫 번째 단계에서 "어떤 정보가 필요한지", "어떻게 정보를 얻을 것인지" 와 같은 질문에 답해야 합니다.
여려 도메인, 또는 여러 소스에서 유사한 데이터를 수집할 때는 항상 일반화를 시도해야 합니다. 데이터 필드가 모두 일치하고 서로 비교할 수 있게 일반화 한다면 원래 소스의 형식에 완전히 의존하는 데이터를 다루기보다 훨씬 쉽습니다.
스크레이퍼를 만들 때는 추후 더 많은 데이터 소스가 추가될 것이라 가정하고, 새 소스를 추가하는 데 필요한 프로그래밍 노력을 최소화하는 방향으로 설계해야 합니다.
소프트웨어 아키텍처는 마스트하기 위해 평생을 바쳐야 할 수도 있는 광범위하고 중요한 주제입니다. 다행스럽게도 웹 스크레이핑 관련된 소프트웨어 아키텍처는 상대적으로 쉽게 익힐 수 있는, 훨씬 좁고 관리하기 쉬운 기술 집합입니다. 데이터를 계속 스크랩하다 보면 똑같은 기본 패턴이 반복적으로 발생하는 것을 찾을 수 있습니다.
프로젝트 자체애 대해 생각하는 시간은 많은 시간을 절약해 줄 것입니다.
'IT > Scraping' 카테고리의 다른 글
문서읽기: PDF, 워드와 .doxs (0) | 2025.02.18 |
---|---|
문서 읽기: 텍스트, CSV (0) | 2025.02.18 |
웹 크롤링 모델: 링크를 통한 사이트 크롤링 (0) | 2025.02.16 |
웹 크롤러 모델: 검색을 통한 사이트 크롤링 (0) | 2025.02.14 |
웹 크롤링 모델: 객체 계획 및 정의와 다양한 웹사이트 레이아웃 다루기 (0) | 2025.02.14 |