Yandex.Eda、Delivery Club、SberMarket和数十个地区送货聚合器——对于市场营销人员、分析师和餐饮业主来说,是真正的数据金矿。但一旦开始系统地收集价格和菜单项目,服务就开始阻止请求。本文将探讨如何正确组织菜单和送货价格的解析,使用哪些工具,以及代理如何帮助避免阻塞。
为什么要解析餐厅菜单和送货价格
俄罗斯的送货市场是电子商务中最具活力的细分市场之一。菜品价格、菜单成分和送货条件几乎每天都在变化。如果涉及到数十个竞争对手或数百个项目,手动跟踪这些变化是不可能的。这就是需要自动数据收集的地方。
下面是实际使用菜单和价格解析的用户:
- 餐厅和咖啡馆老板——跟踪自己地区竞争对手的价格,以便及时调整自己的定价。
- 餐饮连锁的市场营销人员——分析竞争对手通过促销和特别优惠推广的菜单项目。
- HoReCa市场分析师——根据不同城市和地区的菜品类别构建平均价格报告。
- 初创聚合器——收集餐厅的菜单和价格以用于自己的目录。
- 投资者和顾问——在开设新餐厅或特许经营之前评估竞争环境。
- 应用开发者——为卡路里计算或饮食计划应用程序生成菜品数据库。
如果您在餐饮行业工作或进行分析,定期监控竞争对手的价格不是奢侈,而是必要。热门菜品的30-50卢布的差价可能直接影响订单转化率。而没有自动化,您将始终落后于那些已经设置数据收集的人。
从送货聚合器收集哪些数据
在设置解析器之前,了解您需要哪些数据是很重要的。送货聚合器包含多个层次的信息,每一层对不同的任务都有用。
| 数据类型 | 包括什么 | 对谁有用 |
|---|---|---|
| 菜单和项目 | 菜品名称、描述、成分、重量、卡路里 | 应用开发者、营养师 |
| 菜品价格 | 当前价格、折扣价格、变动历史 | 餐厅老板、市场营销人员 |
| 送货条件 | 送货费用、最低订单金额、送货时间 | 分析师、初创公司 |
| 促销和特别优惠 | 折扣、组合、促销菜品、季节性优惠 | 市场营销人员、竞争情报 |
| 评级和评论 | 餐厅评分、评论数量、质量标签 | 投资者、顾问 |
| 地理数据 | 地址、送货区域、服务区域 | 市场分析师、特许经营 |
动态价格监控特别有价值:如果每天收集数据几个月,就可以看到竞争对手的定价模式——他们何时提高价格,何时推出促销,以及如何对外部事件(节假日、体育赛事、恶劣天气)作出反应。
Yandex.Eda、Delivery Club和其他聚合器的保护特点
大型送货聚合器积极保护其数据不被自动收集。这是可以理解的:他们的餐厅数据库和当前价格是他们的竞争优势。在设置解析器之前,需要了解您将面临哪些保护措施。
Yandex.Eda
同时使用多个保护层。首先,积极使用地理定位:菜单内容和价格根据您的IP地址显示——如果IP来自莫斯科,您将看到莫斯科的餐厅。其次,网站作为SPA(单页面应用)在React上运行,即数据通过API请求加载,而不是嵌入在HTML中。第三,当检测到可疑活动时,会启用Yandex SmartCaptcha。频繁的请求来自同一IP时,您将被禁止访问网站。
Delivery Club (SberMarket)
类似的架构:数据通过内部API提供,而不是通过静态HTML。服务分析行为模式:如果请求过快或没有间隔——将被阻止。还使用User-Agent和请求头的分析。非标准头信息会立即引起怀疑。
地区聚合器
像Chibbis、Goloso这样的服务,地区聚合器通常具有较弱的保护。一部分使用简单的HTML页面,可以用标准工具进行解析。然而,在频繁请求时,IP阻止仍然是标准做法。
送货聚合器上阻止解析器的主要机制:
- 超过请求限制时阻止IP(速率限制)
- 地理阻止——为不同IP显示不同内容
- 分析User-Agent和HTTP头信息
- 可疑活动时出现验证码
- JavaScript渲染数据(SPA架构)
- 行为分析:点击速度、滚动、暂停
无代码和有代码的解析工具
好消息是:解析餐厅菜单并不一定需要编程技能。存在现成的无代码解决方案,可以处理大多数任务。但对于像Yandex.Eda这样的SPA网站,则需要更复杂的工具。
无代码工具(不需要编程)
Octoparse——最受欢迎的可视化解析器之一。允许单击页面元素并构建数据收集脚本,无需编写代码。具有IP轮换的云模式。适合从结构简单的网站收集菜单。
ParseHub——类似的工具,具有可视化界面。能够处理JavaScript页面,使其适用于现代聚合器。支持代理。
Apify——具有现成“演员”(流行网站的现成解析器)的平台。某些送货聚合器在其市场上已有现成解决方案。可以通过Web界面无代码运行。
有代码的工具(针对开发者)
Python + Requests + BeautifulSoup——用于解析静态页面的经典组合。快速、简单,但无法处理JavaScript渲染。
Python + Selenium或Playwright——控制真实浏览器(Chrome/Firefox),因此能够处理SPA网站、JavaScript甚至某些验证码。Playwright被认为是更现代和快速的解决方案。正是这个组合与Yandex.Eda和Delivery Club一起工作。
Scrapy——用于大规模解析的专业Python框架。支持请求队列、代理中间件、导出为不同格式。对于大型餐厅数据收集项目——最佳选择。
| 工具 | 需要代码吗? | JS渲染 | 代理 | 适合于 |
|---|---|---|---|---|
| Octoparse | 否 | 部分 | 内置轮换 | 地区聚合器 |
| ParseHub | 否 | 是 | 外部代理 | 大多数聚合器 |
| Apify | 否 | 是 | 内置 + 外部 | Yandex.Eda、Delivery Club |
| Selenium/Playwright | 是(Python) | 是 | 外部代理 | 任何网站 |
| Scrapy | 是(Python) | 通过插件 | 外部代理 | 大规模数据收集 |
为什么没有代理解析无法工作
这是一个关键问题。许多初学者分析师尝试直接从自己的IP启动解析器,立即遇到阻塞。原因很简单:送货聚合器在短时间内看到来自同一地址的数百个请求,并自动阻止它。恢复访问可能需要几个小时到几天。
代理解决了这个问题,通过多个不同的IP地址分配请求。从服务器的角度来看,请求看起来像来自不同地点的不同用户的正常流量。但并非所有代理在此任务中都同样有效。
住宅代理
住宅代理使用真实家庭用户的IP地址。从Yandex.Eda或Delivery Club的角度来看,这是一个普通人,正在查看餐厅菜单。正确使用时,这些代理几乎不会被阻止。是从大型聚合器收集数据的理想选择,具有严密的保护。
移动代理
移动代理——移动运营商的IP地址(MTS、Beeline、MegaFon等)。它们的特点是一个移动IP可以被成千上万的真实用户同时使用(通过NAT),因此网站极少阻止移动地址。这使它们成为高频请求解析的最可靠选择之一。
数据中心代理
数据中心代理是最快和最便宜的,但它们的IP容易被识别为“非人类”。对于具有简单保护的地区聚合器,它们适用,但Yandex.Eda和Delivery Club会相对迅速地阻止它们。然而,数据中心代理在初步绕过网站结构和测试解析器之前的战斗启动中表现良好。
选择解析菜单的代理类型:
- Yandex.Eda、Delivery Club → 住宅或移动代理
- 地区聚合器(Chibbis等) → 数据中心代理或住宅代理
- 全国数据收集(不同城市) → 带城市地理定位的住宅代理
- 高频监控(每小时) → 带轮换的移动代理
带代理的解析器逐步设置
我们将讨论一个实际场景:您希望每天从Yandex.Eda收集您所在城市20个竞争对手的比萨价格。以下是逐步设置的方法。
步骤1. 研究聚合器的API结构
在浏览器中打开Yandex.Eda,按F12(开发者工具),转到网络选项卡并按XHR/Fetch过滤请求。找到餐厅页面并查看加载菜单时发送的API请求。通常是类似于api/v1/menu?restaurantId=...的内容。记录这些请求的头信息——它们在模拟时会用到。
步骤2. 选择工具
如果您不编写代码——使用Apify或ParseHub。如果您使用Python——Playwright将是处理JavaScript网站的最佳选择。安装所需的工具,并确保它支持外部代理的连接。
步骤3. 获取带地理定位的代理
这是一个重要的时刻。Yandex.Eda根据城市显示不同的餐厅。如果您正在解析叶卡捷琳堡的餐厅菜单——您需要来自叶卡捷琳堡的IP代理。带城市地理定位的住宅代理允许您获取本地用户看到的内容。在设置代理时指定所需的地区。
步骤4. 设置代理轮换
不要对所有请求使用一个代理。设置轮换:每5-10个请求更换IP。在Apify中通过代理池设置完成。在Scrapy中通过中间件完成。在Playwright中通过在每次创建浏览器上下文时传递新代理完成。IP更换频率越高,被阻止的风险越低。
步骤5. 设置请求之间的延迟
在请求之间添加随机暂停——从2到8秒。这模拟了真实用户的行为。绝不要以少于1秒的间隔发送请求——这是被禁止的必经之路。在Scrapy中使用参数DOWNLOAD_DELAY并启用AUTOTHROTTLE_ENABLED。
步骤6. 设置正确的请求头信息
始终传递现实的User-Agent(浏览器字符串)、Accept-Language头(例如,ru-RU,ru;q=0.9)和Referer。没有这些头信息的请求看起来像机器人,首先会被阻止。使用来自Chrome或Firefox的最新User-Agent字符串。
步骤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:忽视地理定位
Yandex.Eda和Delivery Club根据用户所在城市显示不同的内容。如果您想收集新西伯利亚的餐厅数据,但使用的是莫斯科的代理——您将获得莫斯科的数据。始终检查代理是否符合所需的地区。
错误3:解析HTML而不是API
初学者解析器试图从页面的HTML代码中收集数据。但在SPA网站上(而Yandex.Eda正是这样的),数据并未嵌入HTML中——它们是通过API加载的。更有效的方法是通过开发者工具找到所需的API端点并直接请求它。这更快、更稳定且需要更少的资源。
错误4:请求频率过高
想要快速收集数据的愿望是可以理解的,但这会导致即时阻塞。对于每天监控50家餐厅的价格,足够每天运行一次解析器,并在请求之间保持3-5秒的暂停。不要试图通过减少延迟来加快过程。
错误5:缺乏对代理可用性的监控
代理可能会“失效”——它们被阻止,或者到期。如果解析器继续使用被阻止的代理,您将获得空数据或错误,而不注意到问题。在每次启动之前设置代理的可用性检查,并自动替换不可用的地址。
错误6:忽视网站结构的变化
聚合器定期更新其网站和API。一个月前有效的解析器可能在下次更新后停止工作。设置错误通知并至少每周检查解析器的可用性。随时准备好您收集的数据结构的文档。
在启动餐厅菜单解析器之前的检查清单:
- ✅ 设置了10个以上的代理池并进行轮换
- ✅ 代理符合所需的城市/地区
- ✅ 请求之间的延迟为3-8秒(随机)
- ✅ 设置了现实的User-Agent
- ✅ 添加了Accept-Language和Referer头信息
- ✅ 设置了带时间戳的数据存储
- ✅ 启用了错误监控和通知
- ✅ 启动计划在夜间进行
结论
解析餐厅菜单和送货价格是餐饮行业和HoReCa市场分析中的一个实际竞争优势工具。Yandex.Eda、Delivery Club和其他聚合器积极保护其数据,但通过正确的方法——合理选择工具、设置延迟和使用高质量代理——数据收集可以稳定运行而不会被阻塞。
本文的关键结论:使用支持JavaScript渲染的工具(Playwright、Apify),设置代理轮换,不要忘记地理定位,并始终在请求之间添加随机暂停。这是稳定解析的三大支柱。
如果您计划定期从Yandex.Eda、Delivery Club或地区送货聚合器收集数据,建议关注住宅代理——它们提供最大程度的抵抗阻塞能力,并支持针对俄罗斯城市的地理定位,这对正确收集特定地区的价格数据至关重要。
```