scraper

package
v1.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 18, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrContextCanceled = apperrors.New(apperrors.Unavailable, "작업 중단: 컨텍스트 취소 또는 타임아웃")

ErrContextCanceled 스크래핑 프로세스에서 컨텍스트 취소 또는 타임아웃 발생 시 사용되는 공통 에러 인스턴스입니다. ParseHTML 함수 등에서 컨텍스트 상태를 확인하여 이미 취소된 경우 즉시 반환되며, 불필요한 작업을 조기에 중단합니다.

View Source
var ErrDecodeTargetNil = apperrors.New(apperrors.Internal, "JSON 디코딩 실패: 결과를 저장할 변수가 nil입니다")

ErrDecodeTargetNil JSON 응답을 디코딩할 대상 변수가 nil일 때 반환되는 에러입니다. FetchJSON 함수 호출 시 디코딩 대상 변수 v가 nil인 경우 즉시 반환되며, json.Decoder.Decode(nil) 호출로 인한 런타임 패닉을 사전에 차단합니다.

View Source
var ErrInputReaderNil = apperrors.New(apperrors.Internal, "HTML 파싱 실패: 입력 데이터 스트림이 nil입니다")

ErrInputReaderNil HTML 파싱을 위한 입력 데이터 스트림이 제공되지 않았을 때 반환되는 에러입니다. ParseHTML 함수 호출 시 io.Reader 파라미터 r이 nil인 경우 입력 검증 단계에서 즉시 반환되며, API 계약 위반을 명확히 통보합니다.

View Source
var ErrInputReaderTypedNil = apperrors.New(apperrors.Internal, "HTML 파싱 실패: 입력 데이터 스트림이 Typed Nil입니다")

ErrInputReaderTypedNil HTML 파싱을 위한 입력 데이터 스트림이 Typed Nil 포인터일 때 반환되는 에러입니다. ParseHTML 함수 호출 시 io.Reader 파라미터 r이 포인터 타입이면서 nil 값을 가진 경우 입력 검증 단계에서 즉시 반환되며, 런타임 패닉을 방지합니다.

Functions

func NewErrHTMLStructureChanged

func NewErrHTMLStructureChanged(url, message string) error

NewErrHTMLStructureChanged 대상 페이지의 HTML 구조 변경으로 인해 예상 요소를 찾을 수 없을 때 발생하는 '논리적 파싱 실패' 에러를 생성합니다.

이 에러는 네트워크 장애가 아닌 사이트 개편(UI/UX 변경, 프론트엔드 프레임워크 교체)을 감지하는 핵심 관측 지표로, CSS 셀렉터 업데이트가 필요함을 의미합니다.

매개변수:

  • url: 구조 변경이 감지된 페이지 URL (빈 문자열 가능)
  • message: 구조 변경에 대한 설명 메시지

반환값: apperrors.ExecutionFailed 타입의 에러

Types

type HTMLScraper

type HTMLScraper interface {
	// FetchHTML 지정된 URL로 HTTP 요청을 보내 HTML 문서를 가져오고, 파싱된 goquery.Document를 반환합니다.
	//
	// 매개변수:
	//   - ctx: 요청의 생명주기를 제어하는 컨텍스트 (취소, 타임아웃 등)
	//   - method: HTTP 메서드 (예: "GET", "POST")
	//   - rawURL: 요청할 URL
	//   - body: 요청 본문 데이터 (nil 가능, GET 요청 시 일반적으로 nil)
	//   - header: 추가 HTTP 헤더 (nil 가능, 예: User-Agent, Cookie 등)
	//
	// 반환값:
	//   - *goquery.Document: 파싱된 HTML 문서 객체
	//   - error: 네트워크 오류, 파싱 오류, 또는 응답 크기 초과 시 에러 반환
	FetchHTML(ctx context.Context, method, rawURL string, body io.Reader, header http.Header) (*goquery.Document, error)

	// FetchHTMLDocument 지정된 URL로 GET 요청을 보내 HTML 문서를 가져오는 헬퍼 함수입니다.
	//
	// 이 함수는 FetchHTML을 내부적으로 호출하며, HTTP 메서드를 "GET"으로 고정하고 요청 본문(Body)을 nil로 설정합니다.
	// 단순히 웹 페이지를 읽어오는 가장 일반적인 사용 사례를 위한 간편한 인터페이스를 제공합니다.
	//
	// 매개변수:
	//   - ctx: 요청의 생명주기를 제어하는 컨텍스트 (취소, 타임아웃 등)
	//   - rawURL: 요청할 URL
	//   - header: 추가 HTTP 헤더 (nil 가능, 예: User-Agent, Cookie 등)
	//
	// 반환값:
	//   - *goquery.Document: 파싱된 HTML 문서 객체
	//   - error: 네트워크 오류, 파싱 오류, 또는 응답 크기 초과 시 에러 반환
	FetchHTMLDocument(ctx context.Context, rawURL string, header http.Header) (*goquery.Document, error)

	// ParseHTML io.Reader로부터 HTML 문서를 파싱하여 goquery.Document를 반환합니다.
	//
	// 이 함수는 이미 메모리에 로드된 HTML 데이터(문자열, 파일 등)를 처리할 때 사용됩니다.
	// FetchHTML과 달리 HTTP 요청을 수행하지 않으며, 제공된 Reader에서 직접 데이터를 읽어 파싱합니다.
	//
	// 매개변수:
	//   - ctx: 컨텍스트 (로깅 연동 및 취소 신호 감지)
	//   - r: HTML 데이터를 읽을 io.Reader (nil 불가)
	//   - rawURL: 문서의 기준 URL (상대 경로 링크를 절대 경로로 변환할 때 사용, 빈 문자열 가능)
	//   - contentType: HTTP 응답의 Content-Type 헤더 (인코딩 감지를 위한 힌트로 사용됨, 빈 문자열 가능)
	//
	// 반환값:
	//   - *goquery.Document: 파싱된 HTML 문서 객체
	//   - error: 입출력 오류, 컨텍스트 취소 또는 파싱 실패 시 에러 반환
	//
	// 보안 고려사항:
	//   - maxResponseBodySize를 초과하는 입력은 에러를 반환합니다. (DoS 방지 및 데이터 무결성 보장)
	//   - 컨텍스트 취소 시 즉시 중단됩니다.
	ParseHTML(ctx context.Context, r io.Reader, rawURL string, contentType string) (*goquery.Document, error)
}

HTMLScraper HTML 페이지 스크래핑을 위한 인터페이스입니다.

이 인터페이스는 웹 페이지에서 HTML 문서를 가져오고 파싱하는 기능을 제공합니다. goquery.Document를 반환하여 CSS 선택자 기반의 데이터 추출을 지원합니다.

type JSONScraper

type JSONScraper interface {
	// FetchJSON 지정된 URL로 HTTP 요청을 보내 JSON 응답을 가져오고, 지정된 구조체로 디코딩합니다.
	//
	// 이 함수는 RESTful API 호출에 최적화되어 있으며, 다음과 같은 주요 기능을 제공합니다:
	//   - 요청 본문 자동 처리: 구조체를 전달하면 자동으로 JSON 마샬링하여 전송
	//   - 응답 검증: Content-Type 확인 및 HTML 응답 감지
	//   - 메모리 무결성: maxResponseBodySize 초과 시 에러를 반환하여 불완전한 파싱 방지
	//   - 자동 재시도 지원: 네트워크 오류 시 Fetcher가 요청을 재시도할 수 있도록 본문을 메모리 버퍼링
	//
	// 매개변수:
	//   - ctx: 요청의 생명주기를 제어하는 컨텍스트 (취소, 타임아웃 등)
	//   - method: HTTP 메서드 (예: "GET", "POST")
	//   - rawURL: 요청할 URL
	//   - body: 요청 본문 데이터 (nil 가능, GET 요청 시 일반적으로 nil)
	//   - header: 추가 HTTP 헤더 (nil 가능, 예: User-Agent, Cookie 등)
	//   - v: JSON 응답을 디코딩할 대상 구조체의 포인터 (반드시 nil이 아닌 포인터여야 함)
	//
	// 반환값:
	//   - error: 네트워크 오류, JSON 파싱 오류, 또는 응답 크기 초과 시 에러 반환
	FetchJSON(ctx context.Context, method, rawURL string, body any, header http.Header, v any) error
}

JSONScraper JSON API 스크래핑을 위한 인터페이스입니다.

이 인터페이스는 RESTful API 등 JSON 형식의 데이터를 제공하는 엔드포인트에서 데이터를 가져오고 Go 구조체로 자동 변환하는 기능을 제공합니다.

type Option

type Option func(*scraper)

Option Scraper 구성을 위한 옵션 함수 타입입니다.

func WithMaxRequestBodySize

func WithMaxRequestBodySize(size int64) Option

WithMaxRequestBodySize HTTP 요청 본문의 최대 읽기 크기를 바이트 단위로 설정합니다.

이 옵션은 POST, PUT, PATCH 등의 메서드로 데이터를 전송할 때, 요청 본문의 크기를 제한하여 메모리 사용량을 제어하고 과도한 데이터 전송을 방지합니다. 설정된 크기를 초과하는 요청 본문은 전송되지 않으며 에러를 반환합니다.

매개변수:

  • size: 최대 읽기 크기(바이트). 0보다 큰 값이어야 합니다.

func WithMaxResponseBodySize

func WithMaxResponseBodySize(size int64) Option

WithMaxResponseBodySize HTTP 응답 본문의 최대 읽기 크기를 바이트 단위로 설정합니다.

이 옵션은 메모리 사용량을 제어하고 악의적이거나 예상보다 큰 응답으로부터 시스템을 보호하기 위해 사용됩니다. 설정된 크기를 초과하는 응답 본문은 에러 처리되며, 부분 데이터도 반환하지 않습니다. 이는 불완전한 데이터로 인한 오동작을 방지하기 위함입니다.

매개변수:

  • size: 최대 읽기 크기(바이트). 0보다 큰 값이어야 합니다.

func WithResponseCallback

func WithResponseCallback(callback func(*http.Response)) Option

WithResponseCallback HTTP 응답을 수신한 직후, 응답 본문을 읽기 전에 실행될 콜백 함수를 설정합니다.

이 콜백은 응답 본문이 닫히기 전에 호출되므로, 응답 헤더, 상태 코드, 쿠키 등의 메타데이터를 검사하거나 로깅하는 용도로 사용할 수 있습니다. 본문 데이터를 읽거나 수정하는 작업은 스크래퍼의 내부 처리 로직과 충돌할 수 있으므로 권장하지 않습니다.

매개변수:

  • callback: *http.Response를 인자로 받는 콜백 함수

주의사항:

  • 콜백 함수 내에서 Response.Body를 읽거나 닫으면 안 됩니다.
  • 콜백 함수는 빠르게 실행되어야 하며, 블로킹 작업은 피해야 합니다.
  • 콜백 함수에서 발생한 패닉은 스크래핑 작업 전체를 중단시킬 수 있습니다.

type Scraper

type Scraper interface {
	HTMLScraper
	JSONScraper
}

Scraper 웹 페이지 스크래핑을 위한 통합 인터페이스입니다.

func New

func New(f fetcher.Fetcher, opts ...Option) Scraper

New 새로운 Scraper 인터페이스 구현체를 생성합니다.

매개변수:

  • f: HTTP 요청을 수행할 Fetcher (필수, nil이면 패닉 발생)
  • opts: 선택적 설정 옵션들

반환값:

  • Scraper: 생성된 스크래퍼 인스턴스

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL