使用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')
关键说明
- 请求头设置:添加
User-Agent模拟浏览器请求,避免被目标网站的反爬机制拦截。 - 精准定位数据:直接通过
love-icon pl-icon js-favorite-restaurant类定位div,从其data属性中提取名称、位置、价格信息。 - 菜系类型提取:通过父节点关联到餐厅卡片容器,从
card__menu-content--tag标签中获取菜系文本。 - 数据结构化:用列表字典存储每条餐厅数据,最终转换为DataFrame,便于后续分析或导出。
内容的提问来源于stack exchange,提问作者Meditation
相关产品推荐
相关产品推荐

