为什么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
相关产品推荐
相关产品推荐

