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,可通过浏览器抓包找到商品数据的真实接口:
- 打开浏览器开发者工具(F12),切换到Network标签,清空现有请求
- 滚动页面加载新商品,筛选XHR/Fetch类型请求,寻找包含商品列表的接口(URL通常含
product、list、api等关键词) - 复制该请求的Request URL、请求头(尤其是
Cookie、Authorization等验证字段)和查询参数 - 用
requests库直接请求该接口,解析返回的JSON数据获取商品信息
- 注意:这类接口可能需要携带登录状态的Cookie,需从浏览器请求中复制对应字段到代码中
反爬注意事项
- 控制请求频率,加入随机延迟,避免IP被封禁
- 模拟真实用户的请求头(如
User-Agent、Accept-Language) - 爬取量较大时,可使用代理IP轮换
内容的提问来源于stack exchange,提问作者br1saturno
相关产品推荐
相关产品推荐

