使用BeautifulSoup无法抓取家乐福阿联酋网站产品信息的问题
问题原因及解决方案
为什么你的代码返回空列表?
- 动态内容渲染:该网站的产品数据是通过JavaScript异步加载的,
requests.get()只能获取初始静态HTML,此时产品相关DOM元素还未生成,所以BeautifulSoup无法找到目标元素。 - 反爬拦截可能性:你的请求缺少必要请求头(比如
User-Agent),网站可能将其识别为爬虫,返回的内容不含产品数据。 - 选择器失效:你用的
css-1wgjvs这类class名称是前端框架动态生成的,会随页面更新或会话变化,不是稳定的定位标识。
如何抓取该网站的产品详情?
方法1:用Selenium模拟浏览器渲染
Selenium能模拟真实浏览器加载页面,等待动态内容渲染完成后再提取数据,示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Chrome浏览器(需对应版本的chromedriver) driver = webdriver.Chrome() driver.get('https://www.carrefouruae.com/mafuae/en/c/F21600000') # 等待产品列表加载完成 try: # 用更稳定的属性定位产品卡片容器 product_cards = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div[data-testid="product-card"]')) ) # 提取产品名称和价格 for card in product_cards: name = card.find_element(By.CSS_SELECTOR, 'h3[data-testid="product-name"]').text price = card.find_element(By.CSS_SELECTOR, 'span[data-testid="current-price"]').text print(f"产品名称: {name}, 价格: {price}") finally: driver.quit()
方法2:直接调用API接口(更高效)
通过浏览器开发者工具抓包,找到加载产品数据的API接口,直接请求获取JSON格式数据:
- 打开浏览器开发者工具(F12),切换到Network标签,刷新页面后筛选XHR/Fetch请求。
- 找到包含产品列表的接口(类似
/api/products的请求),复制其URL、请求头和参数。 - 用
requests直接请求接口,示例代码:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'application/json', # 其他必要请求头(如Cookie、Authorization,从抓包结果复制) } # 替换为实际的API接口URL api_url = 'https://www.carrefouruae.com/mafuae/api/v1/products?categoryId=F21600000&...' response = requests.get(api_url, headers=headers) products = response.json() # 提取产品名称和价格 for product in products['data']: name = product['name'] price = product['price']['current'] print(f"产品名称: {name}, 价格: {price}")
注意事项
- 频繁请求可能触发反爬,建议添加请求间隔(
time.sleep()),避免IP被封禁。 - API接口的参数或请求头可能随网站更新变化,需要定期检查调整。
内容的提问来源于stack exchange,提问作者Monika
相关产品推荐
相关产品推荐

