Wildberries 또는 Ozon에서 파서를 실행하고 프록시를 설정했는데, 한 시간 후에 한계에 부딪혀 수많은 IP가 차단되었다면 — 단지 몇 천 개의 카드만 수집했는데도? 문제는 거의 항상 하나입니다: URL 매개변수. 필터, 정렬, 페이지네이션 및 UTM 태그는 하나의 카탈로그를 수만 개의 기술적 중복으로 변환하며, 파서는 고유한 데이터를 수집하는 대신 이 모든 것을 정직하게 탐색합니다.
URL 매개변수로 인한 페이지 중복이란?
페이지 중복이란 기술적으로 다른 URL이지만 내용은 동일하거나 거의 동일한 경우를 말합니다. 고전적인 예로, Wildberries의 드레스 카탈로그는 /catalog/zhenshchinam/odezhda/platya 주소에서 접근할 수 있지만, 가격으로 정렬된 동일한 결과는 /catalog/zhenshchinam/odezhda/platya?sort=price로 변환됩니다. 크기, 브랜드, 색상, 가격 범위에 대한 필터를 추가하면 수백 개의 매개변수 조합이 생성되어 각 조합은 형식적으로 고유한 URL이 됩니다.
일반 사용자에게는 편리합니다: 필터를 선택하면 원하는 상품을 볼 수 있습니다. 그러나 링크를 패턴에 따라 탐색하거나 페이지네이션을 따르는 파서에게는 각 조합이 로드하고 파싱하고 저장해야 할 개별 페이지가 됩니다. 규칙을 설정하지 않으면 로봇은 필터의 무한한 소용돌이에 빠질 것입니다: 가격 정렬 → 브랜드 필터 → 크기 필터 → 다시 정렬, 하지만 다른 순서로. 고유한 URL의 수는 기하급수적으로 증가하지만 유용한 데이터는 늘어나지 않습니다 — 동일한 상품 카드가 단지 다른 순서나 축소된 세트로 나타나는 것뿐입니다.
별도의 중복 카테고리는 UTM 태그 및 세션 매개변수(utm_source, clid, _openstat)입니다. 이들은 페이지의 내용에 전혀 영향을 미치지 않지만, 파서가 다른 페이지에서 링크를 그대로 수집하면 동일한 상품 카드를 주소의 다른 꼬리와 함께 여러 번 가져오게 됩니다.
파서에 특히 중요한 이유
SEO 전문가에게 페이지 중복은 인덱싱 문제와 가중치의 흐림입니다. 가격 모니터링이나 상품 수집을 위해 마켓플레이스를 파싱하는 사람에게 중복은 돈과 시간의 직접적인 손실이며, 세 가지 방향에서 동시에 발생합니다.
첫째, 중복 페이지를 로드하는 것은 프록시를 통한 요청입니다. 유료 회전 프록시를 사용하는 경우(그리고 Wildberries 및 Ozon의 보호를 우회하기 위해서는 필수적입니다), 쓸모없는 요청에 대해서도 트래픽을 지불해야 합니다. 수만 개의 카드 규모에서 중복 요청이 30-40% 증가하면 비용이 상당히 증가합니다.
둘째, 수집 속도가 대폭 감소합니다. 파서가 초당 10개의 요청을 처리할 수 있는 경우, 그 중 1/3이 동일한 데이터가 있는 페이지로 가면, 실제 고유 콘텐츠 수집 속도는 초당 6-7개의 카드로 떨어집니다. 대규모 카탈로그에서는 한 시간과 반나절의 차이를 만들어냅니다.
셋째, 가장 아픈 점은 IP 차단 위험이 요청 수에 비례하여 증가한다는 것입니다. 마켓플레이스의 안티봇 시스템은 하나의 주소에서의 요청 빈도를 계산합니다. 목표 데이터를 수집하는 데 필요한 요청보다 세 배 더 많은 요청을 하면, 프록시의 "신뢰의 신용"을 세 배 더 빨리 소진하게 되어 CAPTCHA 또는 차단에 걸리게 됩니다.
실제 사례: Wildberries, Ozon, Avito
Wildberries에서는 동일한 카탈로그가 ?sort=popular, ?sort=rate, ?sort=newly와 같은 매개변수로 제공될 수 있으며, 필터 fbrand, fsize, priceU도 추가됩니다. 파서가 "상품 카드 → 유사 상품 → 다시 상품 카드"로 링크를 수집하면, 이 모든 매개변수의 조합으로 URL을 쉽게 생성할 수 있으며, 상품 세트는 90% 겹칩니다.
Ozon에서도 유사한 상황이 발생하며, ?sorting= 매개변수와 상품 특성에 대한 필터가 있습니다 — 각 카테고리마다 고유한 필터 세트가 있어 조합이 더 많습니다(재료, 용량, 색상 등).
Avito에서는 지리적 위치 및 검색 반경 매개변수(?radius=, ?district=)가 별도의 문제입니다. 동일한 광고가 이러한 매개변수의 다양한 조합으로 검색 결과에 "떠오를" 수 있으며, 순진한 파서는 이를 서로 다른 발견으로 간주하여 중복된 레코드로 데이터베이스를 부풀리게 됩니다.
중복이 프록시 예산과 시간을 어떻게 소모하는가
가상의 예를 들어 계산해 보겠습니다. 카테고리에 500개의 고유 상품이 있다고 가정해 보겠습니다. 그러나 8개의 정렬 옵션과 12개의 인기 필터 조합 때문에, URL 정규화 없이 파서는 500이 아닌 4000-5000 페이지를 탐색하게 됩니다. 만약 하나의 요청이 프록시를 통해 일정량의 트래픽 비용이 든다면, 단순한 탐색으로 인해 동일한 양의 고유 데이터를 얻기 위해 8-10배 더 많은 비용이 발생하게 됩니다.
더 나쁜 것은, 동일한 IP에서 유사한 URL에 대한 반복 요청이 안티봇 시스템의 전형적인 패턴이라는 것입니다. 요청의 빈도와 일관성이 높을수록 보호가 더 빨리 작동합니다. 결국, 중복이 요청 수를 증가시키고 → 프록시 풀에 대한 부하가 증가하고 → IP가 더 빨리 차단되고 → 더 자주 프록시를 변경하고 수집을 재시작해야 하므로 → 최종적으로 파싱의 시간과 비용이 더 증가합니다.
실제로는 이렇게 보입니다: 판매자가 Wildberries에서 200명의 경쟁자의 가격을 하루에 한 번 모니터링하고 싶지만, 정리되지 않은 URL로 인해 그의 스크립트는 2,000이 아닌 15,000개의 요청을 하여 프록시 풀의 한계에 도달하고, 저녁에는 아침 대신 불완전한 데이터를 받게 됩니다.
파서를 실행하기 전에 중복을 어떻게 감지할 것인가
수집을 확장하기 전에, 목표 사이트의 URL 구조를 분석하는 데 한 시간을 투자하는 것이 좋습니다. 다음은 실용적인 행동 순서입니다:
- 브라우저에서 목표 카탈로그를 열고 필터와 정렬을 수동으로 반복하여 주소 표시줄에 어떤 매개변수가 나타나는지 기록합니다.
- 결과에 영향을 미치지 않는 매개변수를 추가할 때 페이지 내용이 변경되는지 확인합니다(예: UTM 태그) — 내용이 동일하다면, 이 매개변수는 수집 시 무시해야 합니다.
- 페이지의 소스 코드에서
rel="canonical"을 확인합니다 — 사이트는 종종 중복된 옵션에 대해 "기본"으로 간주되는 URL을 알려줍니다. - 100-200개의 URL로 구성된 작은 테스트 샘플을 수집하고 주요 매개변수에 따라 간단한 중복 제거를 수행하여 목록이 얼마나 줄어드는지 확인합니다.
- robots.txt를 확인합니다 — 때때로 거기에는 매개변수화된 URL에 대한 Disallow 지침이 이미 명시되어 있으며, 이는 어떤 매개변수가 "쓰레기"로 간주되는지에 대한 힌트입니다.
URL 정규화: 규칙 및 예시
정규화는 URL을 탐색하기 전에 단일한 정식 형태로 변환하는 것입니다. 기본 원칙은 "의미 있는" 매개변수(예: 페이지 번호 또는 카테고리)를 강조하고 "의미 없는" 매개변수(정렬, UTM, 세션 식별자)를 버리는 것입니다.
Wildberries와 유사한 카탈로그에 대한 정규화 규칙의 실용적인 예는 다음과 같습니다:
import urllib.parse as up
IGNORED_PARAMS = {"sort", "utm_source", "utm_medium", "utm_campaign", "clid", "_openstat"}
def normalize_url(url: str) -> str:
parsed = up.urlparse(url)
query = up.parse_qsl(parsed.query)
# 의미 있는 매개변수만 남기고 나머지는 버립니다
filtered = [(k, v) for k, v in query if k not in IGNORED_PARAMS]
filtered.sort() # 매개변수의 순서를 통일된 형태로 만듭니다
new_query = up.urlencode(filtered)
return up.urlunparse(parsed._replace(query=new_query))
정규화 후 동일한 목록의 모든 버전이 하나의 URL로 축소됩니다. 프록시를 통해 요청을 보내기 전에 파서는 이 정규화된 주소가 이미 등장했는지 확인합니다 — 만약 그렇다면, 이를 건너뜁니다. 이는 데이터의 완전성을 잃지 않고 요청 수를 줄이는 가장 저렴한 방법입니다.
간단한 경우에는 이 논리를 코드 없이도 구현할 수 있습니다 — 파싱 도구의 설정을 통해 "매개변수 무시"를 지정하고 목록을 나열하거나, 매개변수가 귀하의 작업에 의미 있는 정보를 전혀 포함하지 않는 경우 물음표 뒤의 URL 꼬리를 잘라내기 위한 정규 표현식을 설정할 수 있습니다.
매개변수를 무시하도록 파서 설정하기
마켓플레이스에서 데이터를 수집하기 위한 대부분의 솔루션 및 파싱 도구는 프로젝트 설정 수준에서 URL 매개변수 제외 규칙을 지원합니다. 다음은 우선적으로 확인하고 설정해야 할 사항입니다:
- 무시할 매개변수 목록. 분석 단계에서 발견된 모든 정렬, UTM 태그 및 세션 식별자를 여기에 추가합니다.
- 정규화된 URL 해시를 통한 중복 제거. 많은 파서가 이미 방문한 주소 목록을 저장합니다 — 비교는 원래 문자열이 아닌 정규화된 버전으로 이루어져야 합니다.
- 필터 탐색 깊이 제한. 카테고리의 품목을 수집하는 것이 목표라면, 정렬 및 필터 없이 하나의 "기본" 통과로 충분하며, 모든 조합을 재귀적으로 탐색할 필요는 없습니다.
- 필터보다 페이지네이션 우선. 사이트가 페이지별 탐색을 통해 전체 상품 목록을 제공하는 경우, 일반적으로 이것으로 충분합니다 — 동일한 목록을 필터를 적용하여 별도로 탐색하는 것은 과도합니다.
이러한 설정 후에는 요청 수가 일반적으로 3-6배 줄어들며, 이는 출처 사이트의 카탈로그가 얼마나 "매개변수화"되어 있는지에 따라 달라집니다.
파싱 확장에서 프록시의 역할
URL이 완벽하게 정규화된 후에도 Wildberries 또는 Ozon의 대규모 카탈로그를 파싱하려면 여러 IP 주소 간에 요청을 분산해야 합니다 — 그렇지 않으면 안티봇 보호가 하나의 출처에서 비정상적인 활동을 빠르게 추적합니다. 이때 작업에 적합한 프록시 유형을 올바르게 선택하는 것이 중요합니다.
상품 카드 수집 및 가격 모니터링을 위한 대규모 수집에서는 양과 속도가 합리적인 비용으로 중요한 경우, 일반적으로 데이터 센터 프록시가 충분합니다 — 이들은 더 빠르고 저렴하여 하루에 수백만 개의 요청을 처리하는 데 중요합니다. 그러나 사이트의 보호가 데이터 센터 IP 범위를 적극적으로 차단하는 경우, 일반 사용자처럼 보이는 주거용 프록시로 전환해야 하며, 이는 의심을 덜 받습니다.
특정 작업을 위해 — 예를 들어 특정 지역에서 모바일 장치로 특정 상품의 가격이 어떻게 표시되는지 확인하는 경우 — 모바일 프록시가 유용하며, 이는 이동통신 사업자를 통한 연결을 에뮬레이트하고 거의 차단되지 않습니다.
중요한 점은: 올바른 프록시 선택이 URL 정규화를 대체하지 않으며, 이를 보완한다는 것입니다. 중복을 정리하지 않으면 가장 품질 좋은 IP 풀도 더 빨리 소모됩니다. 먼저 쓸모없는 요청 수를 줄이고, 그 다음 남은 요청을 프록시 회전을 통해 확장하는 것이 최대 절약을 가져옵니다.
데이터 수집 시작 전 체크리스트
파서를 전투 규모로 실행하기 전에 짧은 확인 목록을 살펴보세요:
| 검사 항목 | 필요한 이유 |
|---|---|
| 정렬 및 필터 매개변수 목록이 확인됨 | 어떤 URL이 중복으로 간주될 수 있는지 이해하기 위해 |
| URL 정규화 규칙이 설정됨 | 중복을 하나의 정식 주소로 축소하기 위해 |
| 정규화된 URL 해시를 통한 중복 제거가 활성화됨 | 동일한 데이터의 반복 로드를 제외하기 위해 |
| 프록시 유형이 양과 보호의 공격성에 맞게 조정됨 | 차단 위험을 줄이고 수집 속도를 높이기 위해 |
| IP당 요청 한도가 여유 있게 설정됨 | 프록시 풀의 대량 차단을 피하기 위해 |
결론
URL의 필터, 정렬 및 서비스 매개변수는 단순한 기술적 세부사항이 아니라 마켓플레이스 파싱 시 쓸모없는 트래픽의 주요 원인 중 하나입니다. URL 정규화 없이 파서는 동일한 데이터를 얻기 위해 5-10배 더 많은 요청을 할 수 있으며, 이는 프록시 예산, 수집 속도 및 차단 위험에 직접적인 영향을 미칩니다.
해결책은 간단하게 표현되지만 준비 단계에서의 규율이 필요합니다: 목표 사이트의 URL 구조를 분석하고, 어떤 매개변수가 콘텐츠에 영향을 미치는지, 어떤 매개변수가 영향을 미치지 않는지 식별하고, 정규화된 주소에 따라 중복 제거를 설정한 후에만 프록시 회전을 통해 수집을 확장하세요. 가격 및 품목 모니터링이 Wildberries, Ozon 또는 Avito에서 안정적으로 이루어져야 한다면, 주거용 프록시로 시작하는 것이 좋습니다 — 이는 안티봇 시스템의 신뢰와 특정 작업에 대한 설정의 유연성 간의 최상의 균형을 제공합니다.