Selenium爬取Wildberries页面仅加载菜单无法获取商品内容咨询
问题根因
你无法获取商品列表内容,核心是三个问题:
- Wildberries的反爬检测不止覆盖Blink自动化特征,默认Selenium的多个标识点都会被识别,拦截动态数据加载
- 页面商品列表是JS异步渲染的,你发起页面请求后没有等待内容加载完成就直接抓取源码,此时商品节点还没插入DOM
- 你贴的代码本身存在语法错误:
chrome_options=opts)为残缺语句,最后查找节点使用了未定义的text变量,而非你实例化的soup对象。
Selenium 配置调整方案
按以下方式修改启动配置和加载逻辑,即可正常拿到渲染后的页面内容:
- 补全反检测启动参数,不要只加Blink特征禁用项:
- 排除
enable-automation启动开关,移除浏览器顶部的自动化控制提示标识 - 关闭自动化扩展程序,移除
webdriver只读属性的暴露特征 - 替换默认的Selenium User-Agent为真实浏览器UA,若使用无头模式请选用
--headless=new新无头模式,旧版无头模式特征极易被识别
- 排除
- 增加显式等待逻辑,等商品容器节点加载完成后再抓取页面源码,不要在
driver.get()执行后立刻取源码
修正后的可运行代码示例:
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 bs4 url = 'https://www.wildberries.ru/catalog/detyam/odezhda/dlya-devochek/dzhinsy-dzhegginsy' opts = webdriver.ChromeOptions() # 反检测配置 opts.add_argument("--disable-blink-features=AutomationControlled") opts.add_experimental_option("excludeSwitches", ["enable-automation"]) opts.add_experimental_option('useAutomationExtension', False) opts.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') # 若需要无头模式打开下方注释 # opts.add_argument("--headless=new") driver = webdriver.Chrome(options=opts) # 移除webdriver标识 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" }) driver.get(url) # 显式等待10秒,直到商品卡片容器加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'product-card__wrapper')) ) soup = bs4.BeautifulSoup(driver.page_source, 'lxml') # 修正之前的变量名错误,用soup查找节点 container = soup.find_all('div', class_='product-card__wrapper') print(len(container)) # 正常情况下单页会输出100个商品节点 driver.quit()
如果按上面配置还是被检测,可以直接替换为适配过反检测的Chrome驱动包,不需要手动写这些配置,开箱即可绕过常规的自动化检测。
更高效的无浏览器爬取方案
Selenium渲染页面的爬取方式效率极低,Wildberries的商品列表数据是通过公开的前端接口返回的,不需要签名、不需要登录,直接请求接口拿结构化JSON数据的方式稳定性和效率高很多:
- 打开目标分类页时抓包,可以看到返回商品数据的接口路径,接口返回的JSON包含商品ID、标题、价格、评分、库存、图片地址等全量字段,比解析HTML得到的信息更全
- 请求接口时只需要携带正常的浏览器UA,加上对应分类页的Referer头即可正常返回数据,不会被拦截
- 控制请求间隔在1-2秒,不要高频并发请求,就不会触发IP封禁
简单的请求示例代码:
import requests # 替换为你抓包拿到的对应分类接口地址 api_url = "对应分类的商品列表接口地址" 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", "Referer": "https://www.wildberries.ru/" } params = { "appType": "1", "curr": "rub", "dest": "-1257786", "page": "1", # 其他接口参数从抓包信息里补全即可 } resp = requests.get(api_url, headers=headers, params=params) goods_data = resp.json() # 直接从JSON里取商品字段即可,不需要解析HTML
内容的提问来源于stack exchange,提问作者Molly
相关产品推荐
相关产品推荐

