Crawl4AI와 DeepSeek를 활용한 AI 스크레이퍼 구축 방법

Crawl4AI와 DeepSeek를 활용한 AI 기반 웹 스크레이퍼 구축 방법을 단계별 상세 튜토리얼을 통해 배워보세요.
8 분 읽기
Web Scraping with Crawl4AI Deepseek and Web Unlocker blog image

이 튜토리얼에서는 다음을 배웁니다:

  • Crawl4AI란 무엇이며 웹 스크래핑에 어떤 기능을 제공하는지
  • DeepSeek 같은 LLM과 함께 Crawl4AI를 활용하기에 적합한 시나리오
  • 가이드 섹션을 통해 DeepSeek 기반 Crawl4AI 스크레이퍼 구축 방법

시작해 보겠습니다!

Crawl4AI란 무엇인가요?

Crawl4AI는 대규모 언어 모델(LLM), AI 에이전트 및 데이터 파이프라인과 원활하게 통합되도록 설계된 오픈 소스 AI 지원 웹 크롤러 및 스크레이퍼입니다. 유연하고 배포가 쉬우면서도 고속의 실시간 데이터 추출을 제공합니다.

AI 웹 스크래핑을 위한 주요 기능은 다음과 같습니다:

  • LLM을 위해 설계됨: 검색 강화 생성(RAG) 및 미세 조정에 최적화된 구조화된 마크다운을 생성합니다.
  • 유연한 브라우저 제어: 세션 관리, 프록시, 사용자 정의 훅을 지원합니다.
  • 휴리스틱 인텔리전스: 데이터 파싱 최적화를 위한 스마트 알고리즘 활용.
  • 완전 오픈 소스: API 키 불필요; Docker 및 클라우드 플랫폼을 통해 배포 가능.

자세한 내용은 공식 문서를 참조하세요.

웹 스크래핑에 Crawl4AI와 DeepSeek를 사용할 때

DeepSeek는 효율성과 효과성으로 AI 커뮤니티에 큰 반향을 일으킨 강력하고 오픈 소스이며 무료인 LLM 모델을 제공합니다. 또한, 이러한 모델은 Crawl4AI와 원활하게 통합됩니다.

Crawl4AI에서 DeepSeek를 활용하면 사전 정의된 파싱 로직 없이도 가장 복잡하고 일관성이 없는 웹 페이지에서도 구조화된 데이터를 추출할 수 있습니다.

DeepSeek + Crawl4AI 조합이 특히 유용한 주요 시나리오는 다음과 같습니다:

  • 자주 변경되는 사이트 구조: 기존 스크래퍼는 웹사이트의 HTML 구조가 업데이트되면 작동이 중단되지만, AI는 동적으로 적응합니다.
  • 일관되지 않은 페이지 레이아웃: 아마존과 같은 플랫폼은 제품 페이지 디자인이 다양합니다. LLM은 레이아웃 차이와 관계없이 지능적으로 데이터를 추출할 수 있습니다.
  • 비정형 콘텐츠 파싱: LLM 기반 처리로 자유 텍스트 리뷰, 블로그 게시물, 포럼 토론에서 인사이트 추출이 용이해집니다.

Crawl4AI와 DeepSeek를 활용한 웹 스크래핑: 단계별 가이드

이 가이드 튜토리얼에서는 Crawl4AI를 사용하여 AI 기반 웹 스크레이퍼를 구축하는 방법을 배웁니다. LLM 엔진으로는 DeepSeek를 사용할 것입니다.

구체적으로, Bright Data의 G2 페이지에서 데이터를 추출하는 AI 스크레이퍼를 만드는 방법을 살펴보겠습니다:

The G2 target page

아래 단계를 따라 Crawl4AI와 DeepSeek로 웹 스크래핑을 수행하는 방법을 배워보세요!

필수 조건

이 튜토리얼을 따라하려면 다음 전제 조건을 충족해야 합니다:

GroqCloud 또는 Bright Data 계정이 아직 없더라도 걱정하지 마세요. 다음 단계에서 계정 설정을 안내해 드립니다.

1단계: 프로젝트 설정

다음 명령어를 실행하여 Crawl4AI DeepSeek 스크래핑 프로젝트용 폴더를 생성하세요:

mkdir crawl4ai-deepseek-scraper

프로젝트 폴더로 이동하여 가상 환경을 생성하세요:

cd crawl4ai-deepseek-scraper
python -m venv venv

이제 선호하는 Python IDE에서 crawl4ai-deepseek-scraper 폴더를 로드하세요. Python 확장 기능이 설치된 Visual Studio Code 또는 PyCharm Community Edition이 두 가지 훌륭한 옵션입니다.

프로젝트 폴더 내에서 다음을 생성합니다:

  • scraper.py: AI 기반 스크래핑 로직을 담을 파일입니다.
  • models/: Pydantic 기반 Crawl4AI LLM 데이터 모델을 저장할 디렉터리.
  • .env: 환경 변수를 안전하게 저장할 파일입니다.

이 파일과 폴더를 생성한 후 프로젝트 구조는 다음과 같아야 합니다:

The file structure of the Crawl4AI DeepSeek scraper

다음으로 IDE 터미널에서 가상 환경을 활성화하세요.

Linux 또는 macOS에서는 다음 명령을 실행하세요:

./env/bin/activate

Windows에서는 동일하게 다음을 실행하세요:

env/Scripts/activate

좋습니다! 이제 DeepSeek을 활용한 Crawl4AI 웹 스크래핑을 위한 Python 환경이 준비되었습니다.

2단계: Crawl4AI 설치

가상 환경을 활성화한 상태에서 crawl4ai pip 패키지를 통해 Crawl4AI를 설치하세요:

pip install crawl4ai

라이브러리에 여러 종속성이 있으므로 설치에 시간이 다소 소요될 수 있습니다.

설치가 완료되면 터미널에서 다음 명령어를 실행하세요:

crawl4ai-setup

이 과정은:

  1. 필요한 Playwright 브라우저(Chromium, Firefox 등)를 설치하거나 업데이트합니다.
  2. OS 수준 점검을 수행합니다(예: Linux에서 필요한 시스템 라이브러리가 설치되었는지 확인).
  3. 웹 크롤링을 위한 환경이 제대로 설정되었는지 확인합니다.

명령 실행 후 다음과 유사한 출력이 표시됩니다:

[INIT].... → 설치 후 설정 실행 중...
[INIT].... → Playwright 브라우저 설치 중...
[COMPLETE] ● Playwright 설치 성공적으로 완료됨.
[INIT].... → 데이터베이스 초기화 시작 중...
[COMPLETE] ● 데이터베이스 백업 생성 위치: C:Usersantoz.crawl4aicrawl4ai.db.backup_20260219_092341
[INIT].... → 데이터베이스 마이그레이션 시작 중...
[COMPLETE] ● 마이그레이션 완료. 처리된 레코드: 0개.
[COMPLETE] ● 데이터베이스 초기화 성공적으로 완료되었습니다.
[COMPLETE] ● 설치 후 설정 완료!

대단합니다! Crawl4AI가 설치되어 사용 준비가 완료되었습니다.

단계 #4: scraper.py 초기화

Crawl4AI는 비동기 코드가 필요하므로, 기본 asyncio 스크립트를 생성하여 시작하세요:

import asyncio

async def main():
    # 스크래핑 로직...

if __name__ == "__main__":
    asyncio.run(main())

이제 이 프로젝트는 DeepSeek 같은 타사 서비스와의 연동을 포함한다는 점을 기억하세요. 이를 구현하려면 API 키 및 기타 비밀 정보가 필요합니다. 이를 .env 파일에 저장할 것입니다.

환경 변수를 로드하려면 python-dotenv를 설치하세요:

pip install python-dotenv

main()을 정의하기 전에 load_dotenv().env 파일의 환경 변수를 로드하세요:

load_dotenv()

python-dotenv 라이브러리에서 load_dotenv를 임포트합니다:

from dotenv import load_dotenv

완벽합니다! scraper.py는 이제 AI 기반 스크래핑 로직을 호스팅할 준비가 되었습니다.

5단계: 첫 번째 AI 스크레이퍼 만들기

scraper.py의 main() 함수 내에서 기본 Crawl4AI 크롤러를 사용하여 다음 로직을 추가하세요:

# 브라우저 구성
browser_config = BrowserConfig(
    headless=True)


# 크롤러 구성
crawler_config = CrawlerRunConfig(
    cache_mode=CacheMode.BYPASS)


# AI 기반 크롤러 실행
async with AsyncWebCrawler(config=browser_config) as crawler:
    result = await crawler.arun(
        url="https://www.g2.com/products/bright-data/reviews",
        config=crawler_config
    )

    # 처음 1000자 출력
    print(f"파싱된 마크다운 데이터:n{result.markdown[:1000]}")

위 코드 조각의 핵심 포인트는 다음과 같습니다:

  • BrowserConfig: 웹 스크래핑을 위한 헤드리스 모드 및 사용자 정의 사용자 에이전트 설정 등 브라우저 실행 및 동작 방식을 제어합니다.
  • CrawlerRunConfig: 캐싱 전략, 데이터 선택 규칙, 타임아웃 등 크롤링 동작을 정의합니다.
  • headless=True: 리소스 절약을 위해 GUI 없이 헤드리스 모드로브라우저를 실행하도록 구성합니다.
  • CacheMode.BYPASS: 이 설정은 크롤러가 캐시된 데이터에 의존하지 않고 웹사이트에서 직접 최신 콘텐츠를 가져오도록 보장합니다.
  • crawler.arun(): 이 메서드는 지정된 URL에서 데이터를 추출하기 위해 비동기 크롤러를 실행합니다.
  • result.markdown: 추출된 콘텐츠를 파싱 및 분석이 용이한 마크다운 형식으로 변환합니다.

다음 임포트 문장을 추가하는 것을 잊지 마세요:

from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode

현재 scraper.py 파일에는 다음 내용이 포함되어야 합니다:

import asyncio
from dotenv import load_dotenv
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode

# .env 파일에서 비밀값 불러오기
load_dotenv()

async def main():
    # 브라우저 구성
    browser_config = BrowserConfig(
      headless=True
    )

    # 크롤러 구성
    crawler_config = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS
    )

    # AI 기반 크롤러 실행
    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://www.g2.com/products/bright-data/reviews",
            config=crawler_config
        )

        # 처음 1000자 출력
        print(f"파싱된 마크다운 데이터:n{result.markdown[:1000]}")

if __name__ == "__main__":
    asyncio.run(main())

스크립트를 실행하면 아래와 같은 출력이 표시됩니다:

[INIT].... → Crawl4AI 0.4.248
[FETCH]... ↓ https://www.g2.com/products/bright-data/reviews... | Status: True | Time: 0.83s
[SCRAPE].. ◆ Processed https://www.g2.com/products/bright-data/reviews... | 소요 시간: 1ms
[COMPLETE] ● https://www.g2.com/products/bright-data/reviews... | 상태: True | 총 소요 시간: 0.83초
구문 분석된 마크다운 데이터:

분석된 마크다운 내용이 비어 있어 의심스럽습니다. 추가 조사를 위해 응답 상태를 출력하세요:

print(f"응답 상태 코드: {result.status_code}")

이번에는 출력에 다음이 포함됩니다:

응답 상태 코드: 403

Markdown 파싱 결과가 비어 있는 이유는 Crawl4AI 요청이 G2의 봇 탐지 시스템에 의해 차단되었기 때문입니다. 서버가 반환한 403 Forbidden 상태 코드로 이를 명확히 알 수 있습니다.

이는 G2가 엄격한 봇 방지 조치를 시행하고 있기 때문에 놀랄 일이 아닙니다. 특히 일반 브라우저로 접속할 때조차 종종 CAPTCHA를 표시합니다:

The G2 CAPTCHA page

이 경우 유효한 콘텐츠를 수신하지 못했기 때문에 Crawl4AI는 이를 마크다운으로 변환할 수 없었습니다. 다음 단계에서는 이 제한을 우회하는 방법을 살펴보겠습니다. 추가 정보는 Python에서 CAPTCHA 우회 방법 가이드를 참고하세요.

6단계: Web Unlocker API 설정

Crawl4AI는 강력한 봇 우회 메커니즘을 내장한 도구입니다. 그러나 G2처럼 엄격하고 최상급의 봇 방지 및 스크래핑 방지 조치를 사용하는 고도로 보호된 웹사이트는 우회할 수 없습니다.

이러한 사이트에 대한 최선의 해결책은 보호 수준과 무관하게 모든 웹페이지의 차단을 해제하도록 설계된 전용 도구를 사용하는 것입니다. 이 작업에 이상적인 스크래핑 제품은 Bright Data의 Web Unlocker로, 다음과 같은 기능을 제공하는 스크래핑 API입니다:

  • 실제 사용자 행동을 모방하여 봇 탐지 우회
  • 프록시 관리 및 CAPTCHA 해결을 자동 처리
  • 인프라 관리 없이도 원활하게 확장 가능

다음 지침을 따라 Web Unlocker API를 Crawl4AI DeepSeek 스크레이퍼에 통합하세요.
또는 공식 문서를 참고하세요.

먼저 Bright Data 계정에 로그인하거나 아직 계정이 없다면 생성하세요. 계정에 자금을 충전하거나 모든 제품에 제공되는 무료 체험을 활용하세요.

다음으로 대시보드에서 “프록시 및 스크래핑”으로 이동하여 테이블에서 “언블로커” 옵션을 선택하세요:

Selecting the "unblocker" option in the Bright Data dashboard

그러면 아래와 같은 웹 언락커 API 설정 페이지로 이동합니다:

The Web Unlocker API setup page

여기서 토글을 클릭하여 웹 언락커 API를 활성화하세요:

The toggle is now set to "On"

G2는 CAPTCHA를 포함한 고급 봇 방지 시스템으로 보호됩니다. 따라서 “구성” 페이지에서 다음 두 토글이 활성화되었는지 확인하세요:

Enabling the "Premium domains" and "CAPTCHA Solver" options

Crawl4AI는 제어된 브라우저에서 페이지를 탐색하는 방식으로 작동합니다. 내부적으로는 Playwright의 goto() 함수를 활용하여 대상 웹페이지에 HTTP GET 요청을 전송합니다. 반면 Web Unlocker API는 POST 요청을 통해 작동합니다.

이는 문제가 되지 않습니다. Crawl4AI에서 Web Unlocker API를 프록시로 구성하여 사용할 수 있기 때문입니다. 이렇게 하면 Crawl4AI의 브라우저가 Bright Data 제품을 통해 요청을 전송하고 차단되지 않은 HTML 페이지를 수신할 수 있습니다.

웹 언락커 API 프록시 인증 정보에 접근하려면 “개요” 페이지의 “네이티브 프록시 기반 접근” 탭으로 이동하세요:

native proxy-based access on the overview page

페이지에서 다음 자격 증명을 복사하세요:

  • <HOST>
  • <PORT>
  • <사용자 이름>
  • <PASSWORD>

그런 다음, 이 환경 변수들을 사용하여 .env 파일에 입력하세요:

PROXY_SERVER=https://<HOST>:<PORT>
PROXY_USERNAME=<USERNAME>
PROXY_PASSWORD=<PASSWORD>

훌륭합니다! Web Unlocker가 이제 Crawl4AI와 통합될 준비가 되었습니다.

7단계: Web Unlocker API 통합

BrowserConfig는 proxy_config 객체를 통해 프록시 통합을 지원합니다. Web Unlocker API를 Crawl4AI와 통합하려면 .env 파일의 환경 변수로 해당 객체를 채우고 BrowserConfig 생성자에 전달하세요:

# Bright Data의 Web Unlocker API 프록시 구성
proxy_config = {
    "server": os.getenv("PROXY_SERVER"),
    "username": os.getenv("PROXY_USERNAME"),
    "password": os.getenv("PROXY_PASSWORD")
}

# 브라우저 구성
browser_config = BrowserConfig(
    headless=True,
    proxy_config=proxy_config,
)

Python 표준 라이브러리에서 os를 임포트하는 것을 잊지 마세요:

import os

Web Unlocker API는 프록시를 통한 IP 로테이션 및 최종적인 CAPTCHA 해결로 인해 일부 시간 오버헤드가 발생합니다. 이를 고려하여 다음을 수행해야 합니다:

  1. 페이지 로드 시간 제한을 3분으로 늘리세요
  2. 크롤러가 DOM을 완전히 로드한 후 파싱하도록 지시

다음 CrawlerRunConfig 구성으로 이를 달성하세요:

crawler_config = CrawlerRunConfig(
    cache_mode=CacheMode.BYPASS,
    wait_until="domcontentloaded", # 페이지 DOM 로드 완료까지 대기
    page_timeout=180000, # 페이지 로드 최대 3분 대기
)

G2와 같은 복잡한 사이트를 처리할 때 Web Unlocker API조차 완벽하지 않다는 점에 유의하십시오. 드물게 스크래핑 API가 차단 해제된 페이지를 가져오지 못해 스크립트가 다음과 같은 오류로 종료될 수 있습니다:

오류: ACS-GOTO 이동 실패:                                                 
Page.goto: net::ERR_HTTP_RESPONSE_CODE_FAILURE at https://www.g2.com/products/bright-data/reviews

성공한 요청에 대해서만 요금이 부과되므로, 스크립트가 작동할 때까지 재실행할 필요가 없습니다. 프로덕션 스크립트에서는 자동 재시도 로직 구현을 고려하세요.

요청이 성공하면 다음과 같은 출력을 받게 됩니다:

응답 상태 코드: 200
구문 분석된 마크다운 데이터:
  * [홈](https://www.g2.com/products/bright-data/</>)
  * [리뷰 작성](https://www.g2.com/products/bright-data/</wizard/new-review>)
  * 둘러보기
  * [인기 카테고리](https://www.g2.com/products/bright-data/<#>)
인기 카테고리
    * [AI 챗봇 소프트웨어](https://www.g2.com/products/bright-data/<https:/www.g2.com/categories/ai-chatbots>)
    * [CRM 소프트웨어](https://www.g2.com/products/bright-data/<https:/www.g2.com/categories/crm>)
    * [프로젝트 관리 소프트웨어](https://www.g2.com/products/bright-data/<https:/www.g2.com/categories/project-management>)
    * [경비 관리 소프트웨어](https://www.g2.com/products/bright-data/<https:/www.g2.com/categories/expense-management>)
    * [화상 회의 소프트웨어](https://www.g2.com/products/bright-data/<https:/www.g2.com/categories/video-conferencing>)
    * [온라인 백업 소프트웨어](https://www.g2.com/products/bright-data/<https:/www.g2.com/categories/online-backup>)
    * [전자상거래 플랫폼](https://www.g2.com/products/brig

훌륭합니다! 이번에는 G2가 200 OK 상태 코드로 응답했습니다. 이는 요청이 차단되지 않았으며, Crawl4AI가 의도한 대로 HTML을 Markdown으로 성공적으로 파싱했음을 의미합니다.

단계 #8: Groq 설정

GroqCloud는 무료 플랜에서도 OpenAI 호환 API를 통해 DeepSeek AI 모델을 지원하는 몇 안 되는 제공업체 중 하나입니다. 따라서 Crawl4AI의 LLM 통합에 사용될 플랫폼으로 선택했습니다.

Groq 계정이 없다면 새로 생성하세요. 기존 계정이 있다면 로그인하세요. 사용자 대시보드에서 왼쪽 메뉴의 “API Keys”로 이동한 후 “Create API Key” 버튼을 클릭하세요:

The "Create API Key" button

팝업 창이 나타납니다:

The "Crate API Key" popup

API 키에 이름을 지정하세요(예: “Crawl4AI 스크래핑”). Cloudflare의 봇 방지 인증을 기다린 후 “제출”을 클릭하여 API 키를 생성하세요:

Your Groq API key

API 키를 복사하여 아래와 같이 .env 파일에 추가하세요:

LLM_API_TOKEN=<YOUR_GROK_API_KEY>

<YOUR_GROQ_API_KEY> 부분을 Groq에서 제공받은 실제 API 키로 대체하세요.

완벽합니다! 이제 Crawl4AI를 사용해 DeepSeek로 LLM 스크래핑을 시작할 준비가 되었습니다.

단계 #9: 스크래핑 데이터용 스키마 정의

Crawl4AI는 스키마 기반 접근 방식으로 LLM 스크래핑을 수행합니다. 여기서 스키마란 다음을 정의하는 JSON 데이터 구조입니다:

  1. 페이지에서 “컨테이너” 요소를 식별하는 기본 선택자(예: 제품 행, 블로그 게시물 카드).
  2. 각 데이터 조각(예: 텍스트, 속성, HTML 블록)을 캡처하기 위한 CSS/XPath 선택기를 지정하는 필드.
  3. 반복되거나 계층적 구조를 위한 중첩 또는 리스트 유형.

스키마를 정의하려면 먼저 대상 페이지에서 추출할 데이터를 식별해야 합니다. 이를 위해 브라우저의 시크릿 모드에서 대상 페이지를 엽니다:

The target page on G2

이 경우 다음과 같은 필드에 관심이 있다고 가정합니다:

  • name: 제품/회사 이름.
  • image_url: 제품/회사 이미지 URL.
  • description: 제품/회사에 대한 간단한 설명.
  • review_score: 제품/회사의 평균 리뷰 점수.
  • number_of_reviews: 총 리뷰 수.
  • claimed: 회사 프로필이 소유자에 의해 클레임되었는지 여부를 나타내는 부울 값.

이제 models 폴더에 g2_product.py 파일을 생성하고, 다음과 같이 Pydantic 기반 스키마 클래스 G2Product로 채웁니다:

# ./models/g2_product.py

from pydantic import BaseModel

class G2Product(BaseModel):
    """
    G2 제품/회사 페이지의 데이터 구조를 나타냅니다.
    """

    name: str
    image_url: str
    description: str
    review_score: str
    number_of_reviews: str
    claimed: bool

네! DeepSeek가 수행하는 LLM 스크래핑 프로세스는 위 스키마를 따르는 객체를 반환합니다.

10단계: DeepSeek 통합 준비

Crawl4AI와 DeepSeek 통합을 완료하기 전에 GroqCloud 계정의 “설정 > 제한” 페이지를 검토하세요:

The limitations on DeepSeek models from GroqCloud

해당 페이지에서 무료 플랜의 두 DeepSeek 모델에 적용되는 제한 사항은 다음과 같습니다:

  1. 분당 최대 30회 요청
  2. 일일 최대 1,000건 요청
  3. 분당 6,000 토큰 이하

첫 두 제한은 본 예시에서 문제가 되지 않으나, 마지막 제한은 도전 과제가 됩니다. 일반적인 웹 페이지는 수백만 자를 포함할 수 있으며, 이는 수십만 개의 토큰으로 변환됩니다.

즉, 토큰 제한으로 인해 Groq을 통해 G2 페이지 전체를 DeepSeek 모델에 직접 입력할 수 없습니다. 이 문제를 해결하기 위해 Crawl4AI는 페이지의 특정 섹션만 선택할 수 있도록 합니다. 전체 페이지가 아닌 해당 섹션만 Markdown으로 변환되어 LLM에 전달됩니다. 섹션 선택 과정은 CSS 선택자에 의존합니다.

선택할 섹션을 결정하려면 브라우저에서 대상 페이지를 엽니다. 관심 있는 데이터가 포함된 요소를 마우스 오른쪽 버튼으로 클릭하고 “검사” 옵션을 선택하세요:

The G2 product/company data header

여기서 .product-head__title 요소가 제품/회사명, 리뷰 점수, 리뷰 수, 인증 상태를 포함하고 있음을 확인할 수 있습니다.

이제 로고 섹션을 검사해 보세요:

The G2 product and company logo section

.product-head__logo CSS 선택자를 사용해 해당 정보를 추출할 수 있습니다.

마지막으로 설명 섹션을 검사합니다:

The G2 product/company description element

설명은 [itemprop="description"] 선택자를 사용하여 사용할 수 있습니다.

CrawlerRunConfig에서 다음과 같이 CSS 선택기를 구성하세요:

crawler_config = CrawlerRunConfig(
    cache_mode=CacheMode.BYPASS,
    wait_until="domcontentloaded", 
    page_timeout=180000,
    css_selector=".product-head__title, .product-head__logo, [itemprop="description"]", # 추출할 데이터의 요소 CSS 선택자
)

scraper.py를 다시 실행하면 다음과 같은 결과가 출력됩니다:

응답 상태 코드: 200
파싱된 마크다운 데이터:
[![Bright Data 리뷰](https://images.g2crowd.com/uploads/product/image/large_detail/large_detail_9d7645872b9abb68923fb7e2c7c9d834/bright-data.png)![G2 recognized Bright Data](https://images.g2crowd.com/uploads/report_medal_translation/image/3436/medal.svg)](https:/www.g2.com/products/bright-data/reviews)
[편집하기](https:/my.g2.com/bright-data/product_information)
[Bright Data](https:/www.g2.com/products/bright-data/reviews)
제공: [bright data](https:/www.g2.com/sellers/bright-data)
평점 분포 보기
5점 만점에 4.7점
[5점 78%](https:/www.g2.com/products/bright-data/reviews?filters%5Bnps_score%5D%5B%5D=5#reviews)
[4점 19%](https:/www.g2.c

출력에는 전체 HTML 페이지 대신 관련 섹션만 포함됩니다. 이 접근 방식은 토큰 사용량을 크게 줄여, 관심 있는 데이터를 효과적으로 추출하면서도 Groq의 무료 계층 한도 내에서 사용할 수 있게 합니다!

11단계: DeepSeek 기반 LLM 추출 전략 정의

Craw4AI는 LLMExtractionStrategy 객체를 통해 LLM 기반 데이터 추출을 지원합니다. DeepSeek 통합을 위해 아래와 같이 정의할 수 있습니다:

extraction_strategy = LLMExtractionStrategy(
    provider=os.getenv("LLM_MODEL"),
    api_token=os.getenv("LLM_API_TOKEN"),
    schema=G2Product.model_json_schema(),
    extraction_type="schema",
    instruction=(
        "아래 콘텐츠에서 'name', 'description', 'image_url', 'review_score', 'number_of_reviews'를 추출하세요. "
        "'review_score'는 "x/5" 형식이어야 합니다. 첫 몇 문장이 아닌 전체 설명을 가져오세요."
    ),
    input_format="markdown",
    verbose=True
)

LLM 모델을 지정하려면 .env 파일에 다음 환경 변수를 추가하세요:

LLM_MODEL=groq/deepseek-r1-distill-llama-70b

이는 Craw4AI가 LLM 기반 데이터 추출을 위해 GroqCloud의 deepseek-r1-distill-llama-70b 모델을 사용하도록 지시합니다.

scraper.py에서 LLMExtractionStrategyG2Product를 임포트하세요:

from crawl4ai.extraction_strategy import LLMExtractionStrategy
from models.g2_product import G2Product

그런 다음 추출 전략 객체를 크롤러 구성에 전달합니다:

crawler_config = CrawlerRunConfig(
    cache_mode=CacheMode.BYPASS,
    wait_until="domcontentloaded",
    page_timeout=180000, # 3분
    css_selector=".product-head__title, .product-head__logo, [itemprop="description"]",
    extraction_strategy=extraction_strategy
)

스크립트를 실행하면 Craw4AI는 다음과 같은 작업을 수행합니다:

  1. 웹 언락커 API 프록시를 통해 대상 웹 페이지에 연결합니다.
  2. 지정된 CSS 선택기를 사용하여 페이지의 HTML 콘텐츠를 가져오고 요소를 필터링합니다.
  3. 선택된 HTML 요소를 마크다운 형식으로 변환합니다.
  4. 포맷된 마크다운을 DeepSeek로 전송하여 데이터를 추출합니다.
  5. 제공된 프롬프트(지시문)에 따라 입력을 처리하고 추출된 데이터를 반환하도록 DeepSeek에 지시합니다.

crawler.arun() 실행 후 토큰 사용량을 확인하려면 다음을 실행하세요:

print(extraction_strategy.show_usage())

추출된 데이터는 다음 명령어로 접근 및 출력할 수 있습니다:

result_raw_data = result.extracted_content
print(result_raw_data)

스크립트를 실행하고 결과를 출력하면 다음과 같은 출력이 표시됩니다:

=== 토큰 사용 요약 ===
유형                   개수
------------------------------
완성                   525
프롬프트                2,002
총계                  2,527

=== 사용 내역 ===
요청 #    완료       프롬프트        총계
------------------------------------------------
1                   525        2,002        2,527
없음
[
    {
        "name": "Bright Data",
        "image_url": "https://images.g2crowd.com/uploads/product/image/large_detail/large_detail_9d7645872b9abb68923fb7e2c07c9d834/bright-data.png",
        "description": "Bright Data는 세계 최고의 웹 데이터, 프록시 및 데이터 스크래핑 솔루션 플랫폼입니다. 포춘 500대 기업, 학술 기관 및 중소기업 모두 Bright Data의 제품, 네트워크 및 솔루션을 활용하여 중요한 공개 웹 데이터를 가장 효율적이고 신뢰할 수 있으며 유연한 방식으로 수집합니다. 이를 통해 연구, 모니터링, 데이터 분석을 수행하고 더 나은 의사 결정을 내릴 수 있습니다. Bright Data는 전 세계 거의 모든 산업 분야의 20,000명 이상의 고객이 사용합니다. 비즈니스 소유자가 활용하는 코딩이 필요 없는 데이터 솔루션부터 개발자 및 IT 전문가가 사용하는 강력한 프록시 및 스크래핑 인프라에 이르기까지 다양한 제품을 제공합니다. Bright Data 제품은 비용 효율적인 방식으로 대규모로 빠르고 안정적인 공개 웹 데이터 수집을 수행하고, 비정형 데이터를 구조화된 데이터로 손쉽게 변환하며, 탁월한 고객 경험을 제공하는 동시에 완전히 투명하고 규정을 준수한다는 점에서 두각을 나타냅니다.",
        "review_score": "4.7/5",
        "number_of_reviews": "221",
        "claimed": true
    }
]

출력의 첫 부분(토큰 사용량)은 show_usage()에서 가져온 것으로, 6,000토큰 한도를 훨씬 밑돌고 있음을 확인시켜 줍니다. 이어지는 결과 데이터는 G2Product 스키마에 부합하는 JSON 문자열입니다.

정말 놀랍습니다!

12단계: 결과 데이터 처리

이전 단계의 출력에서 볼 수 있듯이, DeepSeek는 일반적으로 단일 객체가 아닌 배열을 반환합니다. 이를 처리하려면 반환된 데이터를 JSON으로 파싱하고 배열의 첫 번째 요소를 추출하세요:

# JSON에서 추출된 데이터 파싱
result_data = json.loads(result.extracted_content)

# 반환된 데이터가 배열인 경우 첫 번째 요소 접근
if result_data:
    result_data = result_data[0]

Python 표준 라이브러리에서 json을 임포트하는 것을 잊지 마세요:

import json

이 시점에서 result_data는 G2Product 인스턴스가 되어야 합니다. 마지막 단계는 이 데이터를 JSON 파일로 내보내는 것입니다.

13단계: 스크랩한 데이터를 JSON으로 내보내기

json을 사용하여 result_data를 g2.json 파일로 내보냅니다:

with open("g2.json", "w", encoding="utf-8") as f:
    json.dump(result_data, f, indent=4)

미션 완료!

단계 #14: 모든 것을 통합하기

최종 scraper.py 파일은 다음과 같아야 합니다:

import asyncio
from dotenv import load_dotenv
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
import os
from crawl4ai.extraction_strategy import LLMExtractionStrategy
from models.g2_product import G2Product
import json

# .env 파일에서 비밀 정보 불러오기
load_dotenv()

async def main():
    # Bright Data의 Web Unlocker API 프록시 구성
    proxy_config = {
        "server": os.getenv("PROXY_SERVER"),
        "username": os.getenv("PROXY_USERNAME"),
        "password": os.getenv("PROXY_PASSWORD")
    }

    # 브라우저 구성
    browser_config = BrowserConfig(
        headless=True,
        proxy_config=proxy_config,
    )

    # DeepSeek을 이용한 데이터 추출을 위한 LLM 추출 전략
    extraction_strategy = LLMExtractionStrategy(
        provider=os.getenv("LLM_MODEL"),
        api_token=os.getenv("LLM_API_TOKEN"),
        schema=G2Product.model_json_schema(),
        extraction_type="schema",
        instruction=(
            "아래 콘텐츠에서 'name', 'description', 'image_url', 'review_score', 'number_of_reviews'를 추출하세요. "
            "'review_score'는 "x/5" 형식이어야 합니다. 첫 몇 문장이 아닌 전체 설명을 가져오세요."
        ),
        input_format="markdown",
        verbose=True
    )

    # 크롤러 구성
    crawler_config = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        wait_until="domcontentloaded",
        page_timeout=180000, # 3분
        css_selector=".product-head__title, .product-head__logo, [itemprop="description"]",
        extraction_strategy=extraction_strategy
    )

    # AI 기반 크롤러 실행
    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://www.g2.com/products/bright-data/reviews",
            config=crawler_config
        )

        # AI 모델 사용 정보 기록
        print(extraction_strategy.show_usage())

        # 추출된 데이터를 JSON에서 파싱
        result_data = json.loads(result.extracted_content)

        # 반환된 데이터가 배열인 경우 첫 번째 요소 접근
        if result_data:
            result_data = result_data[0]

    # 스크랩한 데이터를 JSON으로 내보내기
    with open("g2.json", "w", encoding="utf-8") as f:
        json.dump(result_data, f, indent=4)

if __name__ == "__main__":
    asyncio.run(main())

그런 다음 models/g2_product.py에는 다음이 저장됩니다:

from pydantic import BaseModel

class G2Product(BaseModel):
    """
    G2 제품/회사 페이지의 데이터 구조를 나타냅니다.
    """

    name: str
    image_url: str
    description: str
    review_score: str
    number_of_reviews: str
    claimed: bool

그리고 .env 파일에는 다음과 같이 설정됩니다:

PROXY_SERVER=https://<WEB_UNLOCKER_API_HOST>:<WEB_UNLOCKER_API_PORT>
PROXY_USERNAME=<WEB_UNLOCKER_API_USERNAME>
PROXY_PASSWORD=<WEB_UNLOCKER_API_PASSWORD>
LLM_API_TOKEN=<GROQ_API_KEY>
LLM_MODEL=groq/deepseek-r1-distill-llama-70b

다음 명령어로 DeepSeek Crawl4AI 스크레이퍼를 실행하세요:

python scraper.py

터미널 출력은 다음과 유사합니다:

[INIT].... → Crawl4AI 0.4.248
[FETCH]... ↓ https://www.g2.com/products/bright-data/reviews... | Status: True | Time: 56.13s
[SCRAPE].. ◆ Processed https://www.g2.com/products/bright-data/reviews... | 소요 시간: 397ms
[LOG] https://www.g2.com/products/bright-data/reviews에 대해 LLM 호출 - 블록 인덱스: 0
[LOG] URL: https://www.g2.com/products/bright-data/reviews에서 1개 블록 추출 - 블록 인덱스: 0
[EXTRACT]. ■ https://www.g2.com/products/bright-data/reviews... 완료... | 소요 시간: 12.273853100006818초
[완료] ● https://www.g2.com/products/bright-data/reviews... | 상태: 참 | 총 소요 시간: 68.81초

=== 토큰 사용 요약 ===
유형                   개수
------------------------------
완료                   524
프롬프트                2,002
총계                  2,526

=== 사용 내역 ===
요청 #    완료 수       프롬프트        총계
------------------------------------------------
1                   524        2,002        2,526
없음

또한 프로젝트 폴더에 g2.json 파일이 생성됩니다. 파일을 열면 다음과 같은 내용을 확인할 수 있습니다:

{
    "name": "Bright Data",
    "image_url": "https://images.g2crowd.com/uploads/product/image/large_detail/large_detail_9d7645872b9abb68923fb7e2c7c9d834/bright-data.png",
    "description": "Bright Data는 세계 최고의 웹 데이터, 프록시 및 데이터 스크래핑 솔루션 플랫폼입니다. 포춘 500대 기업, 학술 기관 및 중소기업 모두 Bright Data의 제품, 네트워크 및 솔루션을 활용하여 중요한 공개 웹 데이터를 가장 효율적이고 신뢰할 수 있으며 유연한 방식으로 수집합니다. 이를 통해 연구, 모니터링, 데이터 분석을 수행하고 더 나은 의사 결정을 내릴 수 있습니다. Bright Data는 전 세계 거의 모든 산업 분야의 20,000명 이상의 고객이 사용합니다. 비즈니스 소유자가 활용하는 코딩이 필요 없는 데이터 솔루션부터 개발자 및 IT 전문가가 사용하는 강력한 프록시 및 스크래핑 인프라에 이르기까지 다양한 제품을 제공합니다. Bright Data 제품은 대규모로 빠르고 안정적인 공개 웹 데이터 수집을 수행하는 비용 효율적인 방법, 비정형 데이터를 구조화된 데이터로 손쉽게 변환하는 기능, 우수한 고객 경험을 제공하면서도 완전히 투명하고 규정을 준수한다는 점에서 두각을 나타냅니다.",
    "review_score": "4.7/5",
    "number_of_reviews": "221",
    "claimed": true
}

축하합니다! 봇으로 보호된 G2 페이지에서 시작하여 Crawl4AI, DeepSeek, Web Unlocker API를 활용해 단 한 줄의 파싱 로직도 작성하지 않고 구조화된 데이터를 추출했습니다.

결론

이 튜토리얼에서는 Crawl4AI가 무엇인지, 그리고 DeepSeek와 결합하여 AI 기반 스크레이퍼를 구축하는 방법을 살펴보았습니다. 스크레이핑 시 주요 과제 중 하나는 차단될 위험이지만, Bright Data의 Web Unlocker API를 통해 이를 극복했습니다.

이 튜토리얼에서 보여준 것처럼, Crawl4AI, DeepSeek, Web Unlocker API를 함께 사용하면 G2처럼 보호 수준이 높은 사이트를 포함해 어떤 사이트에서도 특정 파싱 로직 없이 데이터를 추출할 수 있습니다. 이는 Bright Data의 제품과 서비스가 지원하는 수많은 시나리오 중 하나에 불과하며, 효과적인 AI 기반 웹 스크래핑 구현을 돕습니다.

Crawl4AI와 연동되는 다른 웹 스크래핑 도구도 살펴보세요:

  • 프록시 서비스: 지역 제한 우회를 위한 4가지 유형의 프록시, 400M+ monthly 주거용 IP 포함
  • 웹 스크레이퍼 API: 100개 이상의 인기 도메인에서 최신 구조화된 웹 데이터를 추출하기 위한 전용 엔드포인트.
  • SERP API: SERP의 지속적인 잠금 해제 관리를 처리하고 한 페이지를 추출하는 API
  • 스크래핑 브라우저: 내장된 잠금 해제 기능을 갖춘 Puppeteer, Selenium, Playwright 호환 브라우저

지금 Bright Data에 가입하여 프록시 서비스와 스크래핑 제품을 무료로 테스트해 보세요!