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

为什么Selenium有时能抓取到href但大多返回空列表且无报错?

问题原因

  • 等待顺序逻辑错误:隐式等待配置只对配置完成后执行的元素查找动作生效,你的代码在browser.get()之后立刻抓取页面源码,之后才设置隐式等待,等待逻辑完全不生效。绝大多数时候页面还没完成异步渲染,商品元素还没插入DOM,拿到的是空的未渲染静态页,自然匹配不到对应a标签,返回空列表。偶尔成功是刚好请求时页面加载速度极快,抓取源码前元素已经渲染完成。
  • 站点反爬拦截:该站点属于Inditex集团,有基础的反爬机制,会识别Selenium自动化工具的特征,识别到爬虫访问时会返回空白页、验证页或者重定向,没有做特征屏蔽的情况下就会出现偶尔成功偶尔失败的情况。
  • 懒加载未触发:站点商品采用懒加载逻辑,只有滚动到对应区域才会渲染商品元素,没有滚动操作的情况下,视口外的商品不会加载到DOM中,也会导致匹配到的元素数量少甚至为空。
  • 代码语法错误:循环提取href时,你直接对find_all返回的列表product_links取href属性,就算匹配到元素也会抛出报错,正确写法应该取循环变量a的href属性。

解决建议

  • 调整等待逻辑,替换为显式等待:页面加载后先等待目标元素加载完成,再抓取页面源码,不要提前抓取未渲染的源码。
  • 增加Selenium反爬屏蔽配置:启动ChromeDriver时添加参数屏蔽自动化特征,避免被站点反爬识别。
  • 触发懒加载:页面加载后执行js滚动到底部,等待所有懒加载商品都渲染完成后再执行元素匹配。
  • 修正代码语法错误,调整href提取逻辑。

修正后参考代码

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from webdriver_manager.chrome import ChromeDriverManager

# 配置Chrome启动参数,屏蔽反爬检测
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')

browser = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)
browser.maximize_window()
urlist = []

try:
    browser.get('https://www.stradivarius.com/tr/kad%C4%B1n/giyim/%C3%BCr%C3%BCne-g%C3%B6re-al%C4%B1%C5%9Fveri%C5%9F/sweatshi%CC%87rt-c1390587.html')
    # 显式等待商品元素加载完成,最长等待30秒
    wait = WebDriverWait(browser, 30)
    wait.until(EC.presence_of_all_elements_located((By.ID, 'hrefRedirectProduct')))
    # 滚动到底部触发懒加载
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    
    html = browser.page_source
    soup = BeautifulSoup(html, 'lxml')
    product_links = soup.find_all('a', {'id':'hrefRedirectProduct'})
    for a in product_links:
        urlist.append(a["href"])
    # 输出测试
    print(f"共获取到{len(urlist)}条商品链接")
finally:
    browser.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:06:04