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

Python Selenium无法抓取网页HTML源码中存在的元素问题求助

排查与解决Selenium抓取Mvideo推荐产品链接失败的问题

我帮你分析了一下问题,结合你给出的代码和场景,大概率是无头模式的渲染限制、等待条件不精准以及元素定位逻辑偏差这几个因素导致的,下面一步步给你拆解解决:

核心问题分析

  1. 无头模式窗口尺寸限制:Chrome无头模式默认窗口极小,而Mvideo是响应式网站,小窗口下推荐产品区域可能不会被渲染,或是被隐藏在视口外,这就会出现你能看到源码但抓不到元素的情况。
  2. 等待条件不够严格:presence_of_element_located只保证元素存在于DOM中,但不保证它已经被渲染可见,动态加载的元素可能还处于未显示状态。
  3. 元素定位逻辑有误:你直接抓取mvideo-product-card-compare标签,但实际产品链接是嵌套在这个标签内的<a>元素里的,直接抓标签本身拿不到有效的href属性。
  4. 自动化特征被检测:Chrome无头模式默认会带上webdriver相关属性,部分网站会通过这个识别自动化工具,进而限制内容加载。

修正后的代码方案

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from time import sleep

def getAdLinks(url):
    chrome_options = Options()
    chrome_options.add_argument('--headless=new')  # 采用新版无头模式,行为更接近正常浏览器
    chrome_options.add_argument('--window-size=1920,1080')  # 设置桌面级窗口尺寸,避免响应式布局隐藏内容
    chrome_options.add_argument('user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36')
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')  # 隐藏自动化标识,规避反爬检测
    chrome_options.add_argument('--disable-dev-shm-usage')  # 解决Linux环境下的资源限制问题
    chrome_options.add_argument('--no-sandbox')  # 禁用沙箱,适配无头模式运行

    driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)
    try:
        driver.get(url)
        sleep(1)
        
        # 关闭弹窗(保留你原有的逻辑)
        driver.find_element_by_css_selector('body > mvid-root > mvid-modal-container-old > mvid-modal-old > div > div > div > mvid-icon').click()
        sleep(1)

        # 等待目标区域可见,而非仅存在于DOM中
        compare_block = WebDriverWait(driver, 20).until(
            EC.visibility_of_element_located((By.ID, 'PRODUCTS_TO_COMPARE_BLOCK_ID'))
        )
        
        # 滚动到目标区域,触发可能的懒加载逻辑
        driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", compare_block)
        sleep(2)  # 给动态加载留足时间

        # 直接定位标签内的<a>元素,获取有效链接
        links = driver.find_elements(By.CSS_SELECTOR, 'mvideo-product-card-compare a')
        
        # 过滤出有效的产品链接
        filtered_links = [link.get_attribute('href') for link in links if '/products' in link.get_attribute('href')]
        
        print(f"找到有效推荐产品链接数量: {len(filtered_links)}")
        for link in filtered_links:
            print(link)
    finally:
        driver.quit()  # 确保浏览器进程正常关闭

# 调用测试
getAdLinks("https://www.mvideo.ru/products/lazernoe-mfu-hp-neverstop-laser-1200w-4ry26a-30044796")

关键修改点说明

  • 新版无头模式:--headless=new替代旧版--headless,渲染逻辑更接近正常Chrome,减少页面加载差异。
  • 固定窗口尺寸:强制设置1920x1080的窗口,确保网站加载完整的桌面版布局,推荐区域不会被响应式规则隐藏。
  • 隐藏自动化特征:移除Chrome的webdriver标识,避免被网站反爬机制识别为自动化工具。
  • 等待元素可见:把presence_of_element_located换成visibility_of_element_located,确保元素已经渲染到页面并可见。
  • 滚动触发加载:通过JS滚动到目标区域,触发懒加载逻辑,保证推荐产品内容完全加载。
  • 精准定位链接:直接抓取mvideo-product-card-compare下的<a>元素,直接获取产品链接的href属性。

额外排查建议

如果问题仍存在,可以尝试:

  • 暂时去掉无头模式,用正常浏览器运行代码,观察页面加载流程,确认是否有其他需要处理的弹窗或验证步骤。
  • 延长等待时间,或是使用EC.presence_of_all_elements_located等待所有推荐产品元素加载完成。
  • 检查页面网络请求,若推荐产品数据是通过AJAX接口加载的,直接调用接口获取数据会比Selenium更高效稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:07:31