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

CB2网站图片爬取:Selenium还是POST请求方案更合适?

解决方案:CB2网站沙发数据爬取问题处理

问题分析

前8个商品有效、后续显示占位图的核心原因是滚动触发动态加载:CB2的商品列表默认只渲染前8个,只有当页面滚动到底部时,才会通过JS请求加载新商品并渲染。单纯处理图片懒加载无法解决,因为后续商品本身还未被页面加载。

可行爬取方案

方案1:优化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
import time
import random

driver = webdriver.Chrome()
driver.get("https://www.cb2.com/furniture/sofas/1/filters/sofas~2A")
driver.maximize_window()

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # 滚动至页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 随机等待2-4秒,模拟用户行为并避免反爬
    time.sleep(random.uniform(2, 4))
    # 获取新的页面高度
    new_height = driver.execute_script("return document.body.scrollHeight")
    # 高度不变则停止滚动
    if new_height == last_height:
        break
    last_height = new_height

# 等待所有商品卡片加载完成
products = WebDriverWait(driver, 15).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[data-test='product-card']"))
)

# 提取商品数据
for product in products:
    name = product.find_element(By.CSS_SELECTOR, "[data-test='product-name']").text
    img_elem = product.find_element(By.TAG_NAME, "img")
    # 优先取真实图片地址,兼容懒加载的data-src属性
    img_url = img_elem.get_attribute("src") or img_elem.get_attribute("data-src")
    print(f"商品名称: {name}\n图片地址: {img_url}\n---")

driver.quit()
  • 关键细节:
    • 滚动后必须留足等待时间,确保JS完成新商品的渲染
    • 图片地址可能存储在data-src(懒加载属性),需同时检查src和data-src
    • 加入随机延迟,避免被网站反爬机制识别

方案2:抓包获取真实数据API

若想绕过Selenium,可通过浏览器抓包找到商品数据的真实接口:

  1. 打开浏览器开发者工具(F12),切换到Network标签,清空现有请求
  2. 滚动页面加载新商品,筛选XHR/Fetch类型请求,寻找包含商品列表的接口(URL通常含product、list、api等关键词)
  3. 复制该请求的Request URL、请求头(尤其是Cookie、Authorization等验证字段)和查询参数
  4. 用requests库直接请求该接口,解析返回的JSON数据获取商品信息
  • 注意:这类接口可能需要携带登录状态的Cookie,需从浏览器请求中复制对应字段到代码中

反爬注意事项

  • 控制请求频率,加入随机延迟,避免IP被封禁
  • 模拟真实用户的请求头(如User-Agent、Accept-Language)
  • 爬取量较大时,可使用代理IP轮换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:32:21