2026년 퍼플렉시티를 활용한 웹 스크래핑: 단계별 가이드

Python에서 웹 스크래핑을 위해 Perplexity AI를 활용하는 방법, 데이터 추출 자동화, 스크래핑 과제 극복 방법을 알아보세요.
5 분 읽기
Web scraping with perplexity blog image

이 가이드에서 여러분은 다음을 발견하게 될 것입니다:

  • Perplexity가 AI 기반 웹 스크래핑에 적합한 이유
  • 단계별 튜토리얼로 Python을 활용한 웹사이트 스크래핑 방법
  • 이 웹 스크래핑 방식의 주요 한계점과 이를 우회하는 방법

시작해 보겠습니다!

웹 스크래핑에 퍼플렉시티를 사용해야 하는 이유

퍼플렉시티는 대규모 언어 모델을 활용하여 사용자 질의에 대한 상세한 답변을 생성하는 AI 기반 검색 엔진입니다. 실시간으로 정보를 검색하고 요약하며, 인용 출처를 함께 제공할 수 있습니다.

웹 스크래핑에 Perplexity를 활용하면 구조화되지 않은 HTML 콘텐츠에서 데이터를 추출하는 과정을 간단한 프롬프트로 간소화합니다. 이는 수동 데이터 파싱의 필요성을 없애 관련 정보 추출을 훨씬 쉽게 만듭니다.

게다가 Perplexity는 웹 페이지 발견 및 탐색 기능을 바탕으로 고급 웹 크롤링 시나리오에 최적화되어 있습니다.

자세한 내용은 웹 스크래핑을 위한 AI 활용 가이드를 참조하십시오.

사용 사례

Perplexity 기반 스크래핑 활용 사례는 다음과 같습니다:

  • 구조가 자주 변경되는 페이지: 아마존과 같은 전자상거래 사이트처럼 레이아웃과 데이터 요소가 자주 변경되는 동적 페이지에 적응할 수 있습니다.
  • 대규모 웹사이트 크롤링: 페이지 발견 및 탐색을 지원하거나 스크래핑 프로세스를 안내하는 AI 기반 검색을 수행할 수 있습니다.
  • 복잡한 페이지에서 데이터 추출: 구문 분석이 어려운 구조를 가진 사이트의 경우, Perplexity는 광범위한 맞춤형 구문 분석 로직 없이도 데이터 추출을 자동화할 수 있습니다.

시나리오

Perplexity를 활용한 스크래핑이 유용한 사례는 다음과 같습니다:

  • 검색 강화 생성(RAG): 실시간 데이터 스크래핑을 통합하여 AI 인사이트를 향상시킵니다. 유사한 AI 모델을 활용한 실용적인 예시는 SERP 데이터로 RAG 챗봇을 만드는 가이드를 참조하세요.
  • 콘텐츠 집계: 여러 출처의 뉴스, 블로그 게시물 또는 기사를 수집하여 요약본이나 분석 자료를 생성합니다.
  • 소셜 미디어 스크래핑: 동적 또는 자주 업데이트되는 콘텐츠가 있는 플랫폼에서 구조화된 데이터를 추출합니다.

Python에서 Perplexity를 활용한 웹 스크래핑 수행 방법

이 섹션에서는 “웹 스크래핑 학습용 전자상거래 테스트 사이트” 샌드박스의 특정 상품 페이지를 사용합니다:

The target page

이 페이지는 훌륭한 예시 대상입니다. 전자상거래 제품 페이지는 종종 서로 다른 구조를 가지며 다양한 유형의 데이터를 표시하기 때문입니다. 바로 이 점이 전자상거래 웹 스크래핑을 매우 어렵게 만드는 요소이며, AI가 도움을 줄 수 있는 부분입니다.

특히 Perplexity 기반 스크레이퍼는 수동 파싱 로직 없이도 AI를 활용해 페이지에서 다음과 같은 제품 세부 정보를 추출합니다:

  • SKU
  • Name
  • 이미지
  • 가격
  • 설명
  • 사이즈
  • 색상
  • 카테고리

참고: 다음 예시는 단순성과 관련 SDK의 대중성을 고려하여 Python으로 작성됩니다. 그러나 JavaScript나 다른 프로그래밍 언어를 사용해도 동일한 결과를 얻을 수 있습니다.

Perplexity로 웹 데이터를 스크래핑하는 방법을 배우려면 아래 단계를 따르세요!

1단계: 프로젝트 설정

시작하기 전에 컴퓨터에 Python 3이 설치되어 있는지 확인하세요. 설치되어 있지 않다면 다운로드하여 설치 지침을 따르세요.

그런 다음 스크래핑 프로젝트용 폴더를 초기화하기 위해 아래 명령어를 실행하세요:

mkdir perplexity-scraper

perplexity-scraper 디렉터리는 Perplexity를 사용한 웹 스크래핑 프로젝트의 프로젝트 폴더 역할을 합니다.

터미널에서 해당 폴더로 이동한 후 내부에서 Python 가상 환경을 생성하세요:

cd perplexity-scraper
python -m venv venv

선호하는 Python IDE에서 프로젝트 폴더를 엽니다. Python 확장 프로그램이 설치된 Visual Studio Code 또는 PyCharm Community Edition이 모두 훌륭한 선택입니다.

프로젝트 폴더 내에 scraper.py 파일을 생성합니다. 현재 폴더 구조는 다음과 같아야 합니다:

The project file structure for web scraping with Perplexity

현재 scraper.py는 빈 Python 스크립트이지만, 곧 LLM 웹 스크래핑 로직이 포함될 것입니다.

다음으로 IDE 터미널에서 가상 환경을 활성화하세요. Linux 또는 macOS에서는 다음 명령을 실행합니다:

source venv/bin/activate

Windows에서는 다음과 같이 실행하세요:

venv/Scripts/activate

잘하셨습니다! 이제 Perplexity를 활용한 웹 스크래핑을 위한 Python 환경이 설정되었습니다.

2단계: Perplexity API 키 획득

대부분의 AI 제공업체와 마찬가지로 Perplexity도 API를 통해 모델을 제공합니다. 프로그래밍 방식으로 접근하려면 먼저 Perplexity API 키를 발급받아야 합니다. 공식 “초기 설정”가이드를 참조하거나 아래 안내 단계를 따르세요.

아직 Perplexity 계정이 없다면 계정을 생성하고 로그인하세요. 그런 다음 “API” 페이지로 이동하여 아직 결제 수단을 추가하지 않았다면 “설정”을 클릭하세요:

Setting up a payment method in Perplexity

참고: 이 단계에서 요금이 청구되지는 않습니다. Perplexity는 향후 API 사용을 위해 결제 정보만 저장합니다. 신용/체크카드, Google Pay 또는 기타 지원 결제 수단을 사용할 수 있습니다.

결제 수단 설정이 완료되면 다음 섹션이 표시됩니다:

The Perplexity API section after adding a payment method

“+ 크레딧 구매”를 클릭하여 크레딧을 구매하고 계정에 추가될 때까지 기다리세요. 크레딧이 사용 가능해지면 API 키 섹션 아래의 “+ 생성” 버튼이 활성화됩니다. 이 버튼을 눌러 Perplexity API 키를 생성하세요:

Pressing the “+ Generate” button to create the API key

API 키가 표시됩니다:

Your Perplexity API key

키를 복사하여 안전한 곳에 보관하세요. 간편하게 scraper.py 파일에서 상수로 정의하겠습니다:

PERPLEXITY_API_KEY="<YOUR_PERPLEXITY_API_KEY>"

중요: 실제 운영 환경의 Perplexity 스크래핑 스크립트에서는 API 키를 평문으로 저장하지 마십시오. 대신 python-dotenv 같은 라이브러리로 관리되는 환경 변수나 .env 파일에 비밀 정보를 저장하세요.

훌륭합니다! 이제 Python에서 OpenAI SDK를 사용하여 Perplexity 모델에 API 요청을 할 준비가 되었습니다.

3단계: Python에서 Perplexity 구성하기

이전 단계의 마지막 문장은 오타가 아닙니다—OpenAI SDK를 언급했음에도 불구하고. 이는 Perplexity API가 OpenAI와 완벽히 호환되기 때문입니다. 실제로 Python으로 Perplexity API에 연결하는 권장 방법은 OpenAI SDK를 통하는 것입니다.

첫 단계로 OpenAI Python SDK를 설치하세요. 활성화된 가상 환경에서 다음 명령어를 실행합니다:

pip install openai

다음으로, 스크레이퍼 스크립트 (scraper.py) 에 이를 임포트하세요:

from openai import OpenAI

OpenAI 대신 Perplexity에 연결하려면 클라이언트를 다음과 같이 구성하세요:

client = OpenAI(api_key=PERPLEXITY_API_KEY, base_url="https://api.perplexity.ai")

좋습니다! 이제 Perplexity Python 설정이 완료되었으며, 해당 모델에 대한 API 요청을 수행할 준비가 되었습니다.

4단계: 대상 페이지의 HTML 가져오기

이제 대상 페이지의 HTML을 가져와야 합니다. Requests와 같은 강력한 Python HTTP 클라이언트를 사용하면 됩니다.

가동된 가상 환경에서 Requests를 설치하려면 다음 명령어를 실행하세요:

pip install requests

다음으로 scraper.py 파일에서 라이브러리를 임포트하세요:

import requests

get() 메서드를 사용하여 페이지 URL로 GET 요청을 보냅니다:

url = "https://www.scrapingcourse.com/ecommerce/product/ajax-full-zip-sweatshirt/"
response = requests.get(url)

대상 서버는 페이지의 원시 HTML로 응답합니다.

response.content를 출력하면 전체 HTML 문서를 확인할 수 있습니다:

<!DOCTYPE html>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="profile" href="https://gmpg.org/xfn/11">
    <link rel="pingback" href="https://www.scrapingcourse.com/ecommerce/xmlrpc.php">

    <!-- 생략... -->

    <title>Ajax 풀집 스웨트셔츠 &#8211; 웹 스크래핑 학습용 이커머스 테스트 사이트</title>
    <!-- 생략... -->
</head>
<body>
    <!-- 생략... -->
</body>
</html>

이제 Python에서 대상 페이지의 정확한 HTML을 확보했습니다. 이제 이를 파싱하여 필요한 데이터를 추출해 보겠습니다!

단계 #5: 페이지 HTML을 마크다운으로 변환하기 (선택 사항)

경고: 이 단계는 기술적으로 필수 사항은 아니지만, 상당한 시간과 비용을 절약할 수 있습니다. 따라서 반드시 고려해 볼 가치가 있습니다.

Crawl4AI나 ScrapeGraphAI 같은 다른 AI 기반 웹 스크래핑 기술들이 원시 HTML을 어떻게 처리하는지 살펴보세요. 두 기술 모두 콘텐츠를 설정된 LLM에 전달하기 전에 HTML을 마크다운으로 변환하는 옵션을 제공한다는 점을 알 수 있을 것입니다.

왜 그럴까요? 두 가지 주요 이유가 있습니다:

  • 비용 효율성: 마크다운으로 변환하면 AI로 전송되는 토큰 수가 줄어들어 비용을 절감할 수 있습니다.
  • 더 빠른 처리: 입력 데이터가 적을수록 계산 비용이 낮아지고 응답 속도가 빨라집니다.

자세한 내용은 새로운 AI 에이전트가 HTML보다 마크다운을 선택하는 이유에 대한 가이드를 참고하세요.

토큰 사용량을 줄이기 위해 HTML-Markdown 변환 로직을 복제해 볼 시간입니다!

먼저 대상 웹페이지를 시크릿 모드로 열어주세요(새 세션에서 작업 중임을 확인하기 위함). 그런 다음 페이지 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 “검사”를 선택해 개발자 도구를 엽니다.

페이지 구조를 살펴보세요. 모든 관련 데이터가 CSS 선택자 #main으로 식별되는 HTML 요소 내에 포함되어 있음을 확인할 수 있습니다:

The #main HTML element with the product data

기술적으로 원시 HTML 전체를 Perplexity에 전송해 데이터를 파싱할 수도 있습니다. 하지만 그러면 헤더나 푸터 같은 불필요한 정보가 대량 포함될 것입니다. 대신 #main 내부의 콘텐츠를 입력 원시 데이터로 사용하면 가장 관련성 높은 데이터만 처리하게 됩니다. 이는 노이즈를 줄이고 AI의 환각 현상을 제한할 것입니다.

#main 요소만 추출하려면 Beautiful Soup 같은 Python HTML 파싱 라이브러리가 필요합니다. 활성화된 Python 가상 환경에서 다음 명령어로 설치하세요:

pip install beautifulsoup4

API 사용법에 익숙하지 않다면 Beautiful Soup 웹 스크래핑 가이드를 참고하세요.

이제 scraper.py에서 라이브러리를 임포트하세요:

from bs4 import BeautifulSoup

Beautiful Soup을 사용하여 다음을 수행하세요:

  1. Requests로 가져온 원시 HTML 파싱
  2. #main 요소를 선택합니다
  3. 해당 HTML 콘텐츠를 가져옵니다

다음 코드 조각으로 이를 달성하세요:

# BeautifulSoup으로 페이지 HTML 파싱
soup = BeautifulSoup(response.content, "html.parser")

# #main 요소 선택
main_element = soup.select_one("#main")

# 외부 HTML 가져오기
main_html = str(main_element)

main_html을 출력하면 다음과 같은 내용이 표시됩니다:

<main id="main" class="site-main" role="main" data-testid="main-content" data-content="main-area">
    <div class="woocommerce-notices-wrapper" 
         id="notices-wrapper" 
         data-testid="notices-wrapper" 
         data-sorting="notices">
    </div>
    <div id="product-309" 
         class="product type-product post-309 status-publish first outofstock 
                product_cat-hoodies-sweatshirts has-post-thumbnail 
                shipping-taxable purchasable product-type-variable">
        <!-- 생략... -->
    </div>
</main>

OpenAI의 토큰화 도구를 사용하여 선택한 HTML이 몇 개의 토큰에 해당하는지 확인하세요:

The #main HTML corresponds 20,658 tokens

다음으로 LLM API 가격 계산기를 사용하여 이 토큰들을 Perplexity API로 전송하는 비용을 추정해 보세요:

The Perplexity API price predictions from using from using the raw #main HTML

보시다시피 이 접근 방식은 20,000개 이상의 토큰을 발생시킵니다. 즉, 요청당 0.21달러에서 약 0.63달러의 비용이 듭니다. 수천 페이지 규모의 대규모 프로젝트에서는 상당한 금액입니다!

토큰 소비를 줄이려면 markdownify 같은 라이브러리를 사용해 추출한 HTML을 마크다운으로 변환하세요. Perplexity 기반 스크래핑 프로젝트에 설치하려면 다음 명령어를 실행하세요:

pip install markdownify

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

from markdownify import markdownify

그런 다음 #main 섹션의 HTML을 마크다운으로 변환합니다:

main_markdown = markdownify(main_html)

데이터 변환 과정은 아래와 같은 출력을 생성합니다:

From HTML to Markdown

두 텍스트 영역 끝에 있는 “size” 요소를 보면, 입력 데이터의 마크다운 버전이 원본 #main HTML보다 훨씬 작다는 것을 알 수 있습니다. 또한 자세히 살펴보면 스크래핑해야 할 모든 핵심 데이터가 여전히 포함되어 있음을 확인할 수 있습니다!

OpenAI의 토큰화기를 다시 사용해 새로운 마크다운 입력의 토큰 수를 확인해 보세요:

The #main Markdown content corresponds 950 tokens

이 간단한 방법으로 20,658개의 토큰을 950개로 줄였습니다—95% 이상의 감소입니다. 이는 Perplexity API 요청당 비용도 크게 절감합니다:

The final cost

요청당 비용이 약 $0.21-$0.63에서 단 $0.014-$0.04로 떨어집니다!

6단계: 데이터 파싱에 Perplexity 활용하기

Perplexity를 사용하여 데이터를 스크래핑하려면 다음 단계를 따르세요:

  1. Markdown 입력에서 원하는 형식의 JSON 데이터를 추출하기 위해 잘 구조화된 프롬프트 작성
  2. OpenAI Python SDK를 사용하여 Perplexity의 LLM 모델에 요청을 전송하세요
  3. 반환된 JSON을 파싱합니다

다음 코드로 첫 두 단계를 구현하세요:

# Perplexity 스크래핑 API 요청 본문을 준비합니다
prompt = f"""
아래 콘텐츠에서 데이터를 추출하고 지정된 속성을 가진 JSON 문자열을 반환하세요:
sku, name, images, price, description, sizes, colors, category

콘텐츠:n
{main_markdown}
"""
messages = [
    {
        "role": "system",
        "content": (
            """
            당신은 스크래핑 에이전트로, 스크래핑된 데이터를 원시 JSON 형식으로만 반환합니다.
            지시된 대로 스크랩된 데이터만 포함된 JSON 문자열을 반환합니다.
            어떤 작업도 설명하지 말고 원시 형식의 JSON 문자열만 반환하십시오.
            """
        ),
    },
    {
        "role": "user",
        "content": (
            prompt
        ),
    },
]

# Perplexity에 요청 수행
completion = client.chat.completions.create(
    model="sonar",
    messages=messages,)


# 반환된 원시 JSON 데이터 가져오기
product_raw_string = completion.choices[0].message.content

프롬프트 변수는 Perplexity가 main_markdown 콘텐츠에서 구조화된 데이터를 추출하도록 지시합니다. 결과를 개선하려면 시스템이 어떻게 행동하고 무엇을 해야 하는지 알 수 있도록 명확한 프롬프트를 정의하는 것이 좋습니다.

참고: Perplexity는 여전히 API 호출을 위해 구형 OpenAI 구문을 사용합니다. 새로운 responses.create() 구문을 사용하려고 하면 다음과 같은 오류가 발생합니다:

httpx.HTTPStatusError: Client error '404 Not Found' for url 'https://api.perplexity.ai/responses'

이제 product_raw_string에는 다음 형식의 JSON 데이터가 포함되어야 합니다:

```json
{
  "sku": "MH12",
  "name": "Ajax Full-Zip Sweatshirt",
  "images": [
    "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh12-green_main.jpg",
    "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh12-green_alt1.jpg",
    "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh12-green_back.jpg"
  ],
  "price": "$69.00",
  "description": "Ajax 풀 지퍼 스웨트셔츠는 궁수, 골퍼, 하이커 및 거의 모든 스포츠맨에게 최적의 레이어링 또는 아우터 아이템입니다. 뛰어난 흡습 발한 기능은 물론, 촘촘한 직조 소재로 반복적인 세탁과 착용에도 보풀이 일지 않습니다. 민트 스트라이프 풀 지퍼 후디. • 100% 본딩 폴리에스터 플리스. • 포켓 포켓. • 리브 커프스 및 밑단. • 기계 세탁 가능.",
  "사이즈": ["XS", "S", "M", "L", "XL"],
  "색상": ["파란색", "초록색", "빨간색"],
  "카테고리": "후디 & 스웨트셔츠"
}
```

보시다시피, Perplexity는 데이터를 마크다운 형식으로 반환합니다.

본 섹션 시작 부분의 알고리즘 3단계를 구현하려면 정규 표현식을 사용해 원시 JSON 콘텐츠를 추출해야 합니다. 이후 파싱된 JSON 데이터를 Python 사전 json.loads()로 처리할 수 있습니다:

# 문자열에 "```json"이 포함되어 있는지 확인하고 존재할 경우 원시 JSON 추출
match = re.search(r'```jsonn(.*?)n```', product_raw_string, re.DOTALL)
if match:
# 일치하는 그룹에서 JSON 문자열 추출
json_string = match.group(1)
else:
# 반환된 데이터가 이미 JSON 형식이라고 가정
json_string = product_raw_string
추출된 JSON 문자열을 파이썬 사전으로 파싱 시도
product_data = json.loads(json_string)

Python 표준 라이브러리에서 json과 re를 반드시 임포트하세요:

import json
import re

참고: Perplexity Tier-3 사용자인 경우, API를 구성하여 구조화된 JSON 형식으로 직접 데이터를 반환하도록 설정하면 정규 표현식 파싱 단계를 건너뛸 수 있습니다. 자세한 내용은 Perplexity “구조화된 출력” 가이드에서 확인하세요.

product_data 사전 파싱이 완료되면 추가 데이터 처리를 위해 필드에 접근할 수 있습니다. 예시:

price = product_data["price"]
price_eur = price * USD_EUR
# ...

훌륭합니다! 웹 스크래핑에 Perplexity를 성공적으로 활용하셨습니다. 이제 필요한 대로 스크래핑된 데이터를 내보내기만 하면 됩니다.

7단계: 스크래핑된 데이터 내보내기

현재 스크래핑된 데이터는 Python 사전(dictionary)에 저장되어 있습니다. JSON 파일로 저장하려면 다음 코드를 사용하세요:

with open("product.json", "w", encoding="utf-8") as json_file:
    json.dump(product_data, json_file, indent=4)

이렇게 하면 스크랩된 데이터를 JSON 형식으로 포함하는 product.json 파일이 생성됩니다.

잘하셨습니다! 이제 Perplexity 기반 웹 스크래퍼가 준비되었습니다.

8단계: 모든 것을 통합하기

데이터 파싱을 위해 Perplexity를 사용한 스크래핑 스크립트의 전체 코드는 다음과 같습니다:


from openai import OpenAI
import requests
from bs4 import BeautifulSoup
from markdownify import markdownify
import re
import json

# Perplexity API 키
PERPLEXITY_API_KEY = "<YOUR_PERPLEXITY_API_KEY>" # 본인의 API 키로 대체

# Perplexity 연결을 위한 OpenAI SDK 구성
client = OpenAI(api_key=PERPLEXITY_API_KEY, base_url="https://api.perplexity.ai")

# 대상 페이지의 HTML 콘텐츠 가져오기
url = "https://www.scrapingcourse.com/ecommerce/product/ajax-full-zip-sweatshirt/"
response = requests.get(url)

# BeautifulSoup으로 페이지 HTML 파싱
soup = BeautifulSoup(response.content, "html.parser")

# #main 요소 선택
main_element = soup.select_one("#main")

# 해당 요소의 외부 HTML 가져오기
main_html = str(main_element)

# #main HTML을 마크다운으로 변환
main_markdown = markdownify(main_html)

# Perplexity 스크래핑 API 요청 본문을 준비
prompt = f"""
아래 콘텐츠에서 데이터를 추출하고 지정된 속성을 포함한 JSON 문자열을 반환하세요:
sku, name, images, price, description, sizes, colors, category

콘텐츠:
{main_markdown}
"""
messages = [
    {
        "role": "system",
        "content": (
            """
            당신은 스크래핑 에이전트로, 스크래핑된 데이터를 다른 콘텐츠 없이 원시 JSON 형식으로 반환합니다.
            지시된 대로 스크래핑된 데이터가 포함된 JSON 문자열만 반환합니다.
            어떤 설명도 하지 말고 원시 형식의 JSON 문자열만 반환하십시오.
            """
        ),
    },
    {
        "role": "user",
        "content": (
            prompt
        ),
    },
]

# Perplexity에 요청 수행
completion = client.chat.completions.create(
    model="sonar",
    messages=messages,
)

# 반환된 원시 JSON 데이터 가져오기
product_raw_string = completion.choices[0].message.content

# 문자열에 "```json" 포함 여부 확인 및 존재 시 원시 JSON 추출
match = re.search(r'```jsonn(.*?)n```', product_raw_string, re.DOTALL)

if match:
    # 일치하는 그룹에서 JSON 문자열 추출
    json_string = match.group(1)
else:
    # 반환된 데이터가 이미 JSON 형식이라고 가정
    json_string = product_raw_string

# 추출된 JSON 문자열을 Python 사전으로 파싱 시도
product_data = json.loads(json_string)

# 추가 데이터 처리... (선택 사항)

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

스크래핑 스크립트 실행:

python scraper.py

실행이 완료되면 프로젝트 폴더에 product.json 파일이 생성됩니다. 파일을 열면 다음과 같은 구조화된 데이터를 확인할 수 있습니다:

{
    "sku": "MH12",
    "name": "Ajax 풀 지퍼 스웨트셔츠",
    "images": [
        "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh12-green_main.jpg",
        "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh12-green_alt1.jpg",
        "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh12-green_back.jpg"
    ],
    "price": "69.00",
    "description": "Ajax 풀 지퍼 스웨트셔츠는 궁수, 골퍼, 하이커 및 거의 모든 스포츠맨에게 최적의 레이어링 또는 아우터 아이템입니다. 최상급의 습기 흡수 능력뿐만 아니라, 촘촘한 직물 구조로 반복적인 세탁과 착용에도 보풀이 생기지 않습니다.n• 민트 스트라이프 풀 지퍼 후디.n• 100% 본딩 폴리에스터 플리스.n• 포켓 포켓.n• 리브 커프스 및 밑단.n• 세탁기 사용 가능.",
    "sizes": [
        "XS",
        "S",
        "M",
        "L",
        "XL"
    ],
    "colors": [
        "Blue",
        "Green",
        "Red"
    ],
    "category": "후디 & 스웨트셔츠"
}

자, 이제 완성되었습니다! Perplexity 기반 웹 스크래핑 덕분에 HTML 페이지의 구조화되지 않은 데이터를 깔끔하게 정리된 JSON 파일로 변환하는 스크립트를 만들었습니다.

다음 단계

Perplexity 기반 스크래퍼를 한 단계 업그레이드하려면 다음 개선 사항을 고려해 보세요:

  • 재사용 가능하게 만들기: 스크립트를 수정하여 프롬프트와 대상 URL을 명령줄 인수로 받아들이도록 합니다. 이렇게 하면 스크레이퍼가 더 유연해지고 다양한 사용 사례와 프로젝트에 적용하기 쉬워집니다.
  • API 자격 증명 보안: Perplexity API 키를 .env 파일에 저장하고 python-dotenv를 사용하여 안전하게 로드하세요. 이 접근 방식은 스크립트에 민감한 자격 증명을 하드코딩하는 것을 피하고, 비밀 정보를 코드베이스와 분리하여 비공개로 유지함으로써 보안을 강화합니다.
  • 웹 크롤링 구현: Perplexity의 AI 기반 검색 및 크롤링 기능을 활용하여 지능적이고 최적화된 크롤링을 수행하세요. 스크레이퍼를 구성하여 링크된 페이지를 탐색하고 다양한 출처에서 구조화된 데이터를 추출하도록 합니다.

이 웹 스크래핑 방식의 가장 큰 한계 극복하기

이 AI 기반 웹 스크래핑 접근법의 가장 큰 한계는 무엇일까요? 바로 requests 라이브러리가 생성하는 HTTP 요청입니다!

위 예제가 완벽하게 작동한 것은 대상 사이트가 사실상 웹 스크래핑 연습장 수준이었기 때문입니다. 현실에서는 기업과 웹사이트 소유자가 데이터의 가치를 인지하고 있으며, 공개적으로 접근 가능하더라도 이를 보호하기 위해 자동화된 HTTP 요청을 쉽게 차단할 수 있는 반스크래핑 방어책을 구현합니다.

이러한 경우 스크립트는 다음과 같은 403 Forbidden 오류로 실패합니다:

requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: <YOUR_TARGET_URL>

또한 이 접근법은 자바스크립트에 의존하여 렌더링하거나 비동기적으로 데이터를 가져오는 동적 웹 페이지에서는 작동하지 않습니다. 따라서 웹사이트는 LLM 기반 스크레이퍼를 차단하기 위해 고급 봇 방어 체계조차 필요로 하지 않습니다.

그렇다면 이 모든 문제에 대한 해결책은 무엇일까요? 바로 웹 언락킹 API입니다!

Bright Data의 웹 언락커 API는 모든 HTTP 클라이언트에서 호출 가능한 스크래핑 엔드포인트입니다. 이 API는 전달된 URL의 완전히 언락된 HTML을 반환하여 스크래핑 차단 기능을 우회해 줍니다. 대상 사이트가 아무리 많은 보호 장치를 갖추고 있더라도, 웹 언락커에 간단한 요청만 하면 해당 페이지의 HTML을 가져올 수 있습니다.

시작하려면 공식 웹 언락커 문서를 따라 API 키를 획득하세요. 그런 다음 기존 요청 코드의 “4단계”를 다음 코드로 대체하세요:

WEB_UNLOCKER_API_KEY = "<YOUR_WEB_UNLOCKER_API_KEY>"

# Web Unlocker 인증 헤더 설정
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {WEB_UNLOCKER_API_KEY}"
}

# 요청 페이로드 정의
payload = {
    "zone": "unblocker",
    "url": "https://www.scrapingcourse.com/ecommerce/product/ajax-full-zip-sweatshirt/",  # 대상 URL로 교체
    "format": "raw"
}

# 대상 페이지의 차단 해제된 HTML 가져오기
response = requests.post("https://api.brightdata.com/request", json=payload, headers=headers)

이렇게 간단합니다—더 이상 차단도, 제한도 없습니다! 이제 차단될 걱정 없이 Perplexity를 사용해 웹 스크래핑을 할 수 있습니다.

결론

이 튜토리얼에서는 Requests 및 기타 도구와 함께 Perplexity를 활용해 AI 기반 스크레이퍼를 만드는 방법을 배웠습니다. 웹 스크래핑의 가장 큰 과제 중 하나는 차단 위험이지만, Bright Data의 Web Unlocker API를 통해 이를 해결했습니다.

앞서 설명한 바와 같이, Perplexity를 Web Unlocker API와 통합하면 맞춤형 파싱 로직 없이도 모든 사이트에서 데이터를 추출할 수 있습니다. 이는 Bright Data의 제품과 서비스가 지원하는 수많은 사용 사례 중 하나로, 효율적인 AI 기반 웹 스크래핑 구현을 가능하게 합니다.

다른 웹 스크래핑 도구도 살펴보세요:

  • 프록시 서비스: 지역 제한을 우회하는 4가지 유형의 프록시, 400M+ monthly개의 주거용 IP 접근 포함.
  • 웹 스크레이퍼 API: 100개 이상의 인기 도메인에서 최신 구조화된 웹 데이터를 추출하기 위한 전용 엔드포인트.
  • SERP API: 검색 결과 페이지(SERP)의 지속적인 잠금 해제 관리 및 개별 페이지 추출을 위한 API.
  • 스크래핑 브라우저: Puppeteer, Selenium, Playwright와 호환되는 클라우드 브라우저로, 내장된 잠금 해제 기능을 제공합니다.

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