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

使用Python爬取Emma Sleep官网商品价格返回值错误如何解决

问题原因与修正方案

问题原因

  • 你定位的installment__full-price类对应的是商品的划线原价,不是折扣后的实际售价
  • 该站点的前端售价为JavaScript动态渲染内容,直接请求静态HTML时,面向用户展示的实际售价标签还没有被赋值,你拿到的$1,000.00是预设的原价占位值
  • 你观察到的目标价格存在script标签中是正确的,这类电商站点通常会把完整的商品元数据提前写入静态的script标签中,供前端JS调用渲染

修正方案

  1. 给请求添加浏览器UA头,避免站点返回反爬的异常页面内容
  2. 定位页面中存储商品数据的script标签,提取JSON格式的价格数据后解析
  3. 过滤提取出对应折扣后的实际售价

修正后代码

import requests
from bs4 import BeautifulSoup
import json
import re

web_url = 'https://www.emma-sleep.com.au/diamond-hybrid/'
# 添加请求头伪装浏览器,避免反爬拦截
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
web_response = requests.get(web_url, headers=headers)
b_soup = BeautifulSoup(web_response.text, 'html.parser')

# 方式1:提取schema结构化数据中的售价(通用性高)
price_script = b_soup.find('script', type='application/ld+json').string
product_data = json.loads(price_script)
actual_price = product_data['offers']['price']
print(actual_price)

# 方式2:如果schema无对应数据,可提取全局变量dataLayer中的售价
# data_layer_match = re.search(r'window.dataLayer = (\[.*?\]);', web_response.text, re.S)
# if data_layer_match:
#     data_layer = json.loads(data_layer_match.group(1))
#     for item in data_layer:
#         if 'ecommerce' in item and 'detail' in item['ecommerce']:
#             actual_price = item['ecommerce']['detail']['products'][0]['price']
#             print(actual_price)

运行上述代码即可得到目标价格674.55。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:15:03