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

数据爬取函数在视频和图片均未找到时性能异常缓慢

问题分析与优化方案

问题根源

你遇到的性能爆炸问题,核心是错误使用WebDriverWait检查元素是否存在,叠加大量无媒体元素的场景导致超时等待累加。

你的self._wait设置了2秒超时,但每次查找视频/图片时,WebDriverWait会不断重试调用find_element——因为find_element找不到元素时抛出的NoSuchElementException不在WebDriverWait默认忽略列表中,导致重试逻辑一直执行到超时。当爬取大量无媒体元素时,每个元素的两次等待(视频2秒+图片2秒)累加,总耗时就会突破10分钟。

优化方案

方案1:直接用find_elements(推荐,性能最优)

find_elements(复数形式)会立即返回匹配元素的列表,为空则表示元素不存在,完全不需要等待,能把单元素处理时间从秒级降到毫秒级。

优化后的代码:

def _get_video_or_img(self, desc_element: WebElement) -> str:
    # 查找video元素
    videos = desc_element.find_elements(By.TAG_NAME, 'video')
    if videos:
        return videos[0].get_attribute("src")
    
    # 查找图片元素
    images = desc_element.find_elements(By.CSS_SELECTOR, self._css_image_locator)
    if images:
        return images[0].get_attribute("src")
    
    # 两者都不存在的情况
    self._pprint_overrider(status="Both video and image not found", info_type=3, logs=True)
    return self._not_available

方案2:保留WebDriverWait(适配动态加载场景)

如果页面是动态加载(媒体元素可能延迟出现),可以保留WebDriverWait,但必须配置忽略异常,避免无意义的重试:

首先修改_wait的初始化:

from selenium.common.exceptions import NoSuchElementException

# 添加忽略NoSuchElementException,避免反复重试
self._wait = WebDriverWait(driver, 2, ignored_exceptions=[NoSuchElementException])

然后修改函数逻辑:

def _get_video_or_img(self, desc_element: WebElement) -> str:
    try:
        video = self._wait.until(lambda d: desc_element.find_element(By.TAG_NAME, 'video')).get_attribute("src")
        return video
    except TimeoutException:
        try:
            image = self._wait.until(lambda d: desc_element.find_element(By.CSS_SELECTOR, self._css_image_locator)).get_attribute("src")
            return image
        except TimeoutException:
            self._pprint_overrider(status="Both video and image not found", info_type=3, logs=True)
        except Exception as e:
            self._pprint_overrider(status=f"An error occurred while finding image: {e}", info_type=3, logs=True)
    except Exception as e:
        self._pprint_overrider(status=f"An error occurred while finding video: {e}", info_type=3, logs=True)
    return self._not_available

额外优化建议

  • 简化CSS选择器:如果图片选择器a > div > img[alt]可以简化(比如直接用img[alt],不会误匹配的话),能进一步提升查找速度。
  • 批量处理:如果爬取的元素数量极大,可以考虑批量定位所有媒体元素,再逐个关联到对应的描述元素,减少重复查找开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:14:54