블로그로 돌아가기

2026년 Mercado Libre 파싱: 파서가 잘못된 지역의 가격을 수집하는 이유

Mercado Libre는 배송 지역을 설정하지 않은 모든 사용자에게 기본 인덱스를 제공하고, 이를 기준으로 가격, 무료 배송 및 바이박스의 승자를 계산합니다. 공개 API 엔드포인트는 403 PolicyAgent로 응답하며, 쇼핑몰은 자체 장치 검사를 수행합니다. 검증된 사실을 바탕으로 Mercado Libre의 일곱 개 쇼핑몰에서 데이터를 올바르게 수집하는 방법과 이를 위해 필요한 프록시에 대해 설명합니다.

📅2026년 9월 12일
2026년 Mercado Libre 파싱: 파서가 잘못된 지역의 가격을 수집하는 이유

당신은 Mercado Libre에서 40,000개의 카드 정보를 추출하고 아르헨티나의 평균 가격을 계산하여 보고서를 제출했습니다. 문제는 이것이 아르헨티나의 가격이 아니라는 것입니다. 이는 1430 우편번호에 대한 가격으로, 플랫폼은 배송지를 지정하지 않은 모든 사용자에게 기본적으로 이 지역을 설정합니다.

Mercado Libre는 라틴 아메리카 18개국에서 운영되며, 2025년 그룹 매출은 289억 달러에 달하고, 회사에는 123,670명의 직원이 있습니다. e-commerce 분석가에게 이는 이 지역의 주요 데이터 출처이자 동시에 가장 과소평가된 함정입니다: 플랫폼은 요청이 어디에서 왔는지, 세션이 어떤 배송 지역을 보고 있는지에 따라 다양한 가격, 다양한 배송 및 다양한 구매 박스의 승자를 제공합니다. 무엇이 잘못되고 있는지, 그리고 어떻게 정확하게 수집할 수 있는지 살펴보겠습니다.

2026년의 변화: API가 사실상 폐쇄됨

불과 몇 년 전만 해도 "Mercado Libre 파싱"은 공개 API로 해결되었습니다: GET api.mercadolibre.com/sites/MLA/search?q=iphone는 인증 없이 결과를 반환했습니다. 오늘날은 그렇지 않습니다.

2026년 9월 12일, 일반 서버 IP로 토큰 없이 확인한 결과:

  • /sites — HTTP 403, 본문 {"code":"PA_UNAUTHORIZED_RESULT_FROM_POLICIES","blocked_by":"PolicyAgent","message":"At least one policy returned UNAUTHORIZED."}
  • /sites/MLA/search?q=iphone&limit=1 — HTTP 403, {"message":"forbidden","error":"forbidden"}
  • /items/{id} — HTTP 403, 동일한 PolicyAgent

문제는 토큰의 부재뿐만이 아닙니다. 판매자와 통합자는 공개적인 불만에서 유효한 access 토큰을 가진 경우에도 같은 상황을 설명합니다: /users/me와 주문은 정상적으로 응답하지만, 카탈로그 및 등급 엔드포인트는 blocked_by: PolicyAgent를 반환합니다. API 접근 정책은 특정 엔드포인트에 대해 점진적으로 강화되고 있으며, 문서는 이를 따라가지 못하고 있습니다.

동시에 플랫폼은 공식 API에서 여전히 살아남는 사람들을 위한 두 가지 기술적 마감일이 있습니다:

  • 2026년 8월 30일부터 애플리케이션은 분리되어야 합니다: Mercado Libre용 별도의 애플리케이션과 Mercado Pago용 별도의 애플리케이션이 필요합니다. GET applications/$APP_ID를 통해 확인됩니다 — scopes에 urn:mp:... 유형의 권한이 남아 있다면 애플리케이션을 재등록해야 하며, 그렇지 않으면 Mercado Libre API에 대한 접근을 잃게 됩니다;
  • 쿼리 매개변수에 access 토큰을 전달하는 것은 안전하지 않은 것으로 간주됩니다: 이러한 요청은 플랫폼이 301 응답으로 거부하기 시작할 것입니다. 토큰은 오직 Authorization: Bearer 헤더에서만 전송되어야 합니다.

실질적인 결론은 간단합니다: 2026년의 공식 API는 자신의 계정으로 작업하는 판매자를 위한 채널이지 시장 분석 도구가 아닙니다. 경쟁자 및 지역 가격 모니터링이 목표라면, 공개 전시장에서 작업해야 합니다. 특정 작업에 적합한 것을 선택하는 방법에 대해서는 공식 API, 준비된 데이터 세트 또는 자체 파서에서 다루었습니다.

하나의 웹사이트 대신 일곱 개의 전시

Mercado Libre는 국가별 필터가 있는 하나의 카탈로그가 아니라, 각기 다른 도메인, 통화 및 상품 제안을 가진 독립적인 플랫폼의 집합입니다. API에서는 이를 site_id라고 부릅니다:

  • MLA — 아르헨티나 (mercadolibre.com.ar, ARS)
  • MLB — 브라질 (mercadolivre.com.br, BRL)
  • MLM — 멕시코 (mercadolibre.com.mx, MXN)
  • MLC — 칠레, MCO — 콜롬비아, MLU — 우루과이, MPE — 페루, MLV — 베네수엘라

MLA와 MLB의 동일한 품목은 두 개의 다른 카드, 두 개의 다른 판매자, 두 개의 다른 물류 체계입니다. 이들을 "정면"으로 비교하는 것은 무의미합니다: 통화 및 배송 조건에 대한 정규화가 필요합니다. 참고로, 통화에 대한 규칙은 플랫폼이 HTML에서 직접 제공합니다: 아르헨티나의 경우 "currency_id":"ARS", "decimal_separator":",", "thousands_separator":".", "time_zone":"GMT-03:00"입니다. 가격을 점으로 나누는 정규 표현식을 사용하는 파서는 라틴 아메리카 전시장에서 천 번 잘못됩니다.

주요 사항: 가격과 배송은 수신자 지역에서 계산됩니다

다음은 주소 없이 요청할 때 listado.mercadolibre.com.ar 결과 페이지에 직접 내장된 부분입니다:

"location_info":{"zipcode":"1430","inferred_zipcode":false,"default_zipcode":true,"user_zone":"X19"}

이것은 다음과 같이 읽힙니다: 1430 우편번호는 당신의 IP에서 추출되지 않았습니다 (inferred_zipcode: false), 이는 기본값입니다 (default_zipcode: true). 상단에는 "Enviar a Capital Federal"이라는 문구가 표시되어 있으며, 이는 플랫폼이 당신이 부에노스아이레스 수도권에 있다고 조용히 결정했음을 의미하며, 이후 모든 계산은 이를 기준으로 진행됩니다.

그녀는 많은 것을 계산합니다. 동일한 HTML에는 지역에 연결된 배송 패널이 포함되어 있습니다: same_day_free_shipping는 "Llega gratis hoy"라는 텍스트와 함께 제공되며, 아이콘 vpp_full_icon은 "Enviado por FULL" (플랫폼 창고에서 발송된 상품)을 나타냅니다. "iphone" 요청에 대한 한 페이지에서 무료 배송 언급이 96개 발견되었습니다. 또한 buy_box 블록의 "Otra opción de compra"는 어떤 판매자가 카드를 이길지를 결정하는 데 가격과 배송 속도가 포함됩니다.

결론: 배송 지역을 한 번도 설정하지 않은 파서는 "아르헨티나 시장"이 아니라 한 도시의 샘플을 수집합니다. 천 킬로미터 떨어진 대도시의 국가 보고서는 결함이 있으며, 이는 전혀 드러나지 않습니다 — 숫자는 그럴듯하게 보이지만, 실제로는 잘못된 질문에 대한 응답입니다.

입구에서의 차단: /gz/account-verification

두 번째 놀라움은 전송 수준에서 기다리고 있습니다. listado.mercadolibre.com.ar/iphone에 대한 요청은 즉시 결과를 반환하지 않습니다: HTTP 302가 /gz/account-verification?go=...&tid=...로 전송됩니다 — 자체 장치 확인 페이지입니다. 이는 Cloudflare도 아니고 DataDome도 아닙니다: 차단 코드에는 reCAPTCHA, Turnstile 또는 외부 봇 방지 마커가 없지만, 장치 메커니즘에 대한 수십 개의 호출이 포함되어 있습니다. 페이지는 약 41KB이며, JavaScript로 구성되어 있으며, 스크립트 없이 아무것도 표시하지 않습니다.

검사 중 행동은 매우 인상적이었습니다. 깨끗한 서버 IP에서 첫 번째 요청은 차단을 통과했습니다: 실제 결과가 2,425,906바이트로 도착했습니다 — 50개의 ui-search-layout 블록과 120개의 가격 andes-money-amount__fraction 노드가 포함되어 있으며, 모두 서버에서 렌더링되었습니다. 동일한 주소에서 반복 요청은 /gz/account-verification에 부딪혀 더 이상 진행되지 않았습니다. 브라질 및 멕시코 전시장은 동일한 IP에서 전혀 통과하지 못했습니다.

이는 전형적인 "평판" 메커니즘입니다: 주소는 작은 신뢰 크레딧을 얻고, 몇 번의 요청으로 이를 소모한 후 차단됩니다. 단일 테스트는 아무것도 증명하지 않으며 — 중요한 것은 데이터 센터 풀에서 지속적인 접근이 없고, 행동이 국가마다 다르다는 것입니다.

응답 헤더의 또 다른 세부사항: 플랫폼은 _d2id (1년 유효한 장치 식별자, x-request-device-id에 중복됨) 및 _mldataSessionIdMax-Age=1800와 함께 설정합니다. 30분 — 이는 세션의 자연스러운 길이이며, IP 유지 관리를 위해 조정해야 합니다.

robots.txt에서의 지침

수집을 시작하기 전에 플랫폼의 규칙을 읽어야 합니다. 두 전시(아르헨티나 및 브라질)의 robots.txt 상단 블록은 동일하며 매우 명확합니다:

  • AI 크롤러에 대한 전체 금지 (Disallow: /): Amazonbot, GPTBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, Perplexity-User;
  • 소셜 미디어 미리보기 봇에 대한 허용: FacebookExternalHit, FacebookBot, Twitterbot, LinkedInBot;
  • Bingbot에 대한 Crawl-delay: 5 및 긴 목록의 금지된 섹션: /gz/cart/, /gz/checkout/, /perfil/vendedor/, /perfil/comprador/, /navigation/, /noindex/ 등.

이로부터 두 가지 실용적인 사항이 도출됩니다. 첫째: 장바구니, 체크아웃 및 사용자 프로필은 명백히 차단되어 있으며 — 기술적으로나 법적으로 접근할 필요가 없습니다. 둘째: 검색 봇을 위한 Crawl-delay: 5는 플랫폼이 자동화에서 기대하는 속도의 정직한 지표입니다. 한 주소에서 요청 간 5초는 합리적인 출발점이며, 공허한 숫자가 아닙니다.

정확하게 수집하는 방법: 행동 순서

  1. 수집 매트릭스를 고정하십시오. "Mercado Libre"가 아니라 "국가 × 배송 지역" 쌍 목록입니다. 아르헨티나의 경우, 예를 들어, Capital Federal, Córdoba, Rosario, Mendoza; 브라질의 경우 — São Paulo, Rio, Belo Horizonte, Recife입니다. 지역을 지정하지 않은 가격은 의미가 없으며, 이는 코드의 첫 번째 줄 이전에 결정됩니다.
  2. 필요한 국가의 거주 IP를 가져오십시오. 브라질 및 멕시코 전시장에서 서버 주소는 전혀 차단을 통과하지 못했으며, 아르헨티나에서는 첫 번째 요청 후 소진되었습니다. 로컬 거주 주소는 접근 및 신뢰성 문제를 해결합니다: 플랫폼은 본래 지역 구매자에게 보여줄 것과 동일한 것을 보여줍니다.
  3. 세션 동안 IP를 유지하십시오. 세션 쿠키는 30분 동안 유효합니다 — 각 요청에서 회전하면 쿠키와 선택한 지역이 모두 초기화되며, 다시 기본 인덱스를 받게 됩니다. 한 지역에 대해 10-30분 동안 고정된 세션을 유지하고, 그 이후에 변경합니다. 창 길이를 선택하는 방법에 대해서는 스티키 세션 가이드에서 다루었습니다.
  4. 순수 HTTP 클라이언트가 아닌 브라우저 엔진을 사용하십시오. /gz/account-verification 페이지는 전적으로 JavaScript로 구성되어 있습니다: 스크립트를 실행하지 않으면 차단 상태에 남게 됩니다. Playwright 또는 단계 간 상태를 유지하는 유사한 도구를 사용하십시오.
  5. 배송 지역을 명시적으로 설정하십시오. 링크는 /addresses/v3/navigation/hub로 연결되며; 주소를 설정한 후 상태는 세션 쿠키에 저장됩니다. 이 절차는 세션당 한 번 수행하고 각 카드마다 수행하지 마십시오.
  6. location_info를 체크섬으로 만드십시오. 저장된 각 페이지에서 zipcode가 목표와 일치하는지, default_zipcodefalse가 되었는지 확인하십시오. 플래그가 여전히 true로 남아 있다면, 해당 행은 데이터 전시로 기록하지 않습니다. 이 검사는 조용한 결함의 대부분을 차단합니다.
  7. 서버 HTML에서 가격을 가져오십시오. 가격 및 배송 패널은 이미 서버에서 렌더링되었습니다 — 내부 JSON 엔드포인트를 추적할 필요가 없습니다. 가격 옆에 zipcode, user_zone, currency_id 및 타임스탬프를 함께 저장하십시오: 이들 없이는 숫자를 검증할 수 없습니다.
  8. 속도를 유지하십시오. 플랫폼에서의 기준은 한 주소에서 요청 간 5초입니다. 속도가 필요하다면, 한 IP에서의 빈도를 늘리기보다는 주소 풀을 확장하십시오: 바로 한 주소에서의 급증이 차단을 초래합니다.

늦게 알게 되는 잠재적 문제

기본 지역의 조용한 결함. 가장 비싼 실수는 예외 없이 발생합니다. 데이터가 수집되고 보고서가 작성되며 가격 결정이 이루어지지만 — 분기 후에야 모든 분석이 상파울루의 한 지역을 설명하고 있다는 사실이 밝혀집니다.

페이지의 무게. 한 페이지의 결과는 2.4MB입니다. 하루에 네 개국과 네 개 지역에서 천 페이지를 수집하면, 이는 한 달에 수십 기가바이트의 트래픽이 됩니다. 거주 요금제로 기가바이트당 요금을 지불하는 경우, 이는 주요 비용 항목이므로, 브라우저 엔진에서 이미지 및 글꼴 로드를 즉시 비활성화하는 것이 좋습니다: 가격은 HTML에 있으며, 파서에 대한 이미지는 순수한 과소비입니다.

정규화 없는 국가 비교. ARS, BRL, MXN 및 다양한 구분 기호. 수집 날짜의 환율에 따라 하나의 통화로 변환하고 원래 가격과 통화를 별도로 저장하십시오. 그렇지 않으면 나중에 다시 계산할 수 없습니다.

공식 API에 대한 의존. 통합이 여전히 API에 있다면, 2026년 8월 30일부터의 별도 애플리케이션 요구 사항과 쿼리에서 헤더로의 토큰 이동을 염두에 두십시오. API 접근의 조용한 상실은 코드의 버그와 똑같이 보입니다.

이 작업에 필요한 프록시

거주용 — 가격 및 배송 수집을 위한 작업 옵션입니다. 수집할 전시의 국가와 배송 지역을 확인할 수 있는 주소가 필요합니다: 이렇게 데이터를 수집하고 신뢰성을 유지할 수 있습니다. 거주용 프록시는 세션 유지 기능을 통해 두 가지 요구 사항을 동시에 충족합니다.

모바일 — 차단이 특히 고집스러운 경우에 사용됩니다. 라틴 아메리카는 모바일 트래픽 비율이 높은 지역이며, 이동통신 사업자의 주소는 플랫폼에 매우 일반적으로 보입니다. 좁지만 중요한 샘플에서 정당화되며, 대량 수집에는 적합하지 않습니다.

데이터 센터 프록시 — 탐색 및 서비스 작업을 위한 것입니다: robots.txt를 읽고, 페이지 구조를 가져오고, 도메인 접근성을 확인합니다. 정기적인 가격 수집에는 자원이 부족하다는 것이 확인되었습니다.

요약

2026년의 Mercado Libre는 데이터를 비개인화된 형태로 제공하지 않습니다. 공식 API는 PolicyAgent 정책으로 폐쇄되었고, 전시는 자체 장치 확인으로 맞이하며, 주요 숫자인 가격과 배송은 기본적으로 설정된 수신자 지역에서 계산됩니다. 올바른 파서는 여기서 잘못된 파서와의 차별점이 우회 기술이 아니라 규율입니다: 국가, 지역, 통화 및 location_info가 각 행 옆에 있어야 합니다. 나머지는 요청이 어디에서 오는지에 관한 문제입니다.