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

使用soup.find()爬取Wayfair页面返回None的问题求助

问题排查与解决方案

核心原因分析

  • 反爬机制拦截:Wayfair会识别非浏览器发起的请求,直接使用requests.get()时,默认请求头会被判定为爬虫,返回的页面内容和浏览器实际加载的完全不同,导致你找不到目标元素。
  • 动态内容渲染:页面中的商品列表等核心内容是通过JavaScript动态生成的,requests只能获取静态HTML源码,无法获取JS渲染后的DOM结构,你基于浏览器开发者工具看到的元素ID、Class在静态源码里根本不存在。
  • 动态Class名:你使用的_1yxeg5wb_6101、oakhm627_6101这类Class名是网站动态生成的,会随时变化,就算拿到渲染后的页面,后续也会因为Class更新导致代码失效。

修正步骤与代码示例

1. 模拟浏览器请求(解决基础反爬)

给requests.get()添加浏览器风格的请求头,至少包含User-Agent,让网站认为你是正常用户访问:

import requests
from bs4 import BeautifulSoup

URL = "https://www.wayfair.com/furniture/sb2/office-chairs-on-sale-c478390-a69117~8-a69117~12.html?itemsperpage=96&sortby=2&curpage=2"
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"
}

page = requests.get(URL, headers=headers)
# 可以先打印page.text确认是否拿到了正确的页面内容
# print(page.text)

2. 处理动态渲染内容(更稳定的方案)

如果添加请求头后仍拿不到目标内容,说明页面依赖JS渲染,需要用selenium模拟浏览器加载完整页面:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

URL = "https://www.wayfair.com/furniture/sb2/office-chairs-on-sale-c478390-a69117~8-a69117~12.html?itemsperpage=96&sortby=2&curpage=2"

# 配置Chrome无头模式(不弹出浏览器窗口)
chrome_options = Options()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("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")

driver = webdriver.Chrome(options=chrome_options)
driver.get(URL)

# 获取JS渲染后的完整页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")
driver.quit()

3. 使用稳定选择器替代动态Class

放弃动态生成的Class名,改用基于语义化属性或通用结构的选择器,比如依赖data-test属性、标签层级等:

# 假设商品卡片都在包含"ProductCard"关键词的容器中(实际需根据渲染后的源码调整)
items = soup.find_all("div", class_=lambda x: x and "ProductCard" in x)

for item in items:
    # 获取商品链接
    link_tag = item.find("a", href=True)
    link = "https://www.wayfair.com" + link_tag["href"] if link_tag else "无链接"
    
    # 获取价格信息(通过aria-label属性区分促销价和原价)
    sale_price = None
    original_price = None
    price_tags = item.find_all("span", attrs={"aria-label": True})
    for tag in price_tags:
        label = tag["aria-label"]
        if "Sale Price" in label:
            sale_price = tag.get_text(strip=True)
        elif "Original Price" in label:
            original_price = tag.get_text(strip=True)
    
    print(f"商品链接: {link}\n促销价: {sale_price}\n原价: {original_price}\n---")

额外注意事项

  • Wayfair反爬机制会持续更新,频繁请求可能触发IP封禁,建议添加time.sleep()设置请求间隔。
  • 爬取前请查看Wayfair的robots.txt文件,确认允许爬取的范围,避免违反网站规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:10:22