You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python在VS中爬取米其林餐厅数据遇阻求技术指导

米其林越南区餐厅数据爬取解决方案

问题背景

在Microsoft Visual Studio中使用Python爬取米其林指南越南区餐厅数据,需获取餐厅名称、位置、价格符号、菜系类型。此前可爬取结构简单的网站,但本次目标页面HTML层级嵌套复杂,初始代码仅能尝试获取餐厅名称,后续陷入困境。经分析,所需部分信息嵌入在带有love-icon pl-icon js-favorite-restaurant类的div标签的data属性中。

初始代码

from bs4 import BeautifulSoup
import requests as req
import pandas as pd                                                                                               

url = 'https://guide.michelin.com/en/vn/restaurants/affordable/luxury/mid-range/premium?sort=distinction'         

page = req.get(url)

soup = BeautifulSoup(page.text, 'html.parser')                                                                     

print(soup)

#Restaurant details
restaurant_name = soup.find_all('div', class_ = 'col col-12')                                                                                  

for restaurant in restaurant_name:
    column = restaurant.find('h3', class_ = 'card__menu-content--title pl-text pl-big js-match-height-title')
    name = column.a.text
    print(name)

相关HTML片段

<div class="col-md-6 col-lg-4 col-xl-3"> ...
    <div class="love-icon pl-icon js-favorite-restaurant" 
         data-dtm-price="" 
         dtm-region="Ho Chi Minh" 
         data-restaurant-name="Akuna">
    ...
</div>

期望获取的信息

  • 页面内所有餐厅名称
  • 餐厅位置
  • 价格符号
  • 菜系类型

修改后的实现代码

from bs4 import BeautifulSoup
import requests as req
import pandas as pd

url = 'https://guide.michelin.com/en/vn/restaurants/affordable/luxury/mid-range/premium?sort=distinction'

# 添加请求头模拟浏览器,避免被网站拦截
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
page = req.get(url, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')

restaurant_list = []

# 定位到包含目标数据属性的div标签
target_divs = soup.find_all('div', class_='love-icon pl-icon js-favorite-restaurant')

for div in target_divs:
    # 从data属性提取核心信息
    rest_name = div.get('data-restaurant-name')
    rest_location = div.get('dtm-region')
    rest_price = div.get('data-dtm-price')
    
    # 向上遍历父节点,找到餐厅卡片容器,提取菜系类型
    card_container = div.find_parent('div', class_='card card--menu js-restaurant-card')
    rest_cuisine = None
    if card_container:
        cuisine_tag = card_container.find('div', class_='card__menu-content--tag')
        if cuisine_tag:
            rest_cuisine = cuisine_tag.text.strip()
    
    # 将单条餐厅数据存入列表
    restaurant_list.append({
        '餐厅名称': rest_name,
        '位置': rest_location,
        '价格符号': rest_price,
        '菜系类型': rest_cuisine
    })

# 转换为DataFrame,方便查看和导出
result_df = pd.DataFrame(restaurant_list)
print(result_df)
# 可选:保存为CSV文件
# result_df.to_csv('michelin_vietnam_restaurants.csv', index=False, encoding='utf-8-sig')

关键说明

  1. 请求头设置:添加User-Agent模拟浏览器请求,避免被目标网站的反爬机制拦截。
  2. 精准定位数据:直接通过love-icon pl-icon js-favorite-restaurant类定位div,从其data属性中提取名称、位置、价格信息。
  3. 菜系类型提取:通过父节点关联到餐厅卡片容器,从card__menu-content--tag标签中获取菜系文本。
  4. 数据结构化:用列表字典存储每条餐厅数据,最终转换为DataFrame,便于后续分析或导出。

内容的提问来源于stack exchange,提问作者Meditation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:05:55