로컬 스크래핑 작업을 1,000페이지에서 100,000페이지로 확장하는 것은 일반적으로 더 많은 서버, 프록시, 운영 작업이 필요함을 의미합니다. 대상 사이트의 스크래핑 난이도가 높아집니다. 인프라 비용이 증가합니다. 팀은 기능 출시보다 스크래퍼 수정에 더 많은 시간을 할애하게 됩니다. 대규모에서는 스크래핑이 단순한 스크립트가 아닌 인프라가 됩니다.
로컬 스크래핑과 클라우드 스크래핑의 선택은 세 가지 측면에 영향을 미칩니다: 비용, 안정성, 전달 속도.
요약
- 로컬 스크래핑은 사용자의 머신에서 실행됩니다. 완전한 통제권을 가지지만 수동 유지보수가 필요합니다.
- 클라우드 스크래핑은 자동 확장 및 내장형 IP 로테이션 기능을 갖춘 원격 인프라에서 실행됩니다.
- 1,000페이지 미만 또는 규제 대상 내부 전용 데이터에는 로컬 스크래핑을 선택하세요.
- 10,000페이지 이상, 차단된 사이트 또는 연중무휴 모니터링에는 클라우드 스크래핑을 선택하세요.
- IP 차단은 가장 큰 병목 현상으로, 68%의 팀이 주요 문제점으로 꼽습니다.
- 클라우드 스크래핑은 대규모 환경에서 DevOps 오버헤드를 제거하여 총 비용을 최대 70%까지 절감할 수 있습니다.
- Bright Data는 1억 5천만 개 이상의 주거용 IP, 99.9% 가동 시간, 유지보수가 전혀 필요 없는 실행을 제공합니다.
로컬 스크래핑이란 무엇인가요?
로컬 스크래핑은 코드, IP, 브라우저뿐만 아니라 장애 및 다운타임까지 전체 스택을 소유한다는 것을 의미합니다. 인프라에서 스크래핑 스크립트를 실행하고 전체 파이프라인을 직접 관리합니다.
관리되는 인프라 계층이 없으므로, 문제가 발생하면 직접 해결해야 합니다.
로컬 스크래핑의 작동 방식
로컬 스크래핑은 간단한 실행 루프를 따릅니다. 스크립트가 요청을 보내고 응답을 수신하며 HTML 또는 렌더링된 페이지에서 데이터를 추출합니다.
요청은 사용자의 IP 주소 또는 사용자가 구성한 프록시에서 시작됩니다. 사이트가 트래픽을 차단할 경우 IP를 회전시키고 수동으로 요청을 재시도해야 합니다.
정적 페이지의 경우 간단한 HTTP 클라이언트로 충분하지만, 자바스크립트가 많이 사용되는 사이트의 경우 콘텐츠를 추출하기 전에 렌더링하기 위해 로컬에서 헤드리스 브라우저를 실행해야 합니다.
이 외에도 로컬 스크래핑에서는 일반적으로 CAPTCHA 및 기타 봇 방지 조치를 수동으로 처리해야 합니다.
소규모에서는 효과가 있지만, 규모가 커지면 처음에 사용했던 간단한 스크립트가 운영 및 유지 관리해야 하는 복잡한 인프라 시스템으로 빠르게 변합니다.
로컬 스크래핑의 장점
로컬 스크래핑은 실행을 완전히 사용자 환경 내에서 유지하므로 다음과 같은 경우에 적합합니다:
- 완전한 실행 제어: 요청 타이밍, 헤더, 파싱 로직, 저장을 직접 관리합니다.
- 타사 의존성 없음: 외부 인프라나 공급자 없이 스크래핑이 실행됩니다.
- 민감한 데이터 보호: 데이터는 네트워크 내에 유지됩니다.
- 강력한 학습 효과: 헤더, 쿠키, 속도 제한, 오류 처리 등을 직접 다룹니다.
- 소규모 작업의 낮은 설정 비용: 보호되지 않은 사이트의 저용량 스크래핑에는 스크립트와 노트북만으로도 충분합니다.
로컬 스크래핑의 한계
볼륨과 안정성 요구 사항이 증가함에 따라 로컬 스크래핑의 지속 가능성은 어려워집니다:
- 확장성 부족: 대량 작업 시 추가 서버 및 대역폭 구매 필요.
- IP 차단: 사이트가 트래픽을 차단함에 따라 프록시를 확보, 순환 및 교체해야 합니다.
- CAPTCHA 중단: 수동 해결은 자동화를 방해하며, 자동화된 해결기는 비용과 지연 시간을 증가시킵니다.
- 자바스크립트 중심의 브라우저 실행: 자바스크립트 비중이 높은 사이트는 상당한 CPU와 메모리를 소모하는 로컬 브라우저를 필요로 합니다.
- 지속적인 유지보수: 사이트 변경 및 탐지 업데이트로 인해 빈번한 코드 수정과 재배포가 필요합니다.
- 취약한 안정성: 장애 발생 시 개입할 때까지 데이터 수집이 중단됩니다.
예시: Python을 활용한 로컬 스크래핑
소규모 파이썬 로컬 스크래핑 구현 예시:
import requests
from bs4 import BeautifulSoup
def scrape_products(url):
headers = {
"User-Agent": "Mozilla/5.0"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
return [
{
"name": item.find("h3").text.strip(),
"price": item.find("span", class_="price").text.strip(),
}
for item in soup.select(".product-card")
]
products = scrape_products("https://example.com/products")
이 스크립트는 로컬에서 실행되며 실제 IP 주소를 사용합니다. 보호되지 않은 사이트에서는 수백 페이지까지 문제없이 처리합니다.
하지만 누락된 부분을 확인하세요 – 프록시 로테이션, CAPTCHA 처리, 재시도 로직, 모니터링 기능이 없습니다. 이러한 기능을 추가하면 스크립트가 쉽게 부풀어 실행 및 유지 관리가 어려워질 수 있습니다.
클라우드 스크래핑이란?
클라우드 스크래핑은 실행을 애플리케이션 외부로 이동시킵니다. 사용자는 제공업체의 API에 요청을 보내고 추출된 데이터를 응답으로 받습니다. 제공업체가 프록시 네트워크 운영과 필요한 모든 스크래핑 인프라를 관리합니다.
Bright Data와 같은 플랫폼은 이러한 인프라를 생산 규모로 운영합니다.
클라우드 스크래핑 작동 방식
클라우드 스크래핑은 요청-실행-응답 모델을 따릅니다:
- 제공업체의 API를 통해 스크래핑 요청을 제출합니다.
- 제공업체는 해당 요청을 귀하의 머신이 아닌 원격 인프라의 프록시 네트워크를 통해 라우팅합니다.
- 사이트에서 JavaScript가 필요한 경우, 요청은 관리형 브라우저에서 실행됩니다. 렌더링된 페이지는 데이터 추출 전에 처리됩니다.
- 실패한 요청은 제공업체가 정의한 로직에 따라 재시도가 발생합니다.
- CAPTCHA 검증은 실행 계층 내에서 탐지 및 해결됩니다.
- 추출된 데이터는 응답으로 수신됩니다.
클라우드 스크래핑 작동 방식에 대한 간략한 개요는 다음과 같습니다:
클라우드 스크래핑의 장점
클라우드 스크래핑은 확장성, 신뢰성 및 운영 부담 감소 측면에서 유리합니다:
- 관리형 실행: 요청은 공급자가 운영하는 인프라에서 실행됩니다.
- 내장형 확장성: 새 서버 구매 없이도 볼륨이 증가합니다.
- 통합된 봇 방지 처리: IP 로테이션 및 재시도가 자동으로 수행됩니다.
- 브라우저 인프라 포함: 스크래핑 제공업체가 자바스크립트 렌더링 처리.
- 유지보수 범위 축소: 사이트 변경 시 지속적인 재배포가 필요하지 않습니다.
- 사용량 기반 비용: 요청량에 따른 가격 책정.
클라우드 스크래핑의 장단점
클라우드 스크래핑은 운영 소유권을 줄이지만 외부 의존성을 도입합니다. 일부 제어 기능이 애플리케이션 경계를 벗어나게 됩니다.
- 저수준 제어 감소: 타이밍, IP 선택 및 재시도는 공급자 로직을 따릅니다.
- 타사 의존성: 가용성과 실행이 시스템 외부에서 이루어집니다.
- 사용량에 따른 비용 증가: 대량 사용 시 지출 증가.
- 외부 디버깅: 오류 발생 시 공급자의 가시성과 지원이 필요합니다.
- 규 정준수 제약: 일부 데이터는 통제된 환경을 벗어날 수 없습니다.
예시: Bright Data Web Unlocker를 통한 대량 스크래핑
클라우드 기반 실행 계층을 통해 실행된 동일한 스크래핑 작업입니다.
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer API_KEY',
}
payload = {
'zone': 'web_unlocker1',
'url': 'https://example.com/products',
'format': 'json'
}
response = requests.post('https://api.brightdata.com/request', json=payload, headers=headers)
print(response.json())
한눈에 보아도 이 코드는 로컬 스크래핑 예제와 유사해 보입니다. 여전히 단일 HTTP 요청입니다. 차이점은 요청이 실행되는 위치입니다.
Bright Data Web Unlocker API를 사용하면 요청이 관리형 인프라에서 실행됩니다. IP 로테이션, 차단 감지 및 재시도는 애플리케이션 외부에서 처리됩니다.
클라우드 스크래핑 vs 로컬 스크래핑: 직접 비교
프로젝트에 실질적인 영향을 미치는 요소별로 로컬 스크래핑과 클라우드 스크래핑을 비교해 보겠습니다.
| 요소 | 로컬 스크래핑 | 클라우드 스크래핑 | Bright Data의 장점 |
|---|---|---|---|
| 인프라 | DIY 설정 | 완전 관리형 | 195개국에 걸친 글로벌 네트워크 |
| 확장성 | 제한적 | 월 수십억 건까지 자동 확장 | 월 수십억 건의 요청 |
| IP 차단 | 위험도 높음 | 자동 로테이션 | 1억 5천만 개 이상의 주거용 IP |
| 유지 관리 | 수동 | 공급자 관리 | 연중무휴 모니터링 |
| 비용 모델 | 고정 + 숨겨진 | 사용량 기반 | 최대 70% 비용 절감 |
| 봇 방지 | DIY | 내장 | 99.9%의 CAPTCHA 성공률 |
| 규정 준수 | DIY | 다양함 | SOC2, GDPR, CCPA |
비용 분석: 로컬 스크래핑 vs 클라우드 스크래핑
로컬 스크래핑은 운영 유지에 필요한 모든 요소를 고려하기 전까지는 저렴해 보입니다. 여기서 가장 큰 비용은 서버가 아니라, 기능 개발 대신 스크래핑 유지보수에 투입되는 엔지니어 인력입니다.
클라우드 스크래핑은 이러한 비용을 요청당 요금제로 전환합니다.
로컬 스크래핑 비용 구성 요소
로컬 스크래핑은 시간이 지남에 따라 누적되는 고정 비용이 있습니다.
- 서버: 가상 머신, 대역폭, 스토리지.
- 프록시: 주거용 또는 모바일 IP 구독.
- CAPTCHA 해결: 타사 해결 서비스.
- 유지보수: 수정 및 업데이트를 위한 엔지니어링 시간.
- 다운타임: 장애 발생 시 누락된 데이터.
스크래핑 여부와 상관없이 발생하는 비용들입니다.
클라우드 스크래핑 비용 구성 요소
클라우드 스크래핑은 사용량에 따른 가변적 가격 정책을 사용합니다.
- 요청: 요청당 또는 페이지당 가격 책정.
- 렌더링: 자바스크립트 실행에 대한 높은 비용.
- 데이터 전송: 대역폭 기반 요금.
인프라, 프록시 및 유지 관리가 모두 포함됩니다.
비용 비교
| 비용 요소 | 로컬 스크래핑 | 클라우드 스크래핑 | Bright Data |
|---|---|---|---|
| 서버 용량 | 월 고정 비용 | 포함 | 포함 |
| 프록시 인프라 | 별도 구독 | 포함 | 1억 5천만 개 이상의 IP 풀 |
| CAPTCHA 해결 | 별도 서비스 | 포함 | 포함 |
| 유지 관리 노력 | 지속적인 엔지니어링 시간 | 공급자 관리 | 유지보수 없음 |
| 다운타임 영향 | 귀사 팀이 흡수 | 공급자에 의해 감소 | 99.9% 가동 시간 SLA |
실제 비용 예시
보호된 사이트에서 매월 50만 페이지를 스크래핑하는 워크로드를 고려해 보십시오.
로컬 설정:
- 서버 및 대역폭: 월 300달러
- 주거용 프록시: 월 $1,250
- 캡차 해결: 월 $150
- 엔지니어링 유지보수: 월 3,000달러
- 총계: 월 $4,700
클라우드 설정:
- 렌더링 요청: 월 1,500달러
- 데이터 전송: $50/월
- 총계: $1,550/월
이 규모에서 클라우드 접근 방식은 월간 비용을 약 70% 절감합니다.
손익분기점
- 월 5,000페이지 미만: 로컬이 더 유리함
- 5,000~10,000 페이지 사이: 비용이 수렴
- 월 10,000페이지 초과: 일반적으로 클라우드 비용이 더 저렴
이 지점을 넘어서면 로컬 비용은 선형적으로 증가합니다. 클라우드 비용은 사용량에 따라 예측 가능하게 확장됩니다.
로컬 스크래핑 사용 시점
다음 조건이 모두 충족될 때 로컬 스크래핑이 적합합니다:
- 실행당 1,000페이지 미만 스크래핑
- 대상 사이트의 봇 차단 기능이 최소한인 경우
- 데이터가 환경 외부로 유출될 수 없는 경우
- 수동 유지 관리를 수용할 수 있을 때
- 스크래핑이 비즈니스에 필수적이지 않은 경우
이러한 조건을 벗어날 경우 비용과 위험이 급격히 증가합니다.
클라우드 스크래핑 사용 시점
다음 중 하나라도 해당될 때 클라우드 스크래핑이 적합합니다:
- 월 10,000페이지 이상의 대량 스크래핑이 필요한 경우
- 사이트가 강력한 봇 방지 기능을 적용하는 경우
- 자바스크립트 렌더링이 필요한 경우
- 데이터가 지속적으로 업데이트되어야 하는 경우
- 신뢰성이 실행 제어보다 중요할 때
이 시점에서 인프라 소유권은 부담이 됩니다.
Bright Data가 클라우드 스크래핑을 간소화하는 방법
Bright Data는 스크래핑 실행 위치와 더 이상 운영하지 않아도 되는 계층을 정의합니다. 스크래핑 운영 및 유지 관리 비용을 높이는 인프라를 처리합니다:
- 네트워크 접근: 관리형 프록시 인프라를 통한 요청 라우팅
- 브라우저 실행: 자바스크립트 중심 사이트용 원격 브라우저
- 봇 방지 대책: IP 로테이션, 차단 감지 및 재시도
- 오류 처리: 실행 제어 및 재시도 로직
- 유지 관리: 사이트 및 방어 체계 변화에 따른 지속적인 업데이트
- 세션 제어: 요청 간 고정 세션 유지.
- 지리적 정밀도: 국가, 도시, 통신사 또는 ASN을 대상으로 합니다.
- 지문 관리: 브라우저 수준의 지문 식별을 통한 탐지 감소.
- 트래픽 제어: 안전하게 로드 조절, 버스트 또는 분산.
실행 경로 및 도구
Bright Data는 고객의 요구에 따라 별개의 도구를 통해 이 인프라를 제공합니다.
스크래핑 브라우저 API
사이트에 JavaScript 렌더링이나 사용자 같은 상호 작용이 필요한 경우 스크래핑 브라우저를 사용하세요. 기존의 Selenium 또는 Playwright 로직이 로컬 인스턴스 대신 Bright Data에서 호스팅하는 브라우저에서 실행됩니다.
Bright Data는 로컬 브라우저 클러스터, 라이프사이클 관리 및 리소스 튜닝을 대체합니다.
웹 언락커 API
보호된 사이트에서 HTTP 기반 스크래핑을 수행하려면 웹 언락커를 사용하세요. Bright Data는 적응형 프록시 인프라를 통해 요청을 라우팅하고 내장된 차단 처리 기능을 적용합니다.
이를 통해 코드에서 프록시 소스 확보, IP 회전 또는 재시도 로직 작성의 필요성이 사라집니다.
웹 스크레이퍼 API(사전 구축된 데이터 세트)
Amazon, Google, LinkedIn 등 표준화된 플랫폼에는 웹 스크레이퍼 API를 사용하세요. 모든 주요 전자상거래 및 소셜 미디어 플랫폼을 위한 150개 이상의 사전 구축된 스크레이퍼를 제공합니다.
브라이트 데이터는 브라우저 자동화나 맞춤형 파서 없이도 구조화된 데이터를 반환합니다. 이를 통해 일반적인 데이터 소스에 대한 사이트별 스크레이퍼 유지 관리가 불필요해집니다.
스택에서 사라지는 것들
Bright Data를 사용하면 더 이상 다음을 운영할 필요가 없습니다:
- 프록시 풀 또는 IP 로테이션 로직
- 로컬 또는 자체 관리 브라우저 클러스터
- CAPTCHA 해결 서비스
- 사용자 정의 재시도 및 차단 감지 코드
- 사이트 및 탐지 변경 사항에 대한 지속적인 수정
이러한 운영 비용은 로컬 및 DIY 클라우드 설정에서 빠르게 누적됩니다.
Bright Data 대 다른 클라우드 스크래핑 도구
클라우드 스크래핑 플랫폼은 서로 대체할 수 있는 것이 아닙니다. 올바른 선택은 스크래핑의 양, 대상의 보호 수준, 운영할 의사가 있는 인프라의 규모에 따라 달라집니다.
직접 비교
| 공급자 | 규모 | IP 풀 | 규정 준수 | 최적 용도 |
|---|---|---|---|---|
| Bright Data | 기업용 (10억) | 1억 5천만 이상 | SOC2, GDPR, CCPA | 대규모 생산 |
| ScrapingBee | 중소 규모 | 제한적 | 부분적 | 간단한 프로젝트 |
| Octoparse | GUI 기반 | 소규모 풀 | 제한적 | 비기술적 사용자 |
Bright Data의 적용 분야
Bright Data는 스크래핑이 지속적으로 수행되며 운영상 중요한 워크로드에 적합합니다.
다음과 같은 경우가 포함됩니다:
- 월간 10,000페이지 이상의 대량 스크래핑이 필요한 경우
- 대상 사이트가 최신 봇 방어 기술을 적용한 경우
- 자바스크립트 렌더링이 필요한 경우
- 데이터가 하류 시스템 또는 분석으로 공급되는 경우
- 스크래핑 실패가 비즈니스에 영향을 미치는 경우
이러한 경우, API의 단순성보다 인프라 소유권이 비용과 위험을 더 많이 좌우합니다.
다른 도구가 충분할 때
제약이 적은 환경에서는 가벼운 클라우드 도구가 효과적입니다.
API 기반 서비스가 적합한 경우:
- 소규모 또는 주기적인 스크래핑 작업
- 제한된 보호 기능을 가진 사이트
- 가끔 발생하는 오류가 허용되는 작업 부하
GUI 기반 도구는 다음에 적합합니다:
- 비기술적 사용자
- 일회성 또는 수동 데이터 수집
- 탐색적 또는 임시 작업
이러한 도구는 설정 노력을 줄여주지만 대규모 운영 시 한계를 제거하지는 않습니다.
선택 방법
이 결정은 앞서 언급한 비용 및 사용량 기준과 유사합니다:
- 스크래핑 규모가 작거나 빈도가 낮거나 중요하지 않은 경우 , 단순한 도구로도 충분합니다
- 스크래핑이 지속적이고 보호 대상이거나 비즈니스에 중요한 경우 , 관리형 인프라가 중요합니다
결론
학습을 위해 로컬 스크래핑으로 시작하세요. 자체 머신에서 스크래퍼를 실행하면 요청, 파싱, 오류 처리 방식을 익힐 수 있습니다. 1,000페이지 미만의 소규모 작업에는 이 방법이 충분합니다.
규모나 보호 수준이 비용 구조를 바꿀 때 클라우드 스크래핑으로 전환하세요. 월 10,000페이지 이상 처리해야 하거나, 대상 사이트가 최신 봇 방어 체계를 구축했거나, 데이터가 지속적으로 업데이트되어야 하는 경우 인프라 소유권이 제약 요소가 됩니다.
로컬 스크래핑은 제어권과 책임을 부여합니다. 클라우드 스크래핑은 일부 제어권을 포기하는 대신 예측 가능한 실행, 낮은 운영 위험, 확장 가능한 비용을 제공합니다.
생산 환경에서는 클라우드 스크래핑이 인프라입니다. 대규모로 자체 CDN이나 이메일 서버를 운영하지 않는 것과 마찬가지로, 스크래핑 인프라도 동일한 논리를 따릅니다.
해당 사용 사례에 부합한다면 Bright Data 같은 플랫폼을 통해 추출 로직은 유지한 채 실행 및 유지보수를 스택 외부로 이전할 수 있습니다.
FAQ: 클라우드 스크래핑 vs 로컬 스크래핑
로컬 스크래핑이란 무엇인가요?
로컬 스크래핑은 사용자가 제어하는 머신에서 실행됩니다. 요청, 프록시, 브라우저, 재시도, 오류 등을 직접 관리합니다. 보안 수준이 낮은 사이트에서 소규모로 드물게 수행하는 작업에 가장 적합합니다.
클라우드 스크래핑이란 무엇인가요?
클라우드 스크래핑은 제3자가 운영하는 인프라에서 실행됩니다. API에 요청을 보내면 추출된 데이터를 응답으로 받습니다. 스크래핑 제공업체가 실행, 확장, IP 로테이션, CAPTCHA 해결, 봇 방지 조치 극복 등을 처리합니다.
로컬 스크래핑에서 클라우드 스크래핑으로 전환해야 할 때는 언제인가요?
다음 중 하나라도 발생할 때 전환하세요:
- 제한된 요청량 이후 IP 차단 발생
- CAPTCHA로 인해 자동화가 중단될 때
- 월 10,000페이지 이상 처리 시
- 자바스크립트 렌더링이 필요해질 때
- 스크래핑 실패가 하위 시스템에 영향을 미칠 때
이 시점에서 인프라 소유권은 부담이 됩니다.
클라우드 스크래핑이 로컬 스크래핑보다 더 비싼가요?
로컬 설정은 서버, 프록시, 유지 관리 및 다운타임 비용이 누적됩니다. 클라우드 가격은 사용량에 따라 조정되며 고정 인프라 오버헤드를 제거합니다.
- 소규모에서는 로컬 스크래핑이 종종 더 저렴합니다
- 대규모에서는 클라우드 스크래핑이 일반적으로 비용이 적게 듭니다
클라우드 스크래핑은 자바스크립트 중심 사이트를 처리할 수 있나요?
예. 클라우드 플랫폼은 원격으로 자바스크립트를 실행하는 관리형 브라우저를 운영합니다.
로컬 스크래핑은 헤드리스 브라우저를 직접 실행해야 하므로 동시 실행이 제한되고 유지 관리가 증가합니다.
클라우드 스크래핑은 IP 차단을 어떻게 줄이나요?
클라우드 공급자는 대규모 프록시 네트워크를 운영하며 요청 라우팅을 관리합니다. IP 로테이션 및 재시도 로직은 인프라 수준에서 수행됩니다.
민감하거나 규제 대상 데이터에 클라우드 스크래핑이 적합한가요?
항상 그런 것은 아닙니다. 정책이나 규정으로 인해 통제된 환경을 벗어날 수 없는 일부 워크로드가 있습니다. 그러나 Bright Data는 SOC2, GDPR 및 CCPA를 완전히 준수하는 스크래핑 솔루션을 제공합니다 .
로컬 스크래핑과 클라우드 스크래핑을 혼용할 수 있나요?
가능하지만 복잡성이 증가합니다.
일부 팀은 로컬에서 스크레이퍼를 개발 및 테스트한 후 클라우드에서 프로덕션 워크로드를 실행합니다. 이를 위해서는 두 개의 실행 환경을 유지 관리하고 그 차이점을 처리해야 합니다.
대부분의 팀은 주요 제약 조건에 따라 하나의 접근 방식을 선택합니다.
Bright Data와 같은 클라우드 스크래핑 플랫폼의 혜택을 가장 많이 받는 팀은 어떤 팀입니까?
스크래핑을 지속적 또는 비즈니스 핵심 시스템으로 운영하는 팀입니다. 여기에는 대량 작업, 보호 대상, 자바스크립트 렌더링 또는 제한된 엔지니어링 대역폭이 포함됩니다.