Aviasales, Booking, Skyscanner와 같은 여행 집계 사이트는 자동 데이터 수집을 적극적으로 차단하고 있습니다. IP를 10-20개의 요청 후 차단하고, CAPTCHA를 표시하며, 봇을 위해 가격을 왜곡합니다. 항공권이나 호텔 가격을 모니터링하려는 경우, 올바르게 설정된 프록시 없이는 파서가 몇 분 만에 차단될 수 있습니다.
이 가이드에서는 여행 사이트의 안정적인 파싱을 위해 어떤 프록시가 필요한지, IP 회전을 설정하는 방법, Cloudflare 및 Akamai의 안티봇 시스템을 우회하는 방법, 프록시를 사용할 때 차단으로 이어지는 오류에 대해 설명합니다.
왜 여행 집계 사이트가 파싱을 차단하는가 및 그 방법
여행 집계 사이트는 파싱으로 인해 실제 손실을 입습니다. 그들의 API에 대한 각 요청은 비용이 발생하며 (항공사와 호텔에 데이터 접근에 대한 비용을 지불함), 경쟁자들은 수집된 가격을 사용하여 고객을 유치합니다. 따라서 Aviasales, Booking, Skyscanner, Kayak은 안티봇 보호에 수백만 달러를 투자합니다.
파싱 탐지의 주요 방법
1. 하나의 IP에서 요청 빈도 분석. 일반 사용자는 세션당 3-5개의 검색 요청을 하지만, 파서는 분당 수백 개의 요청을 보냅니다. 만약 귀하의 IP에서 분당 15-20개 이상의 요청이 발생하면, 시스템은 이를 의심스러운 것으로 표시합니다. 50-100개의 요청 후에는 24시간 또는 영구적으로 차단됩니다.
2. 브라우저 지문 인식. 여행 사이트는 화면 해상도, 시간대, 설치된 글꼴, WebGL 지문, 캔버스 지문, 오디오 컨텍스트 등 수십 개의 매개변수를 수집합니다. 이러한 매개변수가 IP의 지리적 위치와 일치하지 않으면 (예: 모스크바의 IP인데 시간대가 UTC+8) 이는 프록시 또는 VPN의 징후입니다.
3. IP 평판 확인. 사이트는 알려진 프록시 제공업체, 데이터 센터, VPN 서버의 데이터베이스를 사용합니다. 만약 귀하의 IP가 이러한 데이터베이스에 등록되어 있다면 (예: MaxMind GeoIP2, IPQualityScore, SEON), 요청이 차단되거나 CAPTCHA가 표시됩니다. Booking과 Skyscanner는 Amazon AWS, Google Cloud, DigitalOcean의 IP에 특히 엄격합니다.
4. 행동 분석. 안티봇 시스템은 마우스 움직임, 스크롤 속도, 클릭 간의 간격을 추적합니다. Selenium과 Puppeteer는 추가 패치 없이 흔적을 남깁니다: navigator.webdriver 속성, 플러그인 없음, 비정상적인 창 크기. 프록시를 사용하더라도 이러한 트래픽을 쉽게 인식할 수 있습니다.
5. TLS 지문 인식. 현대의 안티봇 시스템 (Cloudflare, Akamai)은 TLS 핸드셰이크 매개변수를 분석합니다: 암호 스위트의 순서, 확장, 프로토콜 버전. Python requests와 표준 라이브러리의 TLS 지문은 브라우저와 다르며 — 이는 즉시 봇으로 인식됩니다.
실제 사례: 우리의 한 고객이 100개의 데이터 센터 프록시 (DigitalOcean)를 통해 Booking의 가격을 파싱했습니다. 2시간 후 모든 IP가 영구적으로 차단되었습니다 — Booking은 데이터 센터 범위를 감지하고 블랙리스트에 추가했습니다. 주거용 프록시로 전환하자 문제가 해결되었습니다: 한 달 동안 차단 없음.
가격 모니터링에 적합한 프록시 유형: 비교
여행 집계 사이트의 파싱에는 세 가지 유형의 프록시가 사용됩니다: 주거용, 모바일 및 데이터 센터 프록시. 각 유형마다 장단점과 사용 시나리오가 있습니다. 선택은 파싱의 양, 예산 및 익명성 요구 사항에 따라 다릅니다.
| 프록시 유형 | 사이트의 신뢰 수준 | 속도 | 비용 (대략) | 가장 적합한 용도 |
|---|---|---|---|---|
| 주거용 프록시 | 매우 높음 (가정용 사용자 IP) | 중간 (300-800 ms) | $$$ (트래픽 기준) | Booking, Expedia, Airbnb — 강력한 보호가 있는 사이트 |
| 모바일 프록시 | 최대 (모바일 운영자 IP) | 낮음 (500-1500 ms) | $$$$ (가장 비쌈) | 모바일 버전 파싱, API 요청, Cloudflare 우회 |
| 데이터 센터 프록시 | 낮음 (쉽게 탐지됨) | 매우 높음 (50-150 ms) | $ (가장 저렴함) | Aviasales API, 덜 보호된 집계 사이트, 테스트 |
특정 여행 사이트 선택 시의 특징
Aviasales 및 Skyscanner는 API를 통한 파싱에 대해 상대적으로 관대합니다 (파트너 접근이 있는 경우). 웹 파싱에는 5-10개의 요청마다 회전하는 주거용 프록시가 충분합니다. 데이터 센터 프록시는 작동하지만, 많은 IP 풀 (최소 500개 주소)과 느린 회전 (하나의 IP에서 30초마다 1개의 요청 이하)이 필요합니다.
Booking.com 및 Expedia는 엄격한 규칙을 가진 Cloudflare Enterprise를 사용합니다. 데이터 센터 프록시는 느린 파싱을 하더라도 90%의 경우 차단됩니다. 주거용 또는 모바일 프록시만 필요하며, 실제 브라우저를 에뮬레이션해야 합니다 (Selenium Stealth, Puppeteer Extra 플러그인 사용). IP 회전은 3-5개의 요청 후에 이루어져야 합니다.
Airbnb는 가장 보호가 강한 사이트 중 하나입니다. 검색 요청과 일치하는 지리적 위치를 가진 주거용 프록시가 필요합니다 (예: 파리의 호텔을 검색하는 경우 — IP는 프랑스어여야 함). 쿠키, 리퍼러, 브라우저 헤더가 필수입니다. 모바일 프록시는 모바일 API를 통한 파싱에서 더 나은 결과를 보여줍니다.
Kayak 및 Momondo는 중간 수준의 보호를 가지고 있습니다. 주거용 프록시가 최적의 선택입니다. 데이터 센터 프록시를 사용할 수 있지만, 필수 회전 및 요청 간 지연 (최소 10-15초)이 필요합니다.
주거용 vs 데이터 센터 프록시: 여행 사이트에 적합한 선택
주거용 프록시와 데이터 센터 프록시의 주요 차이점은 IP 주소의 출처입니다. 주거용 프록시는 실제 가정용 인터넷 제공업체 (Ростелеком, МТС, Comcast, Verizon)의 IP를 사용하고, 데이터 센터 프록시는 호스팅 회사의 서버 (AWS, Google Cloud, OVH)의 IP를 사용합니다. 여행 사이트는 일반 사용자가 사용하는 주거용 IP를 신뢰합니다.
주거용 프록시가 필수인 경우
1. Cloudflare/Akamai가 있는 사이트 파싱. Booking, Expedia, Airbnb는 이러한 시스템을 사용합니다 — 이들은 데이터 센터 IP의 95%를 자동으로 차단합니다. 주거용 프록시는 확인을 통과합니다, 왜냐하면 그들의 IP는 프록시 제공업체의 데이터베이스에 등록되어 있지 않기 때문입니다.
2. 지리적 위치에 따라 가격 수집. 여행 사이트는 서로 다른 국가와 도시의 사용자에게 서로 다른 가격을 표시합니다 (세금, 환율, 지역 프로모션 때문). 특정 지역의 가격이 필요한 경우 (예: 독일 거주자의 가격), 독일 IP를 가진 주거용 프록시가 유일한 신뢰할 수 있는 옵션입니다.
3. 차단 없이 장기 파싱. 가격을 24/7 몇 달 동안 모니터링하는 경우, 주거용 프록시는 비용을 회수합니다 — 차단된 IP를 교체하고 새로운 프록시를 설정하는 데 시간을 낭비하지 않습니다.
데이터 센터 프록시를 사용할 수 있는 경우
1. 공식 API를 통한 파싱. Aviasales API, Skyscanner API에 파트너 접근이 있는 경우, 프록시 유형은 중요하지 않습니다, API는 IP 출처에 덜 민감합니다. 데이터 센터 프록시는 높은 속도와 낮은 비용을 제공합니다.
2. 파서 테스트 및 개발. 코드 작성 및 디버깅 단계에서는 데이터 센터 프록시를 사용하십시오 — 이들은 더 저렴하고 빠르며, 몇 개의 IP가 차단되더라도 아깝지 않습니다.
3. 덜 보호된 집계 사이트 파싱. 일부 지역 여행 사이트나 버스 티켓 집계 사이트는 고급 안티봇 보호를 사용하지 않습니다. 이들에게는 큰 IP 풀과 느린 회전을 가진 데이터 센터 프록시가 적합합니다.
조언: 프록시 유형을 조합하십시오. 중요한 요청 (첫 검색, 토큰 가져오기, CAPTCHA 우회)에는 주거용 프록시를 사용하고, API에 대한 대량 요청이나 덜 보호된 엔드포인트에는 데이터 센터 프록시를 사용하십시오. 이렇게 하면 안정성을 유지하면서 비용을 40-60% 절감할 수 있습니다.
IP 회전 전략: 파싱 시 프록시를 얼마나 자주 변경해야 하는가
올바른 IP 회전은 차단 없이 장기 파싱의 열쇠입니다. IP를 너무 자주 변경하면 주소 풀을 빠르게 소진하고 높은 트래픽 비용을 초래합니다. 너무 드물게 변경하면 하나의 IP에서 의심스러운 활동이 누적되어 차단될 수 있습니다.
프록시 회전 유형
1. 요청에 따른 회전 (rotating proxies). IP는 각 요청 후 자동으로 변경되거나 지정된 요청 수 후에 변경됩니다. 대부분의 주거용 프록시 제공업체는 이 모드를 제공합니다: 하나의 엔드포인트에 연결하면 (예: gate.proxycove.com:8000), IP는 제공업체 측에서 변경됩니다.
장점: 설정이 간단하고, IP 풀을 수동으로 관리할 필요가 없으며, 하나의 IP가 차단될 위험이 최소화됩니다.
단점: 세션을 제어할 수 없으며 (쿠키나 토큰을 유지해야 하는 경우), 각 요청 = 새로운 IP = 새로운 트래픽 비용이 발생합니다.
2. 스티키 세션 (session proxies). IP는 특정 시간 (보통 10-30분) 동안 세션에 고정됩니다. 하나의 IP에서 여러 요청을 한 후 자동으로 변경됩니다. 프록시 매개변수를 통해 설정됩니다 (예: session-id123를 로그인에 추가).
장점: 세션 내에서 쿠키와 토큰을 유지할 수 있으며, 트래픽 소비가 줄어듭니다 (하나의 IP = 여러 요청).
단점: 세션 중에 IP가 차단되면, 이 세션의 모든 후속 요청이 차단됩니다.
3. 풀에서 수동 회전. IP 주소 목록 (예: 1000개)을 받고, 파서 코드에서 회전을 관리합니다: 목록에서 무작위 IP를 선택하고 N개의 요청을 수행한 후 다음으로 전환합니다. 데이터 센터 프록시에 일반적입니다.
장점: 회전에 대한 완전한 제어가 가능하며, 차단된 IP를 풀에서 제외할 수 있습니다.
단점: 코드에서 회전 로직을 작성해야 하며, IP의 상태 (어떤 것이 사용되었는지, 어떤 것이 차단되었는지)를 관리해야 합니다.
여행 사이트에 대한 권장 회전 빈도
| 사이트 | 프록시 유형 | 회전 빈도 | 1 IP당 최대 요청 수 |
|---|---|---|---|
| Booking.com | 주거용 | 3-5 요청 후 | 5-7 |
| Expedia | 주거용 | 5-8 요청 후 | 8-10 |
| Airbnb | 주거용/모바일 | 2-4 요청 후 | 3-5 |
| Aviasales | 주거용/데이터 센터 | 10-15 요청 후 | 15-20 |
| Skyscanner | 주거용/데이터 센터 | 8-12 요청 후 | 12-15 |
| Kayak | 주거용 | 5-10 요청 후 | 10-12 |
중요: 이는 평균값입니다. 실제 한계는 시간대 (밤에는 안티봇 시스템이 더 엄격함), 요청 유형 (항공권 검색 = API에 더 많은 부하, 호텔 보기), 브라우저 에뮬레이션 품질에 따라 다릅니다. 보수적인 값 (IP당 요청 수를 줄임)으로 시작한 후, 차단 비율을 모니터링하며 점차 증가시킵니다.
프록시의 지리적 타겟팅: IP 주소의 국가와 도시가 중요한 이유
여행 사이트는 사용자의 지리적 위치에 따라 서로 다른 가격을 표시합니다. 이는 버그가 아니라 비즈니스 모델입니다: 항공사와 호텔은 서로 다른 시장에 대해 서로 다른 요금을 설정합니다. 예를 들어, 모스크바-뉴욕 항공권은 러시아 사용자에게는 $600이고, 미국 사용자에게는 $750일 수 있습니다 (세금, 경쟁, 구매력 때문).
사이트가 지리적 위치를 어떻게 결정하는가
1. IP 주소를 통해. 주요 방법입니다. 사이트는 GeoIP 데이터베이스 (MaxMind, IP2Location)를 사용하여 IP를 도시, 지역, 국가와 매칭합니다. 도시의 정확도는 70-90%, 국가의 정확도는 95-99%입니다.
2. 브라우저 언어 및 시간대에 따라. IP가 독일을 나타내고, 브라우저 언어가 러시아어이며, 시간대가 UTC+3 (모스크바)일 경우 — 이는 프록시의 징후입니다. 사이트는 CAPTCHA를 표시하거나 요청을 차단할 수 있습니다.
3. 통화 및 계정 설정에 따라. Booking 계정에 로그인한 경우, 사이트는 등록 시 귀하의 국가를 기억합니다. IP를 다른 국가로 변경하면 의심을 불러일으킬 수 있으며 — Booking은 신원을 확인하거나 계정을 차단할 수 있습니다.
프록시의 지리적 위치를 올바르게 선택하는 방법
특정 시장의 가격 수집을 위해: 관심 있는 국가의 IP를 사용하십시오. 러시아 시장의 가격을 모니터링하는 경우 — 러시아 주거용 프록시를 사용하십시오. 유럽 시장의 경우 — EU 국가 (독일, 프랑스, 폴란드)의 프록시를 사용하십시오. 미국의 경우 — 미국 프록시를 사용하십시오.
지리적 차단 우회를 위해: 일부 여행 사이트나 특별 제안은 특정 국가에서만 접근할 수 있습니다. 예를 들어, 미국 내 항공편은 미국 IP로 예약할 때 더 저렴할 수 있습니다. 필요한 국가의 프록시를 사용하고, 해당 국가에 맞게 브라우저 언어 및 시간대를 설정하십시오.
글로벌 데이터 파싱을 위해: 모든 시장의 가격이 필요한 경우 (예: 분석용), 다양한 국가의 프록시 풀을 사용하십시오. IP와 함께 지리적 위치를 회전하십시오: 독일 IP의 요청 → 독일 가격, 프랑스 IP의 요청 → 프랑스 가격.
오류: 한 국가의 IP를 사용하면서 다른 국가에서 호텔/항공권을 검색하는 경우 (통화가 일치하지 않음). 예를 들어, 러시아 IP에서 태국의 호텔을 검색하고 통화는 유로인 경우. 이는 의심스러워 보입니다. 목적지 국가의 IP를 사용하거나, 본인의 실제 국가의 IP와 해당 통화를 사용하십시오.
인기 파서 및 스크립트를 위한 프록시 설정
가장 인기 있는 여행 사이트 파싱 도구를 위한 프록시 설정을 살펴보겠습니다. 예시는 주거용 프록시를 위한 것이지만, 다른 유형에도 적용 가능합니다.
Python + requests / httpx
API 또는 JavaScript가 없는 간단한 페이지를 파싱하는 가장 간단한 방법입니다. Aviasales API, Skyscanner API, Cloudflare가 없는 간단한 엔드포인트에 적합합니다.
import requests
# 프록시 데이터 (자신의 것으로 교체)
proxy_host = "gate.proxycove.com"
proxy_port = "8000"
proxy_user = "your_username"
proxy_pass = "your_password"
proxies = {
"http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
"https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
}
# 브라우저 헤더 (필수!)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Referer": "https://www.google.com/"
}
# 프록시를 통한 요청
response = requests.get(
"https://www.aviasales.com/search",
proxies=proxies,
headers=headers,
timeout=30
)
print(response.status_code)
print(response.text[:500]) # 응답의 처음 500자
중요: 회전하는 주거용 프록시의 경우, 각 새로운 요청은 자동으로 새로운 IP를 받습니다. 스티키 세션 (여러 요청에 하나의 IP 필요)이 필요한 경우, 세션 ID를 사용자 이름에 추가하십시오: your_username-session-12345.
Selenium (JavaScript가 있는 사이트용)
Booking, Expedia, Airbnb는 콘텐츠 렌더링 및 안티봇 검사를 위해 JavaScript를 적극적으로 사용합니다. Selenium은 실제 브라우저를 에뮬레이트하지만, 탐지를 우회하기 위해 추가 설정이 필요합니다.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
# Chrome 설정
chrome_options = Options()
# 프록시
proxy_host = "gate.proxycove.com"
proxy_port = "8000"
proxy_user = "your_username"
proxy_pass = "your_password"
# Chrome용 프록시 형식
chrome_options.add_argument(f'--proxy-server=http://{proxy_host}:{proxy_port}')
# 자동화 숨기기
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# User-Agent
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
driver = webdriver.Chrome(options=chrome_options)
# webdriver 속성 제거
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
# 프록시 인증 (필요한 경우)
# Chrome에서는 인증을 위한 확장 프로그램을 만들어야 하며, selenium-wire를 참조하거나 Puppeteer를 사용하는 것이 더 간단합니다.
driver.get("https://www.booking.com/")
print(driver.title)
driver.quit()
문제: Chrome은 login:password를 통해 프록시 인증을 직접 지원하지 않습니다. 해결책: selenium-wire 라이브러리를 사용하여 인증이 있는 프록시를 추가하거나, 인증을 위한 Chrome 확장 프로그램을 만들거나, Puppeteer (Node.js)를 사용하는 것입니다.
Puppeteer (Node.js) — 복잡한 사이트에 대한 최상의 선택
Puppeteer는 Selenium보다 브라우저를 더 잘 에뮬레이트하며, 프록시 인증을 쉽게 설정할 수 있습니다. Booking, Airbnb, Expedia에 권장됩니다.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: [
'--proxy-server=http://gate.proxycove.com:8000',
'--disable-blink-features=AutomationControlled',
'--no-sandbox'
]
});
const page = await browser.newPage();
// 프록시 인증
await page.authenticate({
username: 'your_username',
password: 'your_password'
});
// webdriver 숨기기
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
});
// User-Agent
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
await page.goto('https://www.booking.com/', { waitUntil: 'networkidle2' });
const title = await page.title();
console.log('Title:', title);
await browser.close();
})();
탐지를 방지하기 위해 puppeteer-extra-plugin-stealth 플러그인을 사용하십시오 — 이 플러그인은 자동으로 모든 자동화 징후를 숨깁니다.
준비된 솔루션: Scrapy, Crawlee
Scrapy (Python) — 대규모 파싱을 위한 프레임워크입니다. 미들웨어를 통해 프록시를 지원합니다. settings.py에서 설정 예시:
# settings.py
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1,
}
# 스파이더에서
class TravelSpider(scrapy.Spider):
def start_requests(self):
proxy = "http://your_username:your_password@gate.proxycove.com:8000"
yield scrapy.Request(
url="https://www.aviasales.com/",
meta={'proxy': proxy},
callback=self.parse
)
Crawlee (Node.js) — 내장된 프록시 회전, 안티봇 시스템 우회, 자동 재시도를 지원하는 현대적인 프레임워크입니다. 여행 사이트에 매우 적합합니다.
Cloudflare, PerimeterX, Akamai의 안티봇 시스템 우회
품질이 좋은 주거용 프록시를 사용하더라도, 안티봇 시스템을 올바르게 우회하지 않으면 차단에 직면할 수 있습니다. Booking은 Cloudflare를 사용하고, Airbnb는 PerimeterX를 사용하며, 일부 사이트는 Akamai Bot Manager를 사용합니다. 이러한 시스템은 IP뿐만 아니라 행동, 브라우저 지문, TLS 핸드셰이크를 분석합니다.
Cloudflare: 우회의 주요 방법
1. 브라우저 자동화 사용. Cloudflare는 브라우저에서 수행되는 JavaScript 챌린지를 확인합니다. 간단한 HTTP 요청 (requests, curl)은 검증을 통과하지 못합니다. Puppeteer, Playwright 또는 Selenium을 사용하여 올바른 설정으로 실행해야 합니다.
2. 자동화의 징후 숨기기. puppeteer-extra-plugin-stealth (Node.js) 또는 undetected-chromedriver (Python)를 설치하십시오. 이러한 라이브러리는 브라우저를 패치하여 navigator.webdriver, window.chrome 속성을 제거하고, 권한 API를 변경합니다.
3. 올바른 TLS 지문. Cloudflare는 TLS 핸드셰이크를 분석합니다. 브라우저의 TLS를 에뮬레이트하는 라이브러리를 사용하십시오: curl-impersonate (Chrome/Firefox TLS 에뮬레이트), tls-client (Go), hrequests (Python).
4. CAPTCHA를 자동으로 해결하십시오. Cloudflare가 CAPTCHA (Turnstile)를 표시하는 경우, CAPTCHA 해결 서비스를 사용하십시오: 2Captcha, Anti-Captcha, CapSolver. 이들은 API를 통해 통합되며, 1000개의 해결에 대해 $1-3의 비용이 발생합니다.
PerimeterX (Airbnb, 일부 여행 사이트)
PerimeterX는 가장 복잡한 안티봇 시스템 중 하나입니다. 사용자의 행동 (마우스 움직임, 클릭, 스크롤)을 분석하고, 장치의 지문을 생성하며, 쿠키 및 localStorage를 확인합니다.
우회 방법:
1. 사용자 행동을 에뮬레이트하십시오. 행동 사이에 무작위 지연 (2-5초)을 추가하고, 마우스를 움직이며, 페이지를 스크롤하십시오. Puppeteer에서는 ghost-cursor 라이브러리를 사용하여 현실적인 마우스 움직임을 구현하십시오.
2. 쿠키 및 localStorage를 유지하십시오. PerimeterX는 쿠키 (_px3, _pxhd)와 localStorage에 저장되는 토큰을 생성합니다. IP를 변경하지만 쿠키를 유지하면 의심스럽습니다. IP를 변경할 때 쿠키를 지우거나, 스티키 세션 (하나의 IP = 하나의 세션과 쿠키)을 사용하십시오.
3. 모바일 프록시를 사용하십시오. PerimeterX는 데이터 센터 IP에 대해 더 엄격합니다. 모바일 프록시는 PerimeterX를 우회하는 데 더 나은 결과를 보여줍니다.
Akamai Bot Manager
Akamai는 센서 데이터 (모바일의 가속도계, 자이로스코프), WebGL 지문, 오디오 컨텍스트, 장치 성능을 분석합니다. 우회하려면 고급 브라우저 에뮬레이션이 필요합니다.
권장 사항: 실제 브라우저 (헤드리스가 아님)를 사용하고, 모바일 프록시를 사용하며, 무작위 지연을 추가하고, 센서 이벤트 (터치 이벤트)를 에뮬레이트하십시오. 복잡한 경우에는 브라우저 농장 (BrowserStack, LambdaTest)이나 안티탐지 브라우저 (AdsPower, Multilogin)를 사용하십시오.
프록시를 통한 여행 사이트 파싱 시 일반적인 실수
경험이 많은 개발자조차도 차단으로 이어지는 실수를 저지릅니다. 가장 흔한 문제와 그 해결책은 다음과 같습니다.
오류 1: 모든 요청에 동일한 User-Agent 사용
모든 요청이 동일한 User-Agent (예: 표준 Python requests: python-requests/2.28.0)로 전송되면, 이는 즉시 봇으로 인식됩니다. IP를 변경하더라도 사이트는 동일한 UA를 보고 요청을 연결합니다.
해결책: 실제 브라우저 (Chrome, Firefox, Safari)의 User-Agent 목록을 사용하고 이를 회전시키십시오. fake-useragent 라이브러리 (Python)는 무작위 UA를 자동으로 생성합니다.
오류 2: 너무 높은 요청 속도
파서가 초당 100개의 요청을 보내면 — 이는 사람이 물리적으로 불가능합니다. 다양한 IP를 사용하더라도 안티봇 시스템은 패턴을 통해 비정상적인 활동을 탐지합니다 (모든 요청이 정확히 0.01초 간격으로 발생).
해결책: 요청 간에 무작위 지연을 추가하십시오: time.sleep(random.uniform(2, 5)). 여행 사이트의 경우 최적의 설정은: 하나의 IP에서 요청 간 2-5초, 서로 다른 IP에서 요청 간 0.5-2초입니다.
오류 3: 쿠키 및 세션 무시
여행 사이트는 세션 추적, 안티봇 시스템의 토큰 저장, 가격 개인화를 위해 쿠키를 사용합니다. 매 요청을 쿠키 없이 (새로운 사용자처럼) 수행하면 이는 의심스럽습니다.
해결책: requests.Session() (Python)을 사용하거나 Puppeteer에서 요청 간 쿠키를 유지하십시오. 스티키 세션 (하나의 IP = 여러 요청)에는 반드시 쿠키를 유지해야 합니다.
오류 4: IP의 지리적 위치와 브라우저 매개변수 불일치
독일의 IP, 하지만 브라우저 언어는 러시아어, 시간대는 UTC+3, 통화는 루블입니다. 안티봇 시스템은 이러한 불일치를 감지하고 요청을 차단합니다.
해결책: 브라우저 매개변수를 프록시의 지리적 위치와 동기화하십시오. 독일 IP를 사용하는 경우 — 독일어 설정 (Accept-Language: de-DE), 시간대 Europe/Berlin, 통화 EUR를 설정하십시오.
오류 5: 무료 또는 저품질 프록시 사용
무료 프록시와 저렴한 공개 프록시는 이미 모든 주요 여행 사이트에서 차단되었습니다. 이들의 IP는 블랙리스트에 올라 있으며, 나쁜 평판을 가지고 있습니다 (스팸, DDoS에 사용됨).
해결책: 신뢰할 수 있는 공급자로부터 고품질의 주거용 또는 모바일 프록시를 사용하십시오. 사용하기 전에 IPQualityScore, Scamalytics 서비스를 통해 IP의 평판을 확인하십시오.
파서 실행 전 체크리스트:
✅ 프록시 — 주거용 또는 모바일, 필요한 지리적 위치
✅ User-Agent — 실제 브라우저, 회전
✅ 쿠키 — 세션 내에서 유지
✅ 지연 — 요청 간 2-5초
✅ IP 회전 — 3-10 요청 후 (사이트에 따라 다름)