اگر شما قیمتهای رقبا را در Wildberries، Ozon یا Avito از طریق IMPORTXML در Google Sheets نظارت میکنید، دیر یا زود جدول شروع به نشان دادن خطاهای #N/A میکند، دادهها با تأخیر چند ساعته بهروزرسانی میشوند و گاهی اوقات اصلاً بهروزرسانی نمیشوند. این یک باگ نیست — این یک برخورد با محدودیتهای خود Google Sheets و حفاظت از وبسایتها در برابر درخواستهای انبوه از یک IP خاص است. در این مقاله بررسی میکنیم که چگونه میتوان فهمید که جدول منابع خود را تمام کرده است و چگونه میتوان بدون دردسر به یک پارسر شخصی با پروکسی منتقل شد.
IMPORTXML چگونه کار میکند و چرا از آن استفاده میشود
IMPORTXML — یک تابع داخلی Google Sheets است که دادهها را از صفحه وب با استفاده از درخواست XPath میگیرد و آنها را مستقیماً در سلول قرار میدهد. فرمولی به شکل =IMPORTXML("URL"; "//span[@class='price']") به شما این امکان را میدهد که بدون نوشتن حتی یک خط کد، قیمت یک محصول را از صفحه Wildberries یا Ozon استخراج کرده و آن را هر ساعت بهطور خودکار بهروزرسانی کنید.
برای فروشندگان و بازاریابان، این بهعنوان یک راهحل ایدهآل به نظر میرسد: نیازی به توسعهدهنده نیست، نیازی به سرور نیست، همه چیز مستقیماً در جدول آشنا کار میکند. یک فروشگاه کوچک با 20-30 محصول واقعاً میتواند سالها با یک IMPORTXML زندگی کند و مشکلات را نبیند. اما به محض اینکه تعداد SKUهای تحت نظارت به چند صد برسد و نیاز به بهروزرسانی هر ساعت باشد — اختلالات سیستماتیک آغاز میشود که با تنظیمات خود تابع دیگر نمیتوان آنها را حل کرد.
مشکل این است که همه درخواستهای IMPORTXML از سرورهای Google ارسال میشوند، نه از کامپیوتر شما. Google یک مجموعه محدود از IP-address برای چنین درخواستهایی دارد و بازارها به خوبی این دامنهها را میشناسند. وقتی تعداد درخواستها زیاد میشود، حفاظت وبسایت فعال میشود — و به جای قیمت در سلول، خطا یا مقدار خالی ظاهر میشود.
7 نشانه که IMPORTXML دیگر کار نمیکند
قبل از اینکه وقت خود را برای انتقال به یک راهحل پیچیدهتر صرف کنید، اطمینان حاصل کنید که مشکل واقعاً در محدودیتها است، نه در اشتباه تایپی در فرمول. در اینجا علائم خاصی وجود دارد که میتوان به آنها توجه کرد:
- خطاهای انبوه #N/A — به طور همزمان 30-50% از فرمولها متوقف میشوند، در حالی که دیروز همه چیز خوب بود و ساختار صفحات تغییر نکرده است.
- تأخیر در بهروزرسانی افزایش مییابد — قبلاً دادهها در 5-10 دقیقه بهروزرسانی میشدند، اکنون جدول 30-40 دقیقه "فکر میکند" یا بدون محاسبه دستی بهروزرسانی نمیشود.
- خطای "منبع در URL بیش از حد تماس گرفته شده است" — پیام مستقیم Google که شما به محدودیت داخلی در تماس با یک دامنه برخورد کردهاید.
- دادهها قدیمی میآیند — قیمت در جدول با قیمت واقعی در وبسایت متفاوت است، زیرا Google نسخه کششده صفحه را به جای نسخه فعلی ارائه میدهد.
- تعداد سطرها بیش از 300-500 است — هرچه تعداد فرمولهای IMPORTXML در یک سند بیشتر باشد، احتمال مسدود شدن جمعی بر اساس دامنه بیشتر است.
- نیاز به بهروزرسانی بیشتر از یک بار در ساعت است — IMPORTXML بهطور فیزیکی برای نظارت در زمان واقعی طراحی نشده است و مکانیزم چرخش IP ندارد.
- وبسایت نیاز به احراز هویت یا CAPTCHA دارد — Wildberries و Ozon بهطور فزایندهای صفحات با بررسی JavaScript را نشان میدهند که IMPORTXML بهطور کلی نمیتواند از آن عبور کند.
اگر شما حداقل 2-3 مورد از لیست را دارید — این یک اشکال موقتی Google Sheets نیست، بلکه یک محدودیت ساختاری در فناوری است. شما میتوانید بیپایان فرمولها را تعمیر کنید، IFERROR اضافه کنید و بهصورت دستی محاسبه کنید، اما حجم کار دستی سریعتر از حجم دادههای مفید افزایش خواهد یافت.
چرا وبسایتها درخواستهای Google Sheets را مسدود میکنند
بازارهایی مانند Wildberries و Ozon روزانه میلیونها درخواست خودکار از رقبا، خدمات تحلیلی و رباتها دریافت میکنند. برای جلوگیری از بارگذاری بیش از حد سرورها و محافظت از دادههای قیمتها در برابر پارسینگ انبوه، آنها چندین سطح حفاظت را پیادهسازی میکنند:
- محدودیت نرخ بر اساس IP — اگر از یک آدرس بیش از N درخواست در دقیقه بیاید، IP بهطور موقت مسدود میشود.
- تحلیل User-Agent — درخواستهای از رباتهای Google برای IMPORTXML به راحتی از مرورگرهای معمولی با هدرها قابل تشخیص است.
- رندرینگ JavaScript — بخشی از محتوا بهطور دینامیک از طریق اسکریپتها بارگذاری میشود و IMPORTXML فقط HTML اصلی را بدون اجرای JS میبیند.
- فیلتر جغرافیایی — درخواستهای از IPهای سروری Google اغلب تحت فیلتر "شبیه به خریدار واقعی نیست" قرار میگیرند.
مشکل اصلی این است که همه کاربران IMPORTXML در سراسر جهان بهطور فنی از یک مجموعه محدود از IPهای سروری Google استفاده میکنند. وقتی هزاران جدول بهطور همزمان از یک دامنه Wildberries درخواست میکنند، حفاظت وبسایت نه یک کاربر خاص، بلکه یک دامنه کامل را مسدود میکند — و همه، از جمله شما، آسیب میبینند.
IMPORTXML در مقابل پارسر بدون کد در مقابل پارسر شخصی: جدول مقایسه
انتقال از تابع داخلی Google Sheets لزوماً به معنای استخدام یک برنامهنویس نیست. گزینههای میانراهی وجود دارد. سه رویکرد را بر اساس پارامترهای کلیدی مقایسه میکنیم:
| معیار | IMPORTXML | پارسر بدون کد (Octoparse, ParseHub) | پارسر شخصی با پروکسی |
|---|---|---|---|
| نیاز به کد | خیر | خیر | بله (یا پیمانکار) |
| محدودیت درخواستها | سخت، پنهان | بسته به تعرفه | خودتان کنترل میکنید |
| چرخش IP | در دسترس نیست | بهطور جزئی تعبیه شده | کنترل کامل از طریق پروکسی |
| کار با صفحات JS | خیر | بله | بله (با Selenium/Playwright) |
| فرکانس بهروزرسانی | یک بار در ساعت و کمتر | قابل تنظیم | هر فرکانسی، حتی در زمان واقعی |
| مقیاس (SKU) | تا 200-300 | تا چند هزار | بدون محدودیت عملی |
پارسرهای بدون کد — یک قدم میانراهی خوب هستند، اگر نیاز به بستن سریع یک وظیفه بدون برنامهنویس دارید. اما اگر نظارت بر قیمتها یک فرآیند تجاری دائمی باشد و نه یک وظیفه یکباره، پارسر شخصی با پروکسی به دلیل کنترل بر دادهها و عدم وابستگی به خدمات دیگر و محدودیتهای آن، به صرفهتر است.
چه پروکسیهایی برای پارس کردن بازارها نیاز است
دلیل اصلی اینکه پارسر شخصی پایدارتر از IMPORTXML عمل میکند، امکان توزیع درخواستها بین IPهای مختلف به جای یک مجموعه سروری Google است. اما نوع پروکسی نیز اهمیت دارد:
- پروکسیهای دیتاسنتر — سریعترین و در دسترسترین گزینه برای شروع. مناسب است اگر بازار هنوز الگوی درخواستهای خودکار را شناسایی نکرده باشد. برای آزمایشهای اولیه پارسر و تعداد کمی SKU مناسب است.
- پروکسیهای مسکونی — از IPهای واقعی ارائهدهندگان خانگی استفاده میکنند، بنابراین برای Wildberries و Ozon مانند خریداران عادی به نظر میرسند. این گزینه اصلی برای نظارت منظم بر قیمتها در مقیاس صنعتی است، زمانی که مهم است که تحت ممنوعیت بر اساس جغرافیا یا الگوی ترافیک قرار نگیرید.
- پروکسیهای موبایل — IPهای اپراتورهای موبایل که بازارها به شدت تمایل دارند آنها را مسدود نکنند، زیرا معمولاً هزاران کاربر مختلف بهطور همزمان از یک IP موبایل استفاده میکنند. این پروکسیها زمانی که نیاز به پارس کردن از طریق نسخههای موبایل وبسایت یا برنامهها دارید، کاربردی هستند.
برای شروع نظارت بر قیمتها در Wildberries و Ozon، ترکیب بهینه: پروکسیهای مسکونی با چرخش IP در هر درخواست یا هر چند دقیقه یک بار است. این خطر قرار گرفتن تحت محدودیت نرخ را کاهش میدهد و به شما این امکان را میدهد که هزاران درخواست را بین صدها آدرس مختلف توزیع کنید و رفتار کاربران عادی از مناطق مختلف را شبیهسازی کنید.
برنامه مرحلهای انتقال به پارسر شخصی
انتقال از IMPORTXML نیاز به توقف کامل کار ندارد — میتوانید جدول را بهعنوان یک کانال پشتیبان نگه دارید، در حالی که پارسر جدید در حال آزمایش است.
- لیست SKU و انتخابگرهای XPath را ثبت کنید که قبلاً در فرمولهای IMPORTXML استفاده شدهاند — این یک نقشه داده آماده برای راهحل جدید است.
- فرمت پارسر را انتخاب کنید: سرویس بدون کد (Octoparse, ParseHub, Apify) برای شروع سریع بدون برنامهنویس، یا اسکریپت در Python/Node.js، اگر در تیم توسعهدهنده یا فریلنسر دارید.
- پروکسی با چرخش IP را متصل کنید. بدون این، پارسر جدید با همان مسدودیتهایی که IMPORTXML با آنها مواجه است، روبرو خواهد شد، فقط کمی دیرتر.
- برنامه زمانبندی درخواستها را تنظیم کنید با تأخیرهای تصادفی کوچک بین درخواستها (2-5 ثانیه) — این احتمال فعال شدن حفاظت بر اساس الگو را کاهش میدهد.
- دادهها را به Google Sheets برگردانید از طریق Google Sheets API یا سرویسی مانند Zapier/Make، تا گزارشها و داشبوردهای تیم را خراب نکنید.
- در 10-15% محصولات آزمایش کنید در طول یک هفته، دقت را با دادههای فرمولهای قدیمی IMPORTXML مقایسه کنید، قبل از اینکه بهطور کامل سوئیچ کنید.
- هشدارهایی برای خطاها تنظیم کنید — اطلاعرسانی در Telegram یا ایمیل، اگر پارسر شروع به دریافت CAPTCHA یا کد 403 کرد، تا بلافاصله پروکسی را تغییر دهید یا فرکانس درخواستها را کاهش دهید.
حداقل پارسر در Python با پروکسی
اگر در تیم توسعهدهنده دارید، نسخه پایه پارسر واقعاً فقط چند ده خط کد نیاز دارد. در زیر — یک مثال ساده از درخواست صفحه محصول از طریق پروکسی با استفاده از کتابخانه requests:
import requests
import time
import random
proxies = {
"http": "http://login:password@proxy_host:port",
"https": "http://login:password@proxy_host:port",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"
}
urls = [
"https://example-marketplace.com/product/12345",
"https://example-marketplace.com/product/67890",
]
for url in urls:
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
# ادامه پارس کردن قیمت با استفاده از BeautifulSoup یا lxml
print(f"OK: {url}")
else:
print(f"وضعیت {response.status_code} برای {url}")
except requests.exceptions.RequestException as e:
print(f"خطای درخواست: {e}")
time.sleep(random.uniform(2, 5)) # توقف بین درخواستها
برای صفحاتی که قیمتها از طریق JavaScript بهطور دینامیک بارگذاری میشوند (که برای Wildberries و Ozon معمول است) به جای requests به Selenium یا Playwright نیاز دارید، که میتوانند صفحه را مانند یک مرورگر واقعی رندر کنند و بهطور مشابه از پروکسی از طریق پارامترهای راهاندازی پشتیبانی کنند.
چکلیست قبل از راهاندازی
- لیست URL و انتخابگرهای داده از فرمولهای قدیمی IMPORTXML منتقل شده است
- پروکسیها با چرخش IP متصل شدهاند (مسکونی یا موبایل برای بازارها)
- تأخیرهای تصادفی بین درخواستها تنظیم شدهاند (2-5 ثانیه)
- User-Agent و هدرهای مرورگر واقعی در هر درخواست تنظیم شدهاند
- لاگگیری خطاها و هشدارها برای کد 403/CAPTCHA تنظیم شده است
- دادهها در فرمت آشنا (Google Sheets, CRM, BI-dashboard) بارگذاری میشوند
- آزمایش در 1-2 هفته بر روی زیرمجموعهای از محصولات قبل از سوئیچ کامل انجام شده است
نتیجهگیری
IMPORTXML — ابزار عالی برای شروع است، تا زمانی که لیست محصولات کوچک باشد و فرکانس بهروزرسانی بحرانی نباشد. اما به محض اینکه شما خطاهای انبوه #N/A، تأخیرهای رو به افزایش و پیامهای مستقیم خطای محدودیت را مشاهده کنید — این یک سیگنال است که تابع داخلی Google Sheets به حد معماری خود رسیده است. از نظر فنی، این با تنظیمات جدول اصلاح نمیشود، زیرا مشکل در مجموعه محدود IPهای Google است که بازارها بهطور کامل مسدود میکنند.
انتقال به پارسر شخصی، چه بهصورت سرویس بدون کد و چه اسکریپت Python، مشکل را بهخاطر کنترل بر IPهای درخواستها حل میکند. اگر شما قصد دارید نظارت بر قیمتها در Wildberries، Ozon یا Avito را در مقیاس صنعتی انجام دهید، توصیه میکنیم با پروکسیهای مسکونی شروع کنید — آنها کمترین خطر مسدود شدن را بهخاطر شباهت به ترافیک خریداران واقعی ارائه میدهند. برای آزمایشهای سریع در شروع میتوانید از پروکسیهای دیتاسنتر ارزانتر استفاده کنید و برای سناریوهای با نسخههای موبایل وبسایتها به پروکسیهای موبایل نگاه کنید.