如何定位Shutterstock页面首个推荐视频元素以实现爬虫跳转?
Shutterstock推荐视频爬虫定位问题解决方案
现有代码的核心问题
- 依赖动态生成的类名(如
jss996):这类类名会随页面渲染、版本更新变化,导致元素定位失效。 - 无显式等待:页面未加载完成就执行操作,容易出现找不到元素或点击无效的情况。
- 重复获取同一链接:未判断链接是否已存在,可能导致
vid_count无法增长,陷入无限循环。 - 定位
source元素时,默认获取当前播放视频的链接,而非推荐视频跳转后的新链接。
修正后的实现方案
关键优化点
- 使用稳定的属性选择器替代动态类名,例如页面中带
data-test的属性(这类属性通常为测试预留,变更频率低)。 - 添加显式等待,确保元素加载完成后再执行操作。
- 新增链接去重逻辑,避免重复计数。
- 切换视频后等待页面更新,确保获取新的视频链接。
完整代码示例
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
相关产品推荐
相关产品推荐

