数据爬取函数在视频和图片均未找到时性能异常缓慢
问题分析与优化方案
问题根源
你遇到的性能爆炸问题,核心是错误使用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
相关产品推荐
相关产品推荐

