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

如何定位Shutterstock页面首个推荐视频元素以实现爬虫跳转?

Shutterstock推荐视频爬虫定位问题解决方案

现有代码的核心问题

  • 依赖动态生成的类名(如jss996):这类类名会随页面渲染、版本更新变化,导致元素定位失效。
  • 无显式等待:页面未加载完成就执行操作,容易出现找不到元素或点击无效的情况。
  • 重复获取同一链接:未判断链接是否已存在,可能导致vid_count无法增长,陷入无限循环。
  • 定位source元素时,默认获取当前播放视频的链接,而非推荐视频跳转后的新链接。

修正后的实现方案

关键优化点

  1. 使用稳定的属性选择器替代动态类名,例如页面中带data-test的属性(这类属性通常为测试预留,变更频率低)。
  2. 添加显式等待,确保元素加载完成后再执行操作。
  3. 新增链接去重逻辑,避免重复计数。
  4. 切换视频后等待页面更新,确保获取新的视频链接。

完整代码示例

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 初始化参数
vid_links = set()
num_vids = 5  # 按需修改要获取的视频数量
wait = WebDriverWait(wd, 10)  # 10秒超时等待

while len(vid_links) < num_vids:
    # 等待当前播放视频的source元素加载完成
    current_source = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'source')))
    video_src = current_source.get_attribute('src')
    
    # 仅添加未收录的链接
    if video_src not in vid_links:
        print(f"Added - {video_src}")
        vid_links.add(video_src)
    
    # 达到目标数量则退出循环
    if len(vid_links) >= num_vids:
        print(f"Found: {len(vid_links)} video links, done!")
        break
    
    try:
        # 定位第一个推荐视频缩略图(需根据实际页面结构调整选择器)
        # 示例选择器:推荐区的第一个视频缩略图,使用data-test属性
        first_recommended = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '[data-test="video-thumbnail"]:first-of-type'))
        )
        first_recommended.click()
        
        # 等待页面切换完成(旧的source元素失效)
        wait.until(EC.staleness_of(current_source))
    except Exception as e:
        print(f"获取推荐视频失败: {str(e)}")
        break

注意事项

  • 定期检查页面结构:Shutterstock会更新页面布局,若选择器失效,需重新分析HTML结构调整定位方式。
  • 规避反爬机制:添加随机延时(如time.sleep(random.uniform(1,3))),避免频繁请求被封禁。
  • 使用最新驱动:确保Selenium版本与浏览器驱动版本匹配,避免兼容性问题。

内容的提问来源于stack exchange,提问作者miguel-flores06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:31:13