Anthropic의 대규모 언어 모델(LLM)인Claude는 전 세계에서 가장 많이 사용되는 AI 모델 중 하나입니다. 웹사이트 스크래핑 방법을 익히면 대부분의 시간을 파서 작성에 할애하게 될 것입니다.
현대 AI 모델을 활용하면이 과정을 자동화할 수 있습니다. 복잡한 사이트를 파싱하는 데 몇 시간을 소비하는 대신, LLM이 5분 이내에 대신 처리해 줍니다.
AI를 활용해 코드를 빠르게 생성하는 다른 튜토리얼도 있지만, 여기서는 실제로 Claude를 Python 환경에 통합해 보겠습니다. 따라 해 보시고 업무에서 가장 지루한 부분을 자동화하세요.
Anthropic 계정 생성하기
Claude의 API 접근 권한을 얻으려면 Anthropic에서 계정을 생성해야 합니다. 이메일 또는 Google 계정으로 가입할 수 있습니다.

계정 생성 후 “API Keys” 탭을 클릭하면 API 키를 생성할 수 있습니다. 생성 후에는 이 키를 목숨 걸고 지켜야 합니다. 두 번째로 확인할 수 없기 때문입니다.

이 키는 안전한 곳에 보관하세요. 이 키 없이는 API를 사용할 수 없습니다.
기본 요청 수행하기
첫 번째 요청은Quotes to Scrape 사이트에 보냅니다. 이 사이트는 크게 변경되지 않으며 교육용 스크래핑을 위해 제작되었습니다. 이는 Claude의 응답을 테스트하기 위한 정적 페이지를 제공합니다.
먼저 anthropic을 설치해야 합니다.
pip install anthropic
클라이언트 인스턴스 설정은 매우 간단합니다.
#클라이언트 설정
client = anthropic.Anthropic(
api_key=ANTHROPIC_API_KEY,
)
다음은 모든 정보를 Claude에 전달하는 함수입니다.
# HTTP 응답을 받아 텍스트를 Claude로 전송하여 처리
def extract_with_claude(response, token_limit=200000, max_tokens_per_chunk=1024):
message = client.messages.create(
model="claude-3-5-haiku-20241022",
max_tokens=2048,
messages=[
{
"role": "user",
"content": f"""
안녕하세요, HTML 페이지의 이 부분을 파싱하여 JSON으로 변환해 주세요.
줄바꿈, 이스케이프 문자, 공백을 제거해야 합니다:
{response.text}
"""
}
]
)
text = message.to_dict()["content"][0]["text"]
return text
model: 사용하고자 하는 모델입니다.claude-3-5-haiku-20241022를사용 중입니다.max_tokens는Claude가 응답에 사용할 최대 토큰 수를 나타냅니다.- 기본적으로 API는
Message객체를 반환합니다.to_dict()를사용하여 작업하기 쉬운 키-값 쌍으로 변환합니다.
import re
import requests
import anthropic
import json
ANTHROPIC_API_KEY = "YOUR-ANTHROPIC-API-KEY"
#클라이언트 설정
client = anthropic.Anthropic(
api_key=ANTHROPIC_API_KEY,
)
# HTTP 응답을 받아 텍스트를 Claude로 전송하여 처리
def extract_with_claude(response, token_limit=200000, max_tokens_per_chunk=1024):
message = client.messages.create(
model="claude-3-5-haiku-20241022",
max_tokens=2048,
messages=[
{
"role": "user",
"content": f"""
안녕하세요, HTML 페이지의 이 부분을 파싱하여 JSON으로 변환해 주세요.
줄바꿈, 이스케이프 문자, 공백을 제거해야 합니다:
{response.text}
"""
}
]
)
text = message.to_dict()["content"][0]["text"]
return text
if __name__ == "__main__":
TARGET_URL = "https://quotes.toscrape.com"
response = requests.get(TARGET_URL)
print(extract_with_claude(response))
Claude 응답 이해하기
앞서 언급했듯이, 기본적으로 Claude는 Message 객체를 반환합니다. to_dict() 메서드는 응답을 Python 환경에 통합하기 좀 더 쉽게 만들어 줍니다. 하지만 아직 바로 사용할 수 있는 상태는 아닙니다. 아래 응답을 살펴보세요.
이 HTML을 JSON 형식으로 파싱하는 방법을 알려드리겠습니다. 인용문, 저자, 태그를 추출하는 데 집중하겠습니다. 결과 JSON은 다음과 같습니다:
```json
{
"quotes": [
{
"text": "우리가 창조한 세상은 우리의 사고 과정이다. 사고를 바꾸지 않고서는 세상을 바꿀 수 없다.",
"author": "Albert Einstein",
"tags": ["change", "deep-thoughts", "thinking", "world"]
},
{
"text": "우리의 선택이야말로, 해리, 우리의 능력을 훨씬 뛰어넘어 우리가 진정 어떤 존재인지를 보여주는 것이지.",
"author": "J.K. 롤링",
"tags": ["능력", "선택"]
},
{
"text": "인생을 사는 방법은 단 두 가지뿐이다. 하나는 아무것도 기적처럼 여기지 않는 삶이고, 다른 하나는 모든 것을 기적처럼 여기는 삶이다.",
"author": "Albert Einstein",
"tags": ["영감", "삶", "살다", "기적", "기적들"]
},
{
"text": "좋은 소설에서 즐거움을 느끼지 못하는 사람은, 신사든 숙녀든, 참을 수 없을 만큼 어리석은 사람일 것이다.",
"author": "제인 오스틴",
"tags": ["문맹", "책", "고전", "유머"]
},
{
"text": "불완전함은 아름다움이고, 광기는 천재성이다. 그리고 완전히 우스꽝스러운 편이 완전히 지루한 편보다 낫다.",
"author": "Marilyn Monroe",
"tags": ["be-yourself", "inspirational"]
},
{
"text": "성공한 사람이 되려 하지 마라. 차라리 가치 있는 사람이 되라.",
"author": "Albert Einstein",
"tags": ["adulthood", "success", "value"]
},
{
"text": "있는 그대로의 모습으로 미움받는 것이, 없는 모습으로 사랑받는 것보다 낫다.",
"author": "앙드레 지드",
"tags": ["삶", "사랑"]
},
{
"text": "나는 실패한 것이 아니다. 단지 1만 가지 안 되는 방법을 발견했을 뿐이다.",
"author": "Thomas A. Edison",
"tags": ["edison", "failure", "inspirational", "paraphrased"]
},
{
"text": "여자는 티백과 같습니다; 뜨거운 물에 담그기 전까지는 그 강도를 알 수 없지요.",
"author": "엘리너 루즈벨트",
"tags": ["엘리너 루즈벨트에게 잘못 귀속된"]
},
{
"text": "햇빛 없는 날은, 알다시피, 밤과 같아.",
"author": "Steve Martin",
"tags": ["humor", "obvious", "simile"]
}
],
"top_tags": [
{"tag": "사랑", "size": 28},
{"tag": "영감", "size": 26},
{"tag": "삶", "size": 26},
{"tag": "유머", "size": 24},
{"tag": "책", "size": 22},
{"tag": "독서", "size": 14},
{"tag": "friendship", "size": 10},
{"tag": "friends", "size": 8},
{"tag": "truth", "size": 8},
{"tag": "simile", "size": 6}
]
}
```
추출한 내용은 다음과 같습니다:
1. 인용문, 본문, 저자 및 관련 태그
2. 상위 태그와 상대적 크기
JSON은 개행이나 이스케이프 문자가 없으며 명확한 구조를 따릅니다. JSON을 수정할 필요가 있나요?
원하는 JSON을 받았지만, 더 큰 문자열 안에 포함되어 있습니다. 텍스트에서 클로드가 추출한 데이터를 추출해야 합니다.
응답에서 데이터 추출하기
JSON은 마크다운 코드 블록처럼 백틱(“`) 안에 포함되어 있습니다. 응답을 추출하려면정규식을사용해 JSON의 시작과 끝을 찾습니다.
def pull_json_data(claude_text):
json_match = re.search(r"```jsonn(.*?)n", claude_text, re.DOTALL)
if json_match:
# JSON 추출 및 Python 사전으로 로드
parsed_json = json.loads(json_match.group(1))
return parsed_json # JSON 예쁘게 출력
else:
print("응답에서 JSON을 찾을 수 없습니다.")
다음은 페이지에서 추출한 데이터만 출력하는 전체 코드 예시입니다.
import re
import requests
import anthropic
import json
ANTHROPIC_API_KEY = "YOUR-ANTHROPIC-API-KEY"
# Claude 클라이언트 설정
client = anthropic.Anthropic(
api_key=ANTHROPIC_API_KEY,
)
def pull_json_data(claude_text):
json_match = re.search(r"json(.*?)n", claude_text, re.DOTALL)
if json_match:
# JSON 추출 및 Python 사전으로 로드
parsed_json = json.loads(json_match.group(1))
return parsed_json # JSON을 예쁘게 출력
else:
print("응답에서 JSON을 찾을 수 없습니다.")
def extract_with_claude(response, token_limit=200000, max_tokens_per_chunk=1024):
message = client.messages.create(
model="claude-3-5-haiku-20241022",
max_tokens=2048,
messages=[
{
"role": "user",
"content": f"""
안녕하세요, 이 HTML 페이지의 일부를 파싱하여 JSON으로 변환해 주세요.
줄바꿈, 이스케이프 문자, 공백을 제거해야 합니다:
{response.text}
"""
}
]
)
text = message.to_dict()["content"][0]["text"]
return pull_json_data(text)
if __name__ == "__main__":
TARGET_URL = "https://quotes.toscrape.com"
response = requests.get(TARGET_URL)
print(extract_with_claude(response))
추출된 데이터입니다. Claude의 대화 출력에서 분리되었습니다.
{'quotes': [{'text': '우리가 창조한 세상은 우리의 사고 과정이다. 우리의 사고를 바꾸지 않고서는 바꿀 수 없다.', 'author': 'Albert Einstein', 'tags': ['change', 'deep-thoughts', 'thinking', 'world']}, {'text': '해리, 우리의 진정한 모습을 보여주는 것은 우리의 능력보다 훨씬 더 우리의 선택이다.', 'author': 'J.K. Rowling', 'tags': ['abilities', 'choices']}, {'text': '인생을 사는 방법은 두 가지뿐이다. 하나는 아무것도 기적처럼 보이지 않는 것처럼 사는 것이고, 다른 하나는 모든 것이 기적인 것처럼 사는 것이다.', 'author': 'Albert Einstein', 'tags': ['inspirational', 'life', 'live', 'miracle', 'miracles']}, {'text': '좋은 소설에서 즐거움을 느끼지 못하는 사람은, 신사든 숙녀든, 참을 수 없을 만큼 어리석은 사람일 것이다.', 'author': 'Jane Austen', 'tags': ['aliteracy', 'books', 'classic', 'humor']}, {'text': "불완전함은 아름다움이고, 광기는 천재성이다. 그리고 완전히 우스꽝스러운 것이 완전히 지루한 것보다 낫다.", 'author': 'Marilyn Monroe', 'tags': ['be-yourself', 'inspirational']}, {'text': '성공한 사람이 되려 하지 마라. 차라리 가치 있는 사람이 되라.', 'author': 'Albert Einstein', 'tags': ['adulthood', 'success', 'value']}, {'text': 'It is better to be hated for what you are than to be loved for what you are not.', 'author': 'André Gide', 'tags': ['life', 'love']}, {'text': "I have not failed. 단지 10,000가지 안 되는 방법을 발견했을 뿐이다.", 'author': 'Thomas A. Edison', 'tags': ['edison', 'failure', 'inspirational', 'paraphrased']}, {'text': "여자는 티백과 같다. 뜨거운 물에 담그기 전까지는 그 강도를 알 수 없다.", 'author': '엘리너 루스벨트', 'tags': ['misattributed-eleanor-roosevelt']}, {'text': '햇빛 없는 하루는, 알다시피, 밤과 같다.', 'author': 'Steve Martin', 'tags': ['humor', 'obvious', 'simile']}], 'topTags': ['love', 'inspirational', 'life', 'humor', 'books', 'reading', 'friendship', 'friends', 'truth', 'simile']}
대용량 페이지 처리
클로드에 대용량 페이지를 입력할 때 토큰 제약에 부딪힙니다. 클로드는 최대 200,000 토큰까지 허용합니다. 클로드가 더 큰 데이터를 처리하려면 데이터를 여러 조각으로 분할해야 합니다. 그러면 클로드가 각 조각을 개별적으로 처리할 수 있습니다.
def chunk_text(text, max_tokens):
"""토큰 제한에 따라 텍스트를 연속적인 청크로 분할합니다."""
chunks = []
while text:
# 현재 청크 크기에 대한 토큰 추정
current_chunk = text[:max_tokens * 4] # 대략적인 추정: 1 토큰 ≈ 4 문자
chunks.append(current_chunk)
text = text[len(current_chunk):] # 다음 청크로 이동
return chunks
위의 코드는 작업할 수 있는 기본적인 청크 분할 알고리즘을 제공합니다. 각 청크는 개별적으로 Claude로 전송되어 처리됩니다.
Claude와 웹 언락커, 주거용 프록시 활용
다음 예시에서는 AI 기반 스크레이퍼를 Bright Data 프록시와 통합하여 아마존의 차단 시스템을 우회합니다. 이는아마존을 수동으로 스크래핑하는 것보다 훨씬 적은 작업량입니다. 아래 스크레이퍼는웹 언락커또는주거용 프록시와 함께 사용할 수 있습니다.
import re
import requests
from bs4 import BeautifulSoup
import anthropic
import json
ANTHROPIC_API_KEY = "YOUR-ANTHROPIC-API-KEY"
client = anthropic.Anthropic(
api_key=ANTHROPIC_API_KEY,)
def estimate_tokens(text):
# 대략적인 추정치: 1 토큰 ≈ 4 문자
return len(text) // 4
def clean_html(html):
soup = BeautifulSoup(html, "html.parser")
# 스크립트 및 스타일 요소 제거
for script_or_style in soup(["script", "style"]):
script_or_style.decompose()
# 텍스트 콘텐츠만 추출
return soup.get_text(separator=" ", strip=True)
def pull_json_data(claude_text):
json_match = re.search(r"```jsonn(.*?)n```", claude_text, re.DOTALL)
if json_match:
# JSON 추출 및 Python 사전으로 로드
parsed_json = json.loads(json_match.group(1))
return parsed_json # JSON 예쁘게 출력
else:
print("응답에서 JSON을 찾을 수 없습니다.")
def chunk_text(text, max_tokens):
"""텍스트를 토큰 제한에 따라 연속적인 청크로 분할합니다."""
chunks = []
while text:
# 현재 청크 크기에 대한 토큰 추정
current_chunk = text[:max_tokens * 4] # 대략적인 추정: 1 토큰 ≈ 4 문자
chunks.append(current_chunk)
text = text[len(current_chunk):] # 다음 청크로 이동
return chunks
def extract_with_claude(response, token_limit=200000, max_tokens_per_chunk=1024):
"""Claude로 HTML 응답을 처리하며 텍스트를 동적으로 분할합니다."""
# 토큰 추정 및 필요한 전처리 수행
token_estimate = estimate_tokens(response.text)
page_to_parse = response.text
# 토큰 제한 초과 시 HTML 정리
if token_estimate > token_limit:
page_to_parse = clean_html(page_to_parse)
# 정리된 텍스트 분할
chunks = chunk_text(page_to_parse, max_tokens_per_chunk)
print(f"처리할 청크: {len(chunks)}")
# 각 청크 처리
results = []
for i, chunk in enumerate(chunks):
print(f"청크 {i + 1}/{len(chunks)} 처리 중...")
message = client.messages.create(
model="claude-3-5-haiku-20241022",
max_tokens=2048,
messages=[
{
"role": "user",
"content": f"""
안녕하세요, HTML 페이지의 이 청크를 파싱하여 JSON으로 변환해 주세요.
줄바꿈, 이스케이프 문자, 공백을 제거해야 합니다:
{chunk}
"""
}
]
)
text = message.to_dict()["content"][0]["text"]
try:
parsed_json = pull_json_data(text) # JSON 추출
results.append(parsed_json)
except Exception as e:
print(f"챕터 {i + 1} 처리 중 오류: {e}")
return results
if __name__ == "__main__":
TARGET_URL = "https://www.amazon.com/s?k=laptops"
PROXY_URL = "http://brd-customer-<YOUR-USERNAME>-zone-<YOUR-ZONE-NAME>:<YOUR-PASSWORD>@brd.superproxy.io:33335"
proxies = {
"http": PROXY_URL,
"https": PROXY_URL
}
response = requests.get(TARGET_URL, proxies=proxies, verify="brd.crt")
json_data = extract_with_claude(response)
with open("output.json", "w") as file:
try:
json.dump(json_data, file, indent=4)
except:
print("JSON 데이터 저장 실패")
이 예제는 우리의 인용문 스크레이퍼보다 상당히 정교합니다.
- 아마존은 방대한 응답 페이지를 제공합니다. 우리는 챕터링 알고리즘을 사용하여 페이지를 분할합니다.
- 각 청크를 API 클라이언트를 통해 Claude에 전달하여 처리합니다.
- 각 응답에서 JSON을 추출하여
결과에추가합니다. 파싱이 완료되면 이 결과를 반환합니다. - 스크래핑 후 결과를 JSON 파일로 기록합니다.
터미널 출력 결과는 다음과 같습니다. 페이지가 클로드 처리를 위해 6개 청크로 분할되었습니다.
처리할 청크: 6
청크 1/6 처리 중...
청크 2/6 처리 중...
청크 3/6 처리 중...
청크 4/6 처리 중...
청크 5/6 처리 중...
청크 6/6 처리 중...
추출된 최종 JSON 데이터는 아래에서 확인할 수 있습니다.
[
{
"page_title": "Amazon.com: 노트북",
"search_context": {
"total_results": "100,000개 이상",
"sort_options": [
"추천 상품",
"가격: 낮은 가격부터 높은 가격 순",
"가격: 높은 가격부터 낮은 가격",
"평균 고객 리뷰",
"최신 출시",
"베스트셀러"
]
},
"featured_products": [
{
"brand": "Apple",
"model": "2024 MacBook Pro",
"variants": [
{
"color": "실버",
"칩": "10코어 CPU 및 10코어 GPU 탑재 M4",
"디스플레이": "14.2인치 리퀴드 레티나 XDR",
"메모리": "16GB 통합 메모리",
"저장 용량": "512GB SSD",
"평점": 4.8,
"리뷰": 341
},
{
"color": "스페이스 블랙",
"칩": "10코어 CPU 및 10코어 GPU 탑재 M4",
"디스플레이": "14.2인치 리퀴드 레티나 XDR",
"메모리": "16GB 통합 메모리",
"저장 용량": "512GB SSD",
"평점": 4.8,
"리뷰": 341
},
{
"color": "실버",
"chip": "10코어 CPU 및 10코어 GPU 탑재 M4",
"display": "14.2인치 리퀴드 레티나 XDR",
"memory": "24GB 통합 메모리",
"storage": "1TB SSD",
"평점": 4.8,
"리뷰": 341
}
]
}
],
"추천 제품": [
{
"브랜드": "HP",
"모델": "14인치 노트북",
"features": {
"display_size": "14 inches",
"storage": "384GB (128GB eMMC + 256GB MSD)",
"ram": "16GB",
"os": "Windows 11 Pro",
"processor": "Intel Dual-Core N4120"
},
"price": 349.99,
"discount": 30.0,
"rating": 4.5,
"reviews": 849,
"recent_purchases": "500+"
},
{
"brand": "HP",
"model": "14 노트북",
"features": {
"display_size": "14인치",
"storage": "64GB",
"ram": "4GB",
"os": "Windows 11 Home",
"processor": "Intel Celeron N4020"
},
"price": 167.98,
"original_price": 209.99,
"rating": 4.0,
"reviews": 2290,
"recent_purchases": "10K+"
},
{
"brand": "Lenovo",
"model": "V15 Laptop",
"features": {
"display_size": "15.6인치 FHD 1080p",
"storage": "1TB PCIe SSD",
"ram": "32GB",
"os": "Windows 11 Pro",
"processor": "Intel Celeron N4500"
},
"price": 399.99,
"rating": 4.4,
"reviews": 284,
"recent_purchases": "400+"
}
]
},
{
"products": [
{
"name": "16인치 게이밍 노트북",
"specs": {
"displaySize": "16인치",
"diskSize": "512GB SSD",
"ram": "16GB",
"operatingSystem": "Windows 11 Pro",
"processor": "인텔 12세대 N95 프로세서(최대 3.4GHz)"
},
"features": [
"백라이트 키보드",
"지문 인식 잠금 해제",
"FHD 1920 * 1200"
],
"rating": {
"stars": 4.0,
"totalReviews": 651,
"monthlyPurchases": "300+"
},
"pricing": {
"currentPrice": 279.99,
"typicalPrice": 339.99,
"delivery": {
"type": "무료",
"dates": [
"2월 18일 화요일",
"2월 15일 토요일"
]
}
}
},
{
"name": "HP 17 노트북",
"specs": {
"displaySize": "17.3인치",
"diskSize": "1TB SSD",
"ram": "32GB",
"operatingSystem": "Windows 11 Home",
"processor": "AMD 라이젠 5 프로세서(i7-1165G7 성능, 최대 4.3GHz)"
},
"features": [
"웹캠",
"숫자 키패드",
"긴 배터리 수명"
],
"rating": {
"stars": 4.0,
"totalReviews": 22,
"monthlyPurchases": "500+"
},
"pricing": {
"currentPrice": 499.99,
"정가": 639.0,
"배송": {
"유형": "무료",
"날짜": "2월 18일 화요일"
}
}
}
]
},
{
"products": [
{
"name": "Dell Latitude Touch 3190 2-in-1 PC",
"specs": {
"processor": "인텔 쿼드 코어 최대 2.4GHz",
"ram": "4GB",
"storage": "64GB SSD",
"display": "11.6인치 HD 터치 고릴라 글래스 LED",
"connectivity": "WiFi 카메라 HDMI",
"os": "Windows 10 Pro"
},
"상태": "리뉴얼",
"평점": {
"별점": 3.9,
"총평점수": 327
},
"가격": 109.99,
"최근구매수": "1K+",
"지속가능성기능": true
},
{
"name": "HP Pavilion 터치스크린 노트북",
"specs": {
"displaySize": "15.6인치",
"storage": "1TB SSD",
"ram": "16GB",
"processor": "최대 4.1GHz 인텔 코어",
"batteryLife": "최대 11시간",
"os": "Windows 11 Home"
},
"rating": {
"stars": 4.2,
"totalReviews": 866
},
"price": 392.0,
"최근구매": "1K+",
"재고상태": "10개만 남음"
}
]
},
{
"노트북": [
{
"브랜드": "HP",
"모델": "휴대용 노트북",
"평점": {
"별점": 4.3,
"reviews": 279
},
"price": {
"current": 197.0,
"list": 269.0
},
"specs": {
"displaySize": "14 inches",
"diskSize": "64 GB",
"ram": "4 GB",
"operatingSystem": "Windows 11 S"
},
"features": [
"학생 및 비즈니스용",
"HD 디스플레이",
"인텔 쿼드 코어 N4120",
"1년 Office 365",
"웹캠",
"RJ-45",
"HDMI",
"Wi-Fi"
]
},
{
"brand": "HP",
"model": "노트북",
"rating": {
"stars": 4.1,
"reviews": 2168
},
"price": {
"current": 207.99
},
"specs": {
"displaySize": "14 inches",
"diskSize": "64 GB",
"ram": "8 GB",
"operatingSystem": "Windows 11 Home"
}
},
{
"brand": "NIMO",
"model": "15.6 FHD-Laptop",
"rating": {
"stars": 4.7,
"reviews": 6
},
"price": {
"current": 499.99,
"typical": 599.99
},
"specs": {
"ram": "32GB",
"storage": "1TB SSD",
"processor": "AMD Ryzen 5 6600H"
},
"features": [
"게이밍 노트북",
"100W Type-C",
"54Wh 배터리",
"WiFi 6",
"BT5.2",
"백라이트 키보드"
]
}
]
},
{
"processorSpeed": [
"1 to 1.59 GHz",
"1.60 to 1.79 GHz",
"1.80 to 1.99 GHz",
"2.00~2.49 GHz",
"2.50~2.99 GHz",
"3.00~3.49 GHz",
"3.50~3.99 GHz",
"4.0 GHz 이상"
],
"hardDiskDescription": [
"Emmc",
"HDD",
"SSD",
"SSHD"
],
"connectivityTechnology": [
"Bluetooth",
"Ethernet",
"HDMI",
"USB",
"Wi-Fi"
],
"humanInterface": {
"input": [
"터치 바",
"터치 패드",
"터치스크린",
"스타일러스 지원 터치스크린"
]
},
"graphicsType": [
"Dedicated",
"Integrated"
]
},
{
"services": [
"Groceries & More Right To Your Door",
"AmazonGlobal Ship Orders Internationally",
"Home Services Experienced Pros Happiness Guarantee",
"Amazon Web Services 확장 가능한 클라우드 컴퓨팅 서비스",
"Audible 오디오북 및 오리지널 오디오 공연 감상",
"Box Office Mojo 영화 박스오피스 데이터 조회",
"Goodreads 도서 리뷰 및 추천",
"IMDb 영화, TV 프로그램 및 연예인 정보",
"IMDbPro 엔터테인먼트 전문가용 정보 제공",
"Kindle Direct Publishing 독립 출판을 위한 간편한 디지털 및 인쇄 출판 서비스",
"아마존 포토 프라임 회원 무료 무제한 사진 저장",
"프라임 비디오 간편한 직접 동영상 배포",
"샵밥 디자이너 패션 브랜드",
"아마존 리셀 품질 중고 제품 특가",
"홀푸드 마켓 미국 최고의 건강 식품점",
"우트! 특가와 재미",
"자포스 신발 & 의류",
"링 스마트 홈 보안 시스템",
"eero WiFi 모든 방에서 4K 비디오 스트리밍",
"Blink 모든 가정을 위한 스마트 보안",
"Neighbors 앱 실시간 범죄 및 안전 알림",
"Amazon 구독 박스 최고의 구독 박스 – 문 앞까지 배달",
"PillPack 약국 간소화",
"Amazon Renewed 믿을 수 있는 새것 같은 제품"
],
"legalNotice": {
"conditionsOfUse": "이용 약관",
"privacyNotice": "개인정보 처리방침",
"consumerHealthPrivacy": "소비자 건강 데이터 개인정보 공개",
"adPrivacy": "광고 개인정보 선택",
"copyright": "© 1996-2026, Amazon.com, Inc. 또는 그 계열사"
}
}
]
스크래핑 브라우저를 사용한 클로드
아래 코드는 이전 예제에서 약간 수정된 것입니다. response.text를 호출하는 대신 driver.page_source를 응답 변수에 직접 할당합니다.
import re
import requests
from bs4 import BeautifulSoup
import anthropic
import json
from selenium.webdriver import Remote, ChromeOptions
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection
ANTHROPIC_API_KEY = "YOUR-ANTHROPIC-API-KEY"
client = anthropic.Anthropic(
api_key=ANTHROPIC_API_KEY,)
def estimate_tokens(text):
# 대략적인 추정치: 1 토큰 ≈ 4 문자
return len(text) // 4
def clean_html(html):
soup = BeautifulSoup(html, "html.parser")
# 스크립트 및 스타일 요소 제거
for script_or_style in soup(["script", "style"]):
script_or_style.decompose()
# 텍스트 콘텐츠만 추출
return soup.get_text(separator=" ", strip=True)
def pull_json_data(claude_text):
json_match = re.search(r```jsonn(.*?)n```", claude_text, re.DOTALL)
if json_match:
# JSON 추출 및 Python 사전으로 로드
parsed_json = json.loads(json_match.group(1))
return parsed_json # JSON을 예쁘게 출력
else:
print("응답에서 JSON을 찾을 수 없습니다.")
def chunk_text(text, max_tokens):
"""토큰 제한에 따라 텍스트를 연속적인 청크로 분할합니다."""
chunks = []
while text:
# 현재 청크 크기에 대한 토큰 추정
current_chunk = text[:max_tokens * 4] # 대략적인 추정: 1 토큰 ≈ 4 문자
chunks.append(current_chunk)
text = text[len(current_chunk):] # 다음 청크로 이동
return chunks
def extract_with_claude(response, token_limit=200000, max_tokens_per_chunk=1024):
"""Claude로 HTML 응답을 처리하며 텍스트를 동적으로 분할합니다."""
# 토큰 추정 및 필요한 경우 전처리
token_estimate = estimate_tokens(response)
page_to_parse = response
# 토큰 한도를 초과할 경우 HTML 정리
if token_estimate > token_limit:
page_to_parse = clean_html(page_to_parse)
# 정리된 텍스트 분할
chunks = chunk_text(page_to_parse, max_tokens_per_chunk)
print(f"처리할 청크: {len(chunks)}")
# 각 청크 처리
results = []
for i, chunk in enumerate(chunks):
print(f"청크 {i + 1}/{len(chunks)} 처리 중...")
message = client.messages.create(
model="claude-3-5-haiku-20241022",
max_tokens=2048,
messages=[
{
"role": "user",
"content": f"""
안녕하세요, HTML 페이지의 이 청크를 파싱하여 JSON으로 변환해 주세요.
줄바꿈, 이스케이프 문자, 공백을 제거해야 합니다:
{chunk}
"""
}
]
)
text = message.to_dict()["content"][0]["text"]
try:
parsed_json = pull_json_data(text) # JSON 추출
results.append(parsed_json)
except Exception as e:
print(f"챕터 {i + 1} 처리 중 오류: {e}")
return results
if __name__ == "__main__":
TARGET_URL = "https://www.walmart.com/search?q=laptops"
AUTH = "brd-customer-<YOUR-USERNAME>-zone-<YOUR-ZONE>:<YOUR-PASSWORD>"
SBR_WEBDRIVER = f"https://{AUTH}@brd.superproxy.io:9515"
sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome")
response = None
success = False
while not success:
try:
with Remote(sbr_connection, options=ChromeOptions()) as driver:
driver.get(TARGET_URL)
response = driver.page_source
success = True
except Exception as e:
print(f"페이지 가져오기 실패: {e}")
json_data = extract_with_claude(response)
with open("scraping-browser-output.json", "w") as file:
try:
json.dump(json_data, file, indent=4)
except:
print("JSON 데이터 저장 실패")
Claude가 추출한 Walmart 노트북 목록입니다.
[
{
"노트북": [
{
"브랜드": "에이서",
"모델": "크롬북 315",
"화면_크기": "15.6인치",
"프로세서": "인텔 프로세서 N4500",
"ram": "4GB",
"storage": "64GB eMMC",
"color": "Pure Silver/Moonstone Purple",
"os": "ChromeOS",
"price": {
"current": 139.0,
"original": 179.0
},
"리뷰": {
"수": 6370,
"평점": 4.4
}
},
{
"브랜드": "ASUS",
"모델": "Chromebook CM30",
"화면_크기": "10.5 인치",
"유형": "2-in-1 터치 태블릿",
"processor": "MediaTek Kompanio 520",
"ram": "8GB",
"storage": "128GB eMMC",
"color": "Fog Silver",
"extras": "Stylus Included",
"price": {
"current": 299.0
},
"reviews": {
"count": 265,
"rating": 4.4
}
},
{
"brand": "ASUS",
"model": "Chromebook Plus CX34",
"screen_size": "14 인치",
"type": "터치 노트북",
"processor": "Intel Core i3-1215U",
"ram": "8GB",
"storage": "128GB UFS",
"color": "Gray",
"features": [
"Google AI"
],
"price": {
"current": 329.0,
"original": 399.0
},
"reviews": {
"count": 111,
"rating": 4.6
}
},
{
"brand": "Naclud",
"screen_size": "15.6 인치",
"os": "Windows 11",
"ram": "36GB DDR4",
"storage": "128GB + 1024GB ROM",
"processor": "4 코어 셀러론 N5095",
"추가 기능": [
"1년 무료 Office 365",
"5TB 확장 지원",
"코파일럿"
],
"price": {
"current": 399.19,
"original": 1399.99,
"alternative_from": 329.99
},
"reviews": {
"count": 118,
"rating": 3.8
}
},
{
"brand": "RNRUO",
"screen_size": "14.1 인치",
"os": "Windows 11 Pro",
"type": "비즈니스 노트북",
"ram": "8GB",
"storage": "256GB SSD",
"processor": "2.64 GHz Intel Pentium J3710",
"resolution": "1920x1080 FHD",
"connectivity": [
"WiFi 5",
"BT5.0"
],
"color": "Gray",
"price": {
"current": 180.89,
"original": 498.0
}
}
]
},
{
"노트북": [
{
"이름": "Apple MacBook Air 13.3인치 노트북",
"색상": "실버",
"칩": "M1 칩",
"기능": [
"Apple 인텔리전스를 위해 설계됨"
],
"사양": {
"ram": "8GB",
"storage": "256GB"
},
"pricing": {
"currentPrice": 629.0,
"originalPrice": 699.0
},
"reviews": {
"count": 5082,
"rating": 4.7
},
"shipping": {
"type": "무료 배송",
"arrivalTime": "3일 이상 소요"
}
},
{
"name": "HP 14인치 Windows 노트북",
"color": "실버",
"processor": "Intel Celeron N4120",
"specs": {
"ram": "4GB",
"storage": "64GB eMMC"
},
"추가 혜택": [
"12개월 Microsoft 365 포함"
],
"가격": {
"현재 가격": 149.0,
"originalPrice": 249.0
},
"reviews": {
"count": 1061,
"rating": 4.4
},
"shipping": {
"type": "Free shipping",
"arrivalTime": "2 days"
}
}
]
},
[
{
"currentPrice": 449.99,
"originalPrice": 549.0,
"name": "HP Pavilion 16인치 Windows 노트북 AMD Ryzen 5-8540U AI PC 8GB RAM 512GB SSD 메테오 실버",
"rating": 4.4,
"reviewCount": 67,
"shipping": "무료 배송, 3일 이상 소요",
"stockStatus": "재고 2개 남음"
},
{
"현재가격": 194.95,
"원가": 229.0,
"제품명": "HP Stream 14인치 Windows 노트북 Intel 프로세서 N4120 4GB RAM 64GB eMMC 핑크 (12개월 Microsoft 365 포함)",
"평점": 4.2,
"리뷰 수": 16026,
"배송": "무료 배송으로 절약하세요, 2일 내 도착",
"재고 상태": "1개만 남음"
},
{
"currentPrice": 399.19,
"originalPrice": 1399.99,
"name": "Naclud 15.6인치 Windows 11 노트북 36GB DDR4 128+1024GB ROM 컴퓨터, 4코어 셀러론 N5095, 1년 무료 Office 365 구독, 5TB 확장 지원, Copilot",
"rating": 3.8,
"reviewCount": 118,
"shipping": "무료 배송으로 절약하세요, 2일 내 도착",
"stockStatus": "재고 있음"
},
{
"현재가격": 139.0,
"원가": 199.99,
"제품명": "에이서 크롬북 315 15.6인치 노트북 인텔 프로세서 N4500 4GB RAM 64GB eMMC 문스톤 퍼플",
"평점": 4.4,
"reviewCount": 6370,
"shipping": "오늘 무료 픽업으로 절약하세요, 오늘 배송, 무료 배송, 내일 도착",
"stockStatus": "재고 2개 남음"
},
{
"currentPrice": 265.79,
"originalPrice": 599.0,
"name": "SANPTENT 15.6인치 1080p FHD 노트북 컴퓨터 16GB RAM 512GB SSD, 4코어 인텔 셀러론 N5095, 지문 인식, 백라이트 키보드, Windows 11 Pro",
"rating": 4.0,
"reviewCount": 359,
"shipping": "무료 배송으로 절약하세요, 2일 내 도착",
"stockStatus": "재고 있음"
},
{
"currentPrice": 94.0,
"originalPrice": 139.99,
"name": "리퍼비시드 HP 크롬북 2024 OS 11.6인치 인텔 셀러론 1.6GHz 4GB RAM 16GB SSD 번들: 무선 마우스, 블루투스/무선 이어버드 포함 2일 익스프레스 배송 (리퍼비시드)",
"평점": 3.9,
"리뷰 수": 547,
"배송": "무료 배송, 2일 내 도착",
"재고상태": "재고 있음"
},
{
"현재가격": 792.99,
"원가": 999.99,
"이름": "DELL Inspiron 3520 15.6인치 터치스크린 i7 노트북, 인텔 코어 i7-1255U, 32GB RAM, 1TB SSD, 숫자 키패드, 웹캠, SD 카드 리더기, HDMI, Wi-Fi, Windows 11 Pro",
"rating": 1.0,
"reviewCount": 1,
"shipping": "무료 배송으로 절약하세요, 2일 내 도착",
"stockStatus": "재고 6개 남음"
},
{
"currentPrice": 279.09,
"originalPrice": 329.0,
"name": "노트북 15.6인치 FHD 16GB 512GB 인텔 쿼드코어 12세대 알더 레이크 N97 윈도우 11 프로 탑재",
"rating": 4.6,
"reviewCount": 1698,
"shipping": "무료 배송, 3일 이상 소요",
"stockStatus": "재고 있음"
},
{
"현재가격": 279.99,
"원가": null,
"제품명": "HP 14인치 HD 노트북 (학생 및 비즈니스용), 인텔 쿼드 코어 프로세서, 4GB RAM, 64GB eMMC+256GB 마이크로 SD, 장시간 배터리 수명, UHD 그래픽스, 웹캠, Windows 11 Home in S Mode, 스노우플레이크 화이트",
"rating": 4.3,
"reviewCount": 350,
"shipping": "무료 배송, 3일 이상 소요",
"stockStatus": "재고 있음"
},
{
"currentPrice": 244.9,
"originalPrice": 379.0,
"name": "HP 15.6인치 Windows 노트북 인텔 프로세서 N200 4GB RAM 128GB UFS 스칼렛 레드 (12개월 Microsoft 365 포함)",
"rating": null,
"reviewCount": null,
"shipping": null,
"stockStatus": null
}
],
{
"노트북": [
{
"브랜드": "HP",
"모델": "15.6인치 Windows 노트북",
"프로세서": "인텔 프로세서 N200",
"RAM": "4GB",
"저장공간": "128GB UFS",
"색상": "스칼렛 레드",
"price": {
"options": {
"min": 244.9,
"max": 249.0
}
},
"reviews": {
"count": 6192,
"rating": 4.3
},
"추가 혜택": "12개월 Microsoft 365 포함",
"배송": "무료 배송, 3일 이상 소요"
},
{
"브랜드": "HP",
"model": "15.6인치 Windows 노트북",
"processor": "Intel Core i3-N305",
"ram": "8GB",
"storage": "256GB SSD",
"color": "내추럴 실버",
"price": {
"current": 304.98,
"options": {
"min": 304.98,
"max": 329.0
}
},
"reviews": {
"count": 2001,
"rating": 4.5
},
"shipping": "무료 배송, 2일 내 도착"
}
]
},
{
"노트북": [
{
"이름": "HP 14인치 x360 FHD 터치 크롬북 노트북",
"사양": {
"프로세서": "인텔 프로세서 N100",
"RAM": "4GB",
"저장공간": "64GB eMMC",
"색상": "하늘색"
},
"price": {
"current": 269.0,
"original": null
},
"reviews": {
"count": 1437,
"rating": 4.5
},
"shipping": "무료 배송, 3일 이상 소요"
},
{
"name": "SANPTENT 16인치 Windows 11 Pro 노트북",
"specs": {
"processor": "4코어 인텔 알더 레이크 N95",
"ram": "16GB",
"storage": "512GB SSD",
"screen": "1920x1200 FHD IPS"
},
"price": {
"current": 279.38,
"original": 699.0
},
"reviews": {
"count": 352,
"rating": 3.9
},
"shipping": "무료 배송으로 절약하세요, 2일 내 도착"
}
]
},
{
"laptops": [
{
"name": "ASUS Vivobook Go 15.6인치 Windows 노트북",
"specs": {
"processor": "Intel Core i3-N305",
"ram": "8GB",
"storage": "256GB UFS",
"color": "Black"
},
"price": {
"current": 282.0,
"original": null
},
"reviews": {
"count": 330,
"rating": 4.4
},
"shipping": "무료 배송, 2일 내 도착"
},
{
"name": "최신 16인치 퍼플 노트북",
"specs": {
"processor": "12세대 알더 레이크 N95 CPU",
"ram": "12G LPDDR5",
"storage": "1T NVMe SSD",
"os": "윈도우 11 프로/오피스 2019"
},
"price": {
"current": 377.99,
"original": null,
"other_options_from": 369.99
},
"reviews": {
"count": 7,
"rating": 4.4
},
"shipping": "무료 배송, 2일 내 도착"
}
]
},
{
"products": [
"hp 노트북",
"맥북",
"게이밍 노트북",
"프린터 노트북",
"터치스크린",
"무선 마우스",
"아이패드",
"크롬북",
"마우스"
],
"pagination": {
"current": [
1,
2,
3
],
"total": 25
},
"footer_links": [
"카테고리",
"매장 찾기",
"채용 정보",
"회사 소개",
"월마트에서 판매하기",
"도움말",
"제품 리콜",
"접근성",
"면세 프로그램",
"월마트 앱 다운로드",
"이메일 가입",
"안전 데이터 시트",
"이용 약관",
"개인정보 보호 및 보안",
"캘리포니아 공급망 법",
"개인정보 선택 사항",
"수집 시 고지",
"광고 선택",
"소비자 건강 데이터 개인정보 보호 고지",
"브랜드 샵 디렉토리",
"약국",
"월마트 비즈니스"
],
"copyright": "© 2026 Walmart. All Rights Reserved."
}
]
결론
클로드가 브라이트 데이터 인프라를 통해 페이지를 파싱하도록 허용함으로써, 파서 작성 및 차단/IP 차단 처리 시간 소모를 획기적으로 줄일 수 있습니다. 귀하가 신경 써야 할 것은 오직 페이지뿐입니다. 페이지를 확보한 후에는 클로드에게 넘겨 완성 작업을 맡기면 됩니다. 전체 스크래퍼 실행 시간이 몇 분 더 소요될 수 있지만, 자체 파서 작성에 소요되는 시간과 비교하면 아무것도 아닙니다.
Bright Data 제품을 사용해 보시겠습니까? 지금 가입하고 무료 체험을 시작하세요!