Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrContextCanceled = apperrors.New(apperrors.Unavailable, "작업 중단: 컨텍스트 취소 또는 타임아웃")
ErrContextCanceled 스크래핑 프로세스에서 컨텍스트 취소 또는 타임아웃 발생 시 사용되는 공통 에러 인스턴스입니다. ParseHTML 함수 등에서 컨텍스트 상태를 확인하여 이미 취소된 경우 즉시 반환되며, 불필요한 작업을 조기에 중단합니다.
var ErrDecodeTargetNil = apperrors.New(apperrors.Internal, "JSON 디코딩 실패: 결과를 저장할 변수가 nil입니다")
ErrDecodeTargetNil JSON 응답을 디코딩할 대상 변수가 nil일 때 반환되는 에러입니다. FetchJSON 함수 호출 시 디코딩 대상 변수 v가 nil인 경우 즉시 반환되며, json.Decoder.Decode(nil) 호출로 인한 런타임 패닉을 사전에 차단합니다.
var ErrInputReaderNil = apperrors.New(apperrors.Internal, "HTML 파싱 실패: 입력 데이터 스트림이 nil입니다")
ErrInputReaderNil HTML 파싱을 위한 입력 데이터 스트림이 제공되지 않았을 때 반환되는 에러입니다. ParseHTML 함수 호출 시 io.Reader 파라미터 r이 nil인 경우 입력 검증 단계에서 즉시 반환되며, API 계약 위반을 명확히 통보합니다.
var ErrInputReaderTypedNil = apperrors.New(apperrors.Internal, "HTML 파싱 실패: 입력 데이터 스트림이 Typed Nil입니다")
ErrInputReaderTypedNil HTML 파싱을 위한 입력 데이터 스트림이 Typed Nil 포인터일 때 반환되는 에러입니다. ParseHTML 함수 호출 시 io.Reader 파라미터 r이 포인터 타입이면서 nil 값을 가진 경우 입력 검증 단계에서 즉시 반환되며, 런타임 패닉을 방지합니다.
Functions ¶
func NewErrHTMLStructureChanged ¶
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 ¶
WithMaxRequestBodySize HTTP 요청 본문의 최대 읽기 크기를 바이트 단위로 설정합니다.
이 옵션은 POST, PUT, PATCH 등의 메서드로 데이터를 전송할 때, 요청 본문의 크기를 제한하여 메모리 사용량을 제어하고 과도한 데이터 전송을 방지합니다. 설정된 크기를 초과하는 요청 본문은 전송되지 않으며 에러를 반환합니다.
매개변수:
- size: 최대 읽기 크기(바이트). 0보다 큰 값이어야 합니다.
func WithMaxResponseBodySize ¶
WithMaxResponseBodySize HTTP 응답 본문의 최대 읽기 크기를 바이트 단위로 설정합니다.
이 옵션은 메모리 사용량을 제어하고 악의적이거나 예상보다 큰 응답으로부터 시스템을 보호하기 위해 사용됩니다. 설정된 크기를 초과하는 응답 본문은 에러 처리되며, 부분 데이터도 반환하지 않습니다. 이는 불완전한 데이터로 인한 오동작을 방지하기 위함입니다.
매개변수:
- size: 최대 읽기 크기(바이트). 0보다 큰 값이어야 합니다.
func WithResponseCallback ¶
WithResponseCallback HTTP 응답을 수신한 직후, 응답 본문을 읽기 전에 실행될 콜백 함수를 설정합니다.
이 콜백은 응답 본문이 닫히기 전에 호출되므로, 응답 헤더, 상태 코드, 쿠키 등의 메타데이터를 검사하거나 로깅하는 용도로 사용할 수 있습니다. 본문 데이터를 읽거나 수정하는 작업은 스크래퍼의 내부 처리 로직과 충돌할 수 있으므로 권장하지 않습니다.
매개변수:
- callback: *http.Response를 인자로 받는 콜백 함수
주의사항:
- 콜백 함수 내에서 Response.Body를 읽거나 닫으면 안 됩니다.
- 콜백 함수는 빠르게 실행되어야 하며, 블로킹 작업은 피해야 합니다.
- 콜백 함수에서 발생한 패닉은 스크래핑 작업 전체를 중단시킬 수 있습니다.
type Scraper ¶
type Scraper interface {
HTMLScraper
JSONScraper
}
Scraper 웹 페이지 스크래핑을 위한 통합 인터페이스입니다.