بازگشت به وبلاگ

پارسیس Mercado Libre در ۲۰۲۶: چرا پارسر قیمت‌ها را از منطقه نادرست جمع‌آوری می‌کند

مرکادو لیبره برای همه کسانی که منطقه تحویل را مشخص نکرده‌اند، یک شاخص پیش‌فرض قرار می‌دهد و از آن قیمت، تحویل رایگان و برنده باکس خرید را محاسبه می‌کند. نقاط پایانی عمومی API پاسخ 403 PolicyAgent را می‌دهند و ویترین با بررسی دستگاه خود مواجه می‌شود. ما بر اساس حقایق معتبر بررسی می‌کنیم که چگونه داده‌ها را به درستی از هفت ویترین مرکادو لیبره جمع‌آوری کنیم و چه پروکسی‌هایی برای این کار نیاز است.

📅۲۱ شهریور ۱۴۰۵
پارسیس Mercado Libre در ۲۰۲۶: چرا پارسر قیمت‌ها را از منطقه نادرست جمع‌آوری می‌کند

شما ۴۰ هزار کارت Mercado Libre را بارگذاری کرده‌اید، میانگین قیمت را در آرژانتین محاسبه کرده‌اید و گزارش را ارائه داده‌اید. مشکل این است که این قیمت‌ها مربوط به آرژانتین نیستند. این قیمت‌ها برای کد پستی ۱۴۳۰ هستند — منطقه پیش‌فرضی که پلتفرم به همه کسانی که نگفته‌اند کجا باید ارسال شود، اختصاص می‌دهد.

Mercado Libre در ۱۸ کشور آمریکای لاتین فعالیت می‌کند، درآمد گروه در سال ۲۰۲۵ به ۲۸.۹ میلیارد دلار رسید و در این شرکت ۱۲۳۶۷۰ کارمند مشغول به کار هستند. برای تحلیل‌های تجارت الکترونیک، این منبع اصلی داده‌ها در منطقه است و در عین حال، یک تله بسیار undervalued: پلتفرم قیمت‌های مختلف، تحویل‌های متفاوت و برنده‌های مختلف باکس خرید را بسته به اینکه درخواست از کجا آمده و چه منطقه‌ای را جلسه مشاهده می‌کند، ارائه می‌دهد. بیایید بررسی کنیم که چه چیزی دقیقاً خراب می‌شود و چگونه به درستی جمع‌آوری کنیم.

چه چیزی در سال ۲۰۲۶ تغییر کرده است: API عملاً بسته شده است

چند سال پیش «پارس کردن Mercado Libre» از طریق API عمومی حل می‌شد: GET api.mercadolibre.com/sites/MLA/search?q=iphone بدون نیاز به احراز هویت خروجی می‌داد. امروز دیگر اینطور نیست.

بررسی در ۱۲ سپتامبر ۲۰۲۶ با 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

و نکته این است که مشکل فقط در عدم وجود توکن نیست. فروشندگان و یکپارچه‌سازان در شکایات عمومی همان تصویر را با توکن دسترسی معتبر توصیف می‌کنند: /users/me و سفارشات به درستی پاسخ می‌دهند، در حالی که نقاط انتهایی کاتالوگ و رتبه‌بندی blocked_by: PolicyAgent را برمی‌گردانند. سیاست دسترسی به API به طور نقطه‌ای و بر اساس نقاط انتهایی سخت‌تر می‌شود و مستندات به این تغییرات نمی‌رسند.

به طور همزمان، پلتفرم دو مهلت فنی برای کسانی که هنوز بر روی API رسمی زندگی می‌کنند، دارد:

  • از ۳۰ اوت ۲۰۲۶ برنامه‌ها باید جدا شوند: یک برنامه جداگانه برای Mercado Libre و یک برنامه جداگانه برای Mercado Pago. این موضوع از طریق GET applications/$APP_ID بررسی می‌شود — اگر در scopes حقوقی از نوع urn:mp:... باقی مانده باشد، برنامه باید دوباره تنظیم شود، در غیر این صورت دسترسی به API Mercado Libre را از دست می‌دهد؛
  • انتقال توکن دسترسی در پارامترهای query به عنوان ناامن شناخته شده است: چنین درخواست‌هایی پلتفرم با پاسخ ۳۰۱ رد خواهد کرد. توکن باید فقط در هدر Authorization: Bearer ارسال شود.

نتیجه عملی ساده است: 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" است. پارسرهایی که قیمت را با استفاده از عبارات منظم بر اساس نقطه برش می‌دهند، در ویترین‌های آمریکای لاتین هزار بار اشتباه می‌کنند.

نکته اصلی: قیمت و تحویل از منطقه دریافت‌کننده محاسبه می‌شود

این یک بخش است که مستقیماً در HTML صفحه خروجی listado.mercadolibre.com.ar هنگام درخواست بدون آدرس گنجانده شده است:

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

این به این صورت خوانده می‌شود: کد ۱۴۳۰، که از 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» تعداد ۹۶ مورد از این اشاره‌ها به تحویل رایگان وجود داشت. همچنین، بلوک 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 یا نشانه‌های ضد ربات‌های خارجی وجود ندارد، بلکه ده‌ها درخواست به مکانیک دستگاه وجود دارد. صفحه حدود ۴۱ کیلوبایت حجم دارد، بر روی JavaScript ساخته شده و بدون آن هیچ چیزی نمایش نمی‌دهد.

رفتار در هنگام بررسی نشان‌دهنده است. اولین درخواست با IP سرور خالص از مانع عبور کرد: خروجی واقعی به حجم ۲۴۲۵۹۰۶ بایت — ۵۰ بلوک ui-search-layout و ۱۲۰ گره قیمت andes-money-amount__fraction، همه بر روی سرور رندر شده است. درخواست‌های تکراری از همان آدرس دیگر به /gz/account-verification برخورد کردند و دیگر عبور نکردند. ویترین‌های برزیلی و مکزیکی از همین IP اصلاً اجازه ندادند.

این یک مکانیک «شهرت» معمولی است: آدرس یک اعتبار کوچک اعتماد دریافت می‌کند، آن را در چند درخواست خرج می‌کند و بسته می‌شود. هیچ تست واحدی در اینجا هیچ چیزی را ثابت نمی‌کند — مهم این است که دسترسی پایدار از استخر دیتاسنتر وجود ندارد و رفتار از کشوری به کشور دیگر متفاوت است.

یک جزئیات دیگر از هدرهای پاسخ: پلتفرم _d2id (شناسه دستگاه با مدت اعتبار یک سال، که در x-request-device-id نیز تکرار می‌شود) و _mldataSessionId با Max-Age=1800 را قرار می‌دهد. سی دقیقه — این همان طول طبیعی جلسه است که باید برای حفظ IP تنظیم شود.

robots.txt چه می‌گوید

قبل از اینکه جمع‌آوری را شروع کنید، بهتر است قوانین پلتفرم را بخوانید. در robots.txt هر دو ویترین (آرژانتینی و برزیلی) بلوک بالایی یکسان و کاملاً واضح است:

  • ممنوعیت کامل (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 برای ربات جستجو — این یک راهنمای صادقانه در مورد سرعتی است که پلتفرم از اتوماسیون انتظار دارد. پنج ثانیه برای درخواست از یک آدرس — نقطه شروع معقولی است، نه عددی از هوا.

چگونه به درستی جمع‌آوری کنیم: ترتیب اقدامات

  1. ماتریس جمع‌آوری را ثابت کنید. نه «Mercado Libre»، بلکه لیست جفت‌های «کشور × منطقه تحویل». برای آرژانتین این، به عنوان مثال، پایتخت فدرال، کوردوبا، روساریو، مندوزا است؛ برای برزیل — سائو پائولو، ریو، بلو هوریزونته، رسیفه. قیمت بدون مشخص کردن منطقه بی‌معنا است و این تصمیم قبل از اولین خط کد اتخاذ می‌شود.
  2. یک IP مقیم از کشور مورد نظر بگیرید. آدرس‌های سروری در ویترین‌های برزیلی و مکزیکی اصلاً از مانع عبور نکردند، در حالی که در آرژانتینی بعد از اولین درخواست خسته شدند. آدرس محلی مسکونی هم مسئله دسترسی و هم مسئله اعتبار را حل می‌کند: پلتفرم در ابتدا همان چیزی را به شما نشان می‌دهد که به خریدار محلی نشان می‌دهد.
  3. IP را برای تمام جلسه نگه دارید. کوکی جلسه ۳۰ دقیقه زندگی می‌کند — چرخش در هر درخواست آن و منطقه انتخاب شده را بازنشانی می‌کند و شما دوباره کد پیش‌فرض را دریافت می‌کنید. یک جلسه چسبنده به مدت ۱۰–۳۰ دقیقه برای یک منطقه، سپس تغییر. چگونه طول پنجره را انتخاب کنیم، ما در راهنمای جلسات چسبنده بررسی کرده‌ایم.
  4. با موتور مرورگر حرکت کنید، نه با کلاینت HTTP خالی. صفحه /gz/account-verification کاملاً بر روی JavaScript ساخته شده است: بدون اجرای اسکریپت‌ها شما برای همیشه در مانع خواهید ماند. Playwright یا مشابهی با حفظ وضعیت بین مراحل.
  5. به وضوح منطقه تحویل را مشخص کنید. لینک به /addresses/v3/navigation/hub می‌رود؛ پس از تنظیم آدرس، وضعیت در کوکی جلسه زندگی می‌کند. این روند را یک بار در هر جلسه اجرا کنید، نه برای هر کارت.
  6. کنترل location_info را به عنوان چک‌سوم انجام دهید. در هر صفحه ذخیره شده بررسی کنید که zipcode با هدف مطابقت دارد و default_zipcode به false تبدیل شده است. اگر پرچم هنوز true باقی مانده باشد — خط را در ویترین داده‌ها نمی‌نویسیم، زیرا برای آن منطقه جمع‌آوری شده است. فقط این بررسی بخش عمده‌ای از نقص‌های خاموش را حذف می‌کند.
  7. قیمت‌ها را از HTML سرور بگیرید. قیمت و برچسب‌های تحویل قبلاً روی سرور رندر شده‌اند — نیازی به دنبال کردن نقاط انتهایی JSON داخلی نیست. قیمت را در کنار خود zipcode، user_zone، currency_id و نشان زمان جمع‌آوری کنید: بدون آنها عدد غیرقابل تأیید است.
  8. سرعت را حفظ کنید. راهنمایی از خود پلتفرم — پنج ثانیه بین درخواست‌ها از یک آدرس. اگر به سرعت نیاز دارید — استخر آدرس‌ها را گسترش دهید، نه فرکانس از یک IP: دقیقاً افزایش از یک آدرس است که مانع را می‌بندد.

دام‌های پنهانی که دیر متوجه می‌شوند

نقص خاموش در منطقه پیش‌فرض. گران‌ترین اشتباه با استثنا نمی‌افتد. داده‌ها جمع‌آوری می‌شوند، گزارش ساخته می‌شود، تصمیم‌گیری در مورد قیمت‌گذاری انجام می‌شود — و فقط پس از یک فصل مشخص می‌شود که تمام تحلیل‌ها در مورد برزیل یک منطقه از سائو پائولو را توصیف می‌کنند.

حجم صفحات. یک صفحه خروجی — ۲.۴ مگابایت. هزار صفحه در روز در چهار کشور و چهار منطقه — این ده‌ها گیگابایت ترافیک در ماه است. در تعرفه مقیم با پرداخت به ازای گیگابایت، این بخش اصلی هزینه‌ها است، بنابراین بهتر است بلافاصله بارگذاری تصاویر و فونت‌ها را در موتور مرورگر خاموش کنید: قیمت‌ها در HTML قرار دارند، تصاویر برای پارسر — صرفاً هدر رفت.

مقایسه کشورها بدون نرمال‌سازی. ARS، BRL، MXN و جداکننده‌های مختلف. آنها را به یک ارز بر اساس نرخ در تاریخ جمع‌آوری تبدیل کنید و قیمت و ارز اولیه را جداگانه ذخیره کنید، در غیر این صورت دیگر نمی‌توانید به صورت معکوس محاسبه کنید.

تکیه بر API رسمی. اگر ادغام هنوز بر روی API است، نیاز به برنامه‌های جداگانه از ۳۰ اوت ۲۰۲۶ و انتقال توکن از query به هدر را در نظر داشته باشید. از دست دادن خاموش دسترسی به API دقیقاً به همین شکل به نظر می‌رسد، مانند یک باگ در کد شما.

چه پروکسی‌هایی برای این کار لازم است

مقیم — گزینه‌ای کارآمد برای جمع‌آوری قیمت‌ها و تحویل. به یک آدرس دقیقاً از آن کشور نیاز دارید که ویترین آن را می‌گیرید و ترجیحاً آن منطقه‌ای که منطقه تحویل را بررسی می‌کنید: اینگونه داده‌ها به دست می‌آید و معتبر باقی می‌ماند. پروکسی‌های مقیم با حفظ جلسه هر دو نیاز را به طور همزمان برآورده می‌کنند.

موبایل — در جایی که مانع به ویژه سرسخت است. آمریکای لاتین منطقه‌ای با سهم بالای ترافیک موبایل است و آدرس اپراتور تلفن همراه برای پلتفرم به حداکثر حد معمولی به نظر می‌رسد. در برش‌های باریک اما حیاتی توجیه‌پذیر است، نه در بارگذاری انبوه.

پروکسی‌های دیتاسنتر — برای شناسایی و وظایف اداری: خواندن robots.txt، بررسی ساختار صفحه، بررسی دسترسی به دامنه. برای جمع‌آوری منظم قیمت‌ها، همانطور که بررسی نشان داد، منابع کافی نیست.

خلاصه

Mercado Libre در سال ۲۰۲۶ داده‌ها را به صورت ناشناس ارائه نمی‌دهد. API رسمی با سیاست‌های PolicyAgent بسته شده است، ویترین با بررسی دستگاه خود مواجه می‌شود و عدد اصلی — قیمت با تحویل — از منطقه دریافت‌کننده محاسبه می‌شود که پلتفرم به طور پیش‌فرض اگر مشخص نشود، ارائه می‌دهد. پارسر درست در اینجا با پارسر نادرست نه به ترفند دور زدن، بلکه به انضباط متفاوت است: کشور، منطقه، ارز و location_info در کنار هر خط. همه چیز دیگر به این بستگی دارد که درخواست‌های شما از کجا می‌آید.