یاندکس.غذا، Delivery Club، اسبرمارکت و دهها تجمیعکننده منطقهای تحویل - یک کلاهبرداری واقعی دادهها برای بازاریابان، تحلیلگران و صاحبان کسبوکار رستورانی است. اما به محض اینکه شروع به جمعآوری سیستماتیک قیمتها و موقعیتهای منو میکنید، خدمات شروع به مسدود کردن درخواستها میکنند. در این مقاله بررسی میکنیم که چگونه پارس کردن منو و قیمتهای تحویل را به درستی سازماندهی کنیم، از چه ابزارهایی استفاده کنیم و چگونه پروکسیها به جلوگیری از مسدودیتها کمک میکنند.
چرا منوی رستورانها و قیمتهای تحویل را پارس کنیم
بازار تحویل غذا در روسیه - یکی از داینامیکترین بخشهای تجارت الکترونیک است. قیمتهای غذا، ترکیبهای منو و شرایط تحویل تقریباً هر روز تغییر میکنند. پیگیری این تغییرات بهصورت دستی غیرممکن است، اگر صحبت از دهها رقیب یا صدها موقعیت باشد. در اینجا است که جمعآوری خودکار دادهها مورد نیاز است.
اینها کسانی هستند که در عمل از پارس کردن منو و قیمتها استفاده میکنند:
- صاحبان رستورانها و کافهها - قیمتهای رقبای خود را در منطقه خود پیگیری میکنند تا بهسرعت قیمتگذاری خود را تنظیم کنند.
- بازاریابان زنجیرههای رستورانی - تحلیل میکنند که کدام موقعیتهای منو را رقبای خود از طریق تبلیغات و پیشنهادات ویژه ترویج میدهند.
- تحلیلگران بازار HoReCa - گزارشهایی درباره قیمتهای متوسط در دستههای غذا در شهرها و مناطق مختلف تهیه میکنند.
- تجمیعکنندههای استارتاپی - پایگاه دادهای از رستورانها با منو و قیمتها برای کاتالوگ خود جمعآوری میکنند.
- سرمایهگذاران و مشاوران - محیط رقابتی را قبل از افتتاح یک مکان جدید یا فرانچایز ارزیابی میکنند.
- توسعهدهندگان اپلیکیشنها - پایگاههای دادهای از غذاها برای اپلیکیشنهای محاسبه کالری یا برنامهریزی تغذیه تشکیل میدهند.
اگر شما در کسبوکار رستورانی کار میکنید یا به تحلیل آن میپردازید، نظارت منظم بر قیمتهای رقبای خود یک ضرورت است، نه یک تجمل. تفاوت 30–50 روبل در یک غذای محبوب میتواند بهطور مستقیم بر تبدیل به سفارشات تأثیر بگذارد. و بدون اتوماسیون، همیشه یک قدم عقبتر از کسانی خواهید بود که قبلاً جمعآوری دادهها را تنظیم کردهاند.
چه دادههایی از تجمیعکنندههای تحویل جمعآوری میشود
قبل از تنظیم پارسر، مهم است که بفهمید دقیقاً به چه دادههایی نیاز دارید. تجمیعکنندههای تحویل شامل چندین لایه اطلاعات هستند و هر یک از آنها برای وظایف مختلف مفید است.
| نوع داده | چه چیزی شامل میشود | برای چه کسانی مفید است |
|---|---|---|
| منو و موقعیتها | نام غذاها، توصیفات، ترکیب، وزن، کالری | توسعهدهندگان اپلیکیشنها، متخصصان تغذیه |
| قیمتهای غذا | قیمت فعلی، قیمت با تخفیف، تاریخچه تغییرات | صاحبان رستورانها، بازاریابان |
| شرایط تحویل | هزینه تحویل، حداقل مبلغ سفارش، زمان تحویل | تحلیلگران، استارتاپها |
| تبلیغات و پیشنهادات ویژه | تخفیفها، کامبو، غذاهای تبلیغاتی، پیشنهادات فصلی | بازاریابان، اطلاعات رقابتی |
| رتبهبندیها و نظرات | امتیازهای مکانها، تعداد نظرات، برچسبهای کیفیت | سرمایهگذاران، مشاوران |
| دادههای جغرافیایی | آدرسها، مناطق تحویل، نواحی حضور | تحلیلگران بازار، فرانچایزها |
نظارت بر قیمتها در دینامیک ارزش خاصی دارد: اگر دادهها را روزی یک بار به مدت چند ماه جمعآوری کنید، میتوانید الگوهای قیمتگذاری رقبا را ببینید - اینکه چه زمانی قیمتها را افزایش میدهند، چه زمانی تبلیغات را راهاندازی میکنند و چگونه به رویدادهای خارجی (تعطیلات، رویدادهای ورزشی، آب و هوای بد) واکنش نشان میدهند.
ویژگیهای حفاظت یاندکس.غذا، Delivery Club و دیگر تجمیعکنندهها
تجمیعکنندههای بزرگ تحویل بهطور فعال دادههای خود را از جمعآوری خودکار محافظت میکنند. و این قابل درک است: پایگاه داده رستورانها و قیمتهای فعلی آنها - مزیت رقابتی آنها است. قبل از تنظیم پارسر، باید بفهمید با چه نوع حفاظتی مواجه خواهید شد.
یاندکس.غذا
از چندین سطح حفاظت بهطور همزمان استفاده میکند. اولاً، بهطور فعال از جغرافیای IP استفاده میشود: محتوای منو و قیمتها بسته به آدرس IP شما نمایش داده میشود - اگر IP از مسکو باشد، رستورانهای مسکو را میبینید. ثانیاً، سایت بهعنوان یک SPA (Single Page Application) بر روی React کار میکند، به این معنی که دادهها از طریق درخواستهای API بارگذاری میشوند و در HTML گنجانده نشدهاند. ثالثاً، در صورت فعالیت مشکوک، یاندکس SmartCaptcha فعال میشود. در صورت درخواستهای مکرر از یک IP، به سادگی اجازه ورود به سایت را نمیدهند.
Delivery Club (اسبرمارکت)
معماری مشابه: دادهها از طریق API داخلی ارائه میشوند، نه از طریق HTML ایستا. این سرویس الگوهای رفتاری را تحلیل میکند: اگر درخواستها خیلی سریع یا بدون وقفه انجام شوند - مسدودیت. همچنین از تحلیل User-Agent و هدرهای درخواستها استفاده میشود. هدرهای غیرمعمول بهسرعت مشکوک میشوند.
تجمیعکنندههای منطقهای
سرویسهایی مانند Chibbis، Goloso، تجمیعکنندههای محلی در مناطق معمولاً دارای حفاظت ضعیفتری هستند. بخشی از آنها از صفحات HTML ساده استفاده میکنند که با ابزارهای استاندارد پارس میشوند. با این حال، در اینجا نیز مسدودیت بر اساس IP در صورت درخواستهای مکرر یک رویه استاندارد است.
مکانیسمهای اصلی مسدودیت پارسرها در تجمیعکنندههای تحویل:
- مسدودیت IP در صورت تجاوز از حد درخواستها (rate limiting)
- جغرافیایی - نمایش محتوای متفاوت برای IPهای مختلف
- تحلیل User-Agent و هدرهای HTTP
- کپچا در صورت فعالیت مشکوک
- رندرینگ JavaScript دادهها (معماری SPA)
- تحلیل رفتار: سرعت کلیکها، اسکرول، وقفهها
ابزارهای پارس کردن بدون کد و با کد
خبر خوب: برای پارس کردن منوی رستورانها نیازی به برنامهنویسی نیست. راهحلهای آماده بدون کد وجود دارند که با اکثر وظایف کنار میآیند. اما برای کار با سایتهای SPA مانند یاندکس.غذا به ابزارهای جدیتری نیاز خواهید داشت.
ابزارهای بدون کد (بدون برنامهنویسی)
Octoparse - یکی از محبوبترین پارسرهای بصری است. به شما اجازه میدهد بر روی عناصر صفحه کلیک کنید و سناریو جمعآوری دادهها را بدون نوشتن کد بسازید. دارای حالت ابری با چرخش IP است. مناسب برای جمعآوری منو از سایتهای با ساختار ساده است.
ParseHub - ابزار مشابهی با رابط بصری. میتواند با صفحات JavaScript کار کند که آن را برای تجمیعکنندههای مدرن قابل استفاده میکند. دارای پشتیبانی از پروکسی است.
Apify - پلتفرمی با «اکترهای» آماده (پارسرهای آماده برای سایتهای محبوب). برای برخی از تجمیعکنندههای تحویل، راهحلهای آمادهای در بازار آنها وجود دارد. میتوان از طریق رابط وب بدون کد اجرا کرد.
ابزارهای با کد (برای توسعهدهندگان)
Python + Requests + BeautifulSoup - ترکیب کلاسیک برای پارس کردن صفحات ایستا. سریع، آسان، اما با رندرینگ JavaScript کنار نمیآید.
Python + Selenium یا Playwright - یک مرورگر واقعی (Chrome/Firefox) را کنترل میکند، بنابراین با سایتهای SPA، JavaScript و حتی برخی کپچاها کنار میآید. Playwright بهعنوان یک راهحل مدرنتر و سریعتر شناخته میشود. این ترکیب با یاندکس.غذا و Delivery Club کار میکند.
Scrapy - فریمورک حرفهای برای پارس کردن مقیاسپذیر در Python. از صفهای درخواست، middleware برای پروکسی، و صادرات به فرمتهای مختلف پشتیبانی میکند. برای پروژههای بزرگ جمعآوری دادههای رستورانها - انتخاب بهینه است.
| ابزار | نیاز به کد دارد؟ | رندرینگ JS | پروکسی | مناسب برای |
|---|---|---|---|---|
| Octoparse | خیر | جزئی | چرخش داخلی | تجمیعکنندههای منطقهای |
| ParseHub | خیر | بله | پروکسیهای خارجی | اکثر تجمیعکنندهها |
| Apify | خیر | بله | چرخش داخلی + خارجی | یاندکس.غذا، Delivery Club |
| Selenium/Playwright | بله (Python) | بله | پروکسیهای خارجی | هر سایتی |
| Scrapy | بله (Python) | از طریق پلاگینها | پروکسیهای خارجی | جمعآوری دادههای مقیاسپذیر |
چرا بدون پروکسی پارس کردن کار نمیکند
این یک سوال کلیدی است. بسیاری از تحلیلگران مبتدی سعی میکنند پارسر را مستقیماً از IP خود راهاندازی کنند و بلافاصله با مسدودیت مواجه میشوند. دلیل آن ساده است: تجمیعکنندههای تحویل صدها درخواست را از یک آدرس در مدت زمان کوتاه میبینند و بهطور خودکار آن را مسدود میکنند. بازیابی دسترسی میتواند از چند ساعت تا چند روز طول بکشد.
پروکسیها این مشکل را حل میکنند و درخواستها را بین چندین IP مختلف توزیع میکنند. از نظر سرور، درخواستها بهعنوان ترافیک عادی از کاربران مختلف از مکانهای مختلف به نظر میرسند. اما همه پروکسیها بهطور یکسان برای این کار مؤثر نیستند.
پروکسیهای مسکونی
پروکسیهای مسکونی از آدرسهای IP کاربران واقعی خانگی استفاده میکنند. از نظر یاندکس.غذا یا Delivery Club - این یک فرد عادی است که وارد شده تا منوی رستوران را ببیند. این پروکسیها تقریباً در صورت استفاده صحیح مسدود نمیشوند. انتخاب ایدهآل برای جمعآوری دادهها از تجمیعکنندههای بزرگ با حفاظت جدی است.
پروکسیهای موبایل
پروکسیهای موبایل - آدرسهای IP اپراتورهای موبایل (MTS، بیلاین، مگافون و غیره). ویژگی آنها این است که یک IP موبایل میتواند بهطور همزمان توسط هزاران کاربر واقعی استفاده شود (از طریق NAT)، بنابراین سایتها بهندرت آدرسهای موبایل را مسدود میکنند. این آنها را به یکی از مطمئنترین گزینهها برای پارس کردن با فرکانس بالای درخواستها تبدیل میکند.
پروکسیهای دیتاسنتر
پروکسیهای دیتاسنتر - سریعترین و ارزانترین هستند، اما IPهای آنها بهراحتی بهعنوان «غیرانسانی» شناسایی میشوند. برای تجمیعکنندههای منطقهای با حفاظت ساده مناسب هستند، اما یاندکس.غذا و Delivery Club بهسرعت آنها را مسدود میکنند. با این حال، پروکسیهای دیتاسنتر برای دور زدن اولیه ساختار سایت و تست پارسر قبل از راهاندازی واقعی خوب عمل میکنند.
کدام نوع پروکسی برای پارس کردن منو انتخاب کنیم:
- یاندکس.غذا، Delivery Club → پروکسیهای مسکونی یا موبایل
- تجمیعکنندههای منطقهای (Chibbis و غیره) → پروکسیهای دیتاسنتر یا مسکونی
- جمعآوری دادهها در سراسر روسیه (شهرهای مختلف) → مسکونی با جغرافیای هدفگذاری شده بر اساس شهرها
- نظارت با فرکانس بالا (هر ساعت) → پروکسیهای موبایل با چرخش
تنظیم گام به گام پارسر با پروکسی
یک سناریوی عملی را بررسی میکنیم: شما میخواهید روزانه قیمتهای پیتزا را از 20 رقیب در شهر خود از یاندکس.غذا جمعآوری کنید. اینجا چگونگی تنظیم آن بهصورت گام به گام است.
گام 1. ساختار API تجمیعکننده را مطالعه کنید
یاندکس.غذا را در مرورگر باز کنید، F12 (DevTools) را فشار دهید، به برگه Network بروید و درخواستها را بر اساس XHR/Fetch فیلتر کنید. صفحه رستوران را پیدا کنید و ببینید چه درخواستهای API هنگام بارگذاری منو ارسال میشوند. معمولاً چیزی شبیه به api/v1/menu?restaurantId=... است. هدرهای این درخواستها را یادداشت کنید - به آنها برای شبیهسازی نیاز خواهید داشت.
گام 2. ابزار را انتخاب کنید
اگر کد نمینویسید - از Apify یا ParseHub استفاده کنید. اگر به Python مینویسید - Playwright انتخاب بهینهای برای کار با سایتهای JavaScript خواهد بود. ابزار مورد نیاز را نصب کنید و اطمینان حاصل کنید که از اتصال پروکسیهای خارجی پشتیبانی میکند.
گام 3. پروکسی با جغرافیای هدفگذاری شده دریافت کنید
این یک نکته مهم است. یاندکس.غذا رستورانهای مختلفی را بسته به شهر نشان میدهد. اگر منوی رستورانهای یکاترینبورگ را پارس میکنید - به پروکسیهایی با IP از یکتربورگ نیاز دارید. پروکسیهای مسکونی با جغرافیای هدفگذاری شده بر اساس شهر به شما این امکان را میدهند که محتوایی را که یک کاربر محلی میبیند، دریافت کنید. منطقه مورد نظر را هنگام تنظیم پروکسی مشخص کنید.
گام 4. چرخش پروکسی را تنظیم کنید
از یک پروکسی برای همه درخواستها استفاده نکنید. چرخش را تنظیم کنید: هر 5–10 درخواست IP را تغییر دهید. در Apify این کار از طریق تنظیمات استخر پروکسی انجام میشود. در Scrapy - از طریق middleware. در Playwright - از طریق ارسال پروکسی جدید در هر بار ایجاد زمینه مرورگر. هرچه IP بیشتر تغییر کند، خطر مسدودیت کمتر است.
گام 5. تأخیر بین درخواستها را تنظیم کنید
بین درخواستها تأخیرهای تصادفی اضافه کنید - از 2 تا 8 ثانیه. این رفتار واقعی کاربر را شبیهسازی میکند. هرگز درخواستها را با فاصله کمتر از 1 ثانیه انجام ندهید - این راهی مطمئن برای مسدودیت است. در Scrapy از پارامتر DOWNLOAD_DELAY استفاده کنید و AUTOTHROTTLE_ENABLED را فعال کنید.
گام 6. هدرهای درخواست را بهدرستی تنظیم کنید
همیشه یک User-Agent واقعی (رشته مرورگر) و هدر Accept-Language (بهعنوان مثال، ru-RU,ru;q=0.9) و Referer را ارسال کنید. درخواستهای بدون این هدرها بهعنوان ربات به نظر میرسند و در اولویت مسدود میشوند. از رشتههای User-Agent بهروز از Chrome یا Firefox استفاده کنید.
گام 7. برنامهریزی و ذخیره دادهها را تنظیم کنید
پارسر را در ساعات شب (از 2:00 تا 6:00) راهاندازی کنید - بار روی سرورهای تجمیعکننده حداقل است و ترافیک مشکوک کمتر قابل مشاهده است. دادهها را در پایگاه داده (PostgreSQL، MySQL) یا حداقل در CSV با زمانهای زمانی ذخیره کنید. این امکان را برای ساخت تاریخچه تغییرات قیمت فراهم میکند.
# مثال تنظیم پروکسی در Playwright (Python)
from playwright.sync_api import sync_playwright
import random
import time
proxies = [
{"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
# ... پروکسیهای بیشتر
]
def parse_restaurant_menu(url):
proxy = random.choice(proxies)
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(
proxy=proxy,
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
page = context.new_page()
# تأخیر تصادفی 2-8 ثانیه
time.sleep(random.uniform(2, 8))
page.goto(url)
page.wait_for_selector('.menu-item') # منتظر بارگذاری منو
# جمعآوری دادههای مربوط به غذاها
items = page.query_selector_all('.menu-item')
menu_data = []
for item in items:
name = item.query_selector('.item-name').inner_text()
price = item.query_selector('.item-price').inner_text()
menu_data.append({'name': name, 'price': price})
browser.close()
return menu_data
اشتباهات رایج و چگونگی اجتناب از آنها
حتی با تنظیم صحیح ابزارها، بسیاری با مشکلاتی در پارس کردن دادههای تحویل غذا مواجه میشوند. در اینجا رایجترین اشتباهات و راههای رفع آنها آورده شده است.
اشتباه 1: استفاده از یک پروکسی برای همه درخواستها
حتی بهترین پروکسی مسکونی نیز مسدود خواهد شد اگر صدها درخواست در روز به یک سایت از طریق آن انجام شود. همیشه از استخر حداقل 10–20 پروکسی با چرخش استفاده کنید. هرچه رستورانهای بیشتری را پارس کنید، به پروکسیهای بیشتری نیاز دارید.
اشتباه 2: نادیده گرفتن جغرافیای هدفگذاری
یاندکس.غذا و Delivery Club محتوای متفاوتی را بسته به شهر کاربر نشان میدهند. اگر میخواهید دادهها را از رستورانهای نووسیبیرسک جمعآوری کنید، اما از پروکسیهای مسکو استفاده میکنید - دادههای مسکو را دریافت خواهید کرد. همیشه بررسی کنید که پروکسی با منطقه مورد نیاز مطابقت داشته باشد.
اشتباه 3: پارس کردن HTML به جای API
پارسرهای مبتدی سعی میکنند دادهها را از کد HTML صفحات جمعآوری کنند. اما در سایتهای SPA (و یاندکس.غذا دقیقاً چنین سایتی است) دادهها در HTML گنجانده نشدهاند - آنها از طریق API بارگذاری میشوند. بهمراتب مؤثرتر است که نقطه پایانی API مورد نیاز را از طریق DevTools پیدا کرده و مستقیماً به آن مراجعه کنید. این سریعتر، پایدارتر و به منابع کمتری نیاز دارد.
اشتباه 4: فرکانس درخواستها بیش از حد بالا
تمایل به جمعآوری دادهها سریعتر قابل درک است، اما این منجر به مسدودیت فوری میشود. برای نظارت روزانه بر قیمتها در 50 رستوران کافی است پارسر را یک بار در روز با تأخیر 3–5 ثانیه بین درخواستها اجرا کنید. سعی نکنید با کاهش تأخیرها، فرآیند را تسریع کنید.
اشتباه 5: عدم نظارت بر عملکرد پروکسی
پروکسیها میتوانند «بمیرند» - آنها مسدود میشوند، تاریخ انقضای آنها به پایان میرسد. اگر پارسر به کار با پروکسی مسدود شده ادامه دهد، دادههای خالی یا خطا دریافت میکنید و مشکل را متوجه نمیشوید. قبل از هر بار راهاندازی، بررسی عملکرد پروکسی را تنظیم کنید و آدرسهای غیرکاربردی را بهطور خودکار جایگزین کنید.
اشتباه 6: نادیده گرفتن تغییرات ساختار سایت
تجمیعکنندهها بهطور منظم سایتها و APIهای خود را بهروزرسانی میکنند. پارسری که یک ماه پیش کار میکرد، ممکن است پس از بهروزرسانی بعدی متوقف شود. هشدارهای خطا را تنظیم کنید و حداقل یک بار در هفته عملکرد پارسر را بررسی کنید. مستندات مربوط به ساختار دادههایی که جمعآوری میکنید را در دسترس داشته باشید.
چکلیست قبل از راهاندازی پارسر منوی رستورانها:
- ✅ استخر از 10+ پروکسی با چرخش تنظیم شده است
- ✅ پروکسیها با شهر/منطقه مورد نیاز مطابقت دارند
- ✅ تأخیرها بین درخواستها 3–8 ثانیه (تصادفی) هستند
- ✅ User-Agent واقعی تنظیم شده است
- ✅ هدرهای Accept-Language و Referer اضافه شدهاند
- ✅ ذخیره دادهها با زمانهای زمانی تنظیم شده است
- ✅ نظارت بر خطاها و هشدارها فعال شده است
- ✅ راهاندازی در زمان شب برنامهریزی شده است
نتیجهگیری
پارس کردن منوی رستورانها و قیمتهای تحویل - یک ابزار واقعی برای مزیت رقابتی در کسبوکار رستورانی و تحلیل بازار HoReCa است. یاندکس.غذا، Delivery Club و دیگر تجمیعکنندهها بهطور فعال دادههای خود را محافظت میکنند، اما با رویکرد صحیح - انتخاب هوشمند ابزارها، تنظیم تأخیرها و استفاده از پروکسیهای با کیفیت - جمعآوری دادهها بهطور پایدار و بدون مسدودیت کار میکند.
نکات کلیدی این مقاله: از ابزارهایی با پشتیبانی از رندرینگ JavaScript (Playwright، Apify) استفاده کنید، چرخش پروکسی را تنظیم کنید، جغرافیای هدفگذاری را فراموش نکنید و همیشه تأخیرهای تصادفی بین درخواستها اضافه کنید. این سه پایه برای پارس کردن پایدار هستند.
اگر قصد دارید بهطور منظم دادهها را از یاندکس.غذا، Delivery Club یا تجمیعکنندههای منطقهای تحویل جمعآوری کنید، توصیه میکنیم به پروکسیهای مسکونی توجه کنید - آنها حداکثر پایداری در برابر مسدودیتها را فراهم میکنند و از جغرافیای هدفگذاری شده بر اساس شهرهای روسیه پشتیبانی میکنند، که برای جمعآوری صحیح دادههای قیمتها در مناطق خاص بسیار مهم است.
```