Selenium调用Chrome webdriver访问宜家站点商品数与常规浏览器不一致
问题成因
- webdriver指纹未完全绕过:你配置的两个参数仅屏蔽了最基础的自动化标记,ChromeDriver本身还有大量可被检测的特征,比如
window.navigator.webdriver属性默认值为true、浏览器插件/语言配置异常、webdriver特有的cdc变量残留等,站点的反爬脚本识别到这些特征后,会截断返回商品列表。你修改的UA属于最基础的识别项,单独修改无法绕过当前站点的反爬策略。 - 懒加载逻辑未完全触发:该站点商品列表采用滚动懒加载机制,常规浏览器访问时用户滚动会触发后续商品加载,而Selenium默认打开页面后不会主动执行滚动操作,仅加载首屏及前几屏的68件商品,容易被误认为是反爬拦截。
- 站点前置交互未完成:常规浏览器会保留之前的Cookie同意记录、地区选择配置,而Selenium每次启动为纯净环境,若未主动完成Cookie授权、地区匹配的交互,站点会返回默认的部分商品列表。
- IP请求频率触发限流:若短时间内多次用Selenium发起访问,站点会对当前IP做临时限流,仅返回部分内容。
解决方案
- 完整绕过自动化特征检测
除已有配置外,补充添加以下启动参数:
也可直接使用# 屏蔽自动化控制标记 chrome_opt.add_argument("--disable-blink-features=AutomationControlled") # 模拟真实浏览器启动配置 chrome_opt.add_argument("--start-maximized") chrome_opt.add_argument("--disable-extensions") chrome_opt.add_argument("--no-first-run")undetected-chromedriver库替代原生ChromeDriver,无需手动配置即可绕过绝大多数webdriver特征检测。 - 模拟滚动触发完整商品加载
页面加载完成后,执行多次滚动操作,等待所有商品加载完成后再提取数据,示例代码如下:import time # 多次滚动到页面底部,触发懒加载 for _ in range(5): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) - 补全站点必要交互
页面加载后优先处理Cookie同意弹窗、地区选择弹窗,确保站点返回对应区域的完整商品数据:from selenium.webdriver.common.by import By # 点击同意Cookie try: driver.find_element(By.ID, "onetrust-accept-btn-handler").click() time.sleep(1) except: pass - 控制访问频率,必要时使用代理
单次访问间隔控制在30秒以上,若出现IP限流,切换代理IP后再发起访问。
内容的提问来源于stack exchange,提问作者Alain
相关产品推荐
相关产品推荐

