菜单

通用和嵌入式提取器

相关源文件

目的与范围

本文档详细介绍了 You-Get 中的通用和嵌入式提取器,它们充当媒体提取的回退机制,以防站点特定提取器不可用。这些组件通过分析 HTML 结构、嵌入式播放器以及网络媒体共有的通用模式来尝试从不支持的网站提取媒体。

有关这些回退机制所补充的基础提取器系统的信息,请参阅 提取器系统VideoExtractor 基类

来源: src/you_get/extractors/universal.py1-179 src/you_get/extractors/embed.py1-146

与整体系统的关系

通用和嵌入式提取器是扩展 You-Get 功能超越特定支持网站的关键组件。当没有站点特定提取器可以处理给定的 URL 时,它们充当最终的回退。

来源: src/you_get/extractors/universal.py8-179 src/you_get/extractors/embed.py67-141

通用提取器

通用提取器实现在 universal.py 中,提供通用媒体提取功能。它通过内容分析和模式匹配,尝试从任意网站查找和下载媒体内容。

通用提取器的工作原理

来源: src/you_get/extractors/universal.py8-174 src/you_get/extractors/universal.py67-74

关键提取策略

通用提取器采用多种策略来查找网页中的媒体

  1. 内容类型分析:

    • 确定 URL 指向的是 HTML 内容还是直接媒体
  2. 嵌入式媒体检测:

    • 首先尝试嵌入式提取器来查找已知的嵌入式播放器
  3. Meta 视频标签:

    • 搜索 <meta property="og:video:url" content="..."> 标签
  4. HLS 流检测:

    • 查找 HTTP Live Streaming (.m3u8) URL
  5. 媒体文件扩展名搜索:

    • 查找常见的媒体扩展名(.flv, .mp3, .mp4, .webm 等)
    • 处理 URL 编码和转义的 URL
  6. 图片链接检测:

    • 检查指向图片文件的 href 属性
    • 检查高宽度 <img> 标签
    • 解析相对路径和站点内相对路径
  7. MPEG-DASH MPD 检测:

    • 查找并处理 MPEG-DASH manifest 文件

来源: src/you_get/extractors/universal.py25-122 src/you_get/extractors/universal.py67-74

媒体文件模式匹配

通用提取器使用正则表达式在页面中查找媒体 URL。以下是它查找的主要模式:

模式类型目的示例模式
视频文件查找常见的视频格式\.flv, \.mp4, \.webm
音频文件查找音频格式\.mp3
高分辨率图片查找可能的媒体图片[-_]1\d\d\d\.jpe?g
编码的 URL查找 URL 编码的媒体https?%3A%2F%2F[^;&"]+\.mp4[^;&"]*
转义的 URL查找 JavaScript 转义的 URLhttps?:\\\\/\\\\/[^ ;"\'<>]+\.mp4[^ ;"\'<>]*
链接的媒体在链接 href 属性中查找媒体href="(https?://[^"]+\.jpe?g)"
相对路径解析相对媒体链接href="(\.[^"]+\.png)"

来源: src/you_get/extractors/universal.py67-113

嵌入式提取器

嵌入式提取器实现在 embed.py 中,专门用于识别来自各种平台的嵌入式媒体播放器。当它找到一个已知的播放器时,它会调用相应的站点特定提取器来处理媒体。

嵌入式提取器的工作原理

来源: src/you_get/extractors/embed.py67-141

支持的嵌入式播放器

嵌入式提取器使用正则表达式模式识别各种平台的嵌入式播放器

平台模式示例备注
优酷youku\.com/v_show/id_([a-zA-Z0-9=]+)多种模式用于不同的嵌入样式
土豆tudou\.com[a-zA-Z0-9\/\?=\&\.\;]+code=([a-zA-Z0-9_-]+)\&匹配播放器 URL 和嵌入代码
爱奇艺player\.video\.qiyi\.com/([^/]+)/[^/]+/[^/]+/[^/]+\.swf[^"]+tvId=(\d+)提取播放器 ID 和视频 ID
Bilibilistatic\.hdslb\.com/miniloader\.swf.*aid=(\d+)提取 Bilibili AV ID
网易(http://\w+\.163\.com/movie/[^\'"]+)匹配完整的视频 URL
Vimeoplayer\.vimeo\.com/video/(\d+)提取视频 ID
Dailymotionwww\.dailymotion\.com/embed/video/(\w+)提取视频 ID
BokeCCbokecc\.com/flash/pocle/player\.swf\?siteid=(.+?)&vid=(.{32})提取站点 ID 和视频 ID

来源: src/you_get/extractors/embed.py20-62

Iframe 递归

嵌入式提取器的一个关键特性是它能够递归地搜索 iframes

  1. 如果在主页面内容中找不到嵌入,它会提取所有 iframe 的 src URL
  2. 对于每个 iframe,它会递归调用 embed_download() 直到达到限制(recur_limit = 3
  3. 这使得提取器能够找到深度嵌套的嵌入式播放器

来源: src/you_get/extractors/embed.py122-141

提取器之间的交互

通用和嵌入式提取器作为具有特定关系的备用机制协同工作

  1. 对于不受支持的网站,首先调用通用提取器
  2. 对于 HTML 内容,通用提取器尝试使用嵌入式提取器
  3. 如果嵌入式提取器成功,通用提取器将返回
  4. 如果嵌入式提取器失败,通用提取器将尝试自己的提取方法
  5. 嵌入式提取器可以递归解析 iframe,可能找到深度嵌套的媒体

来源: src/you_get/extractors/universal.py14-19 src/you_get/extractors/embed.py67-141

用法和边缘情况

何时使用通用和嵌入式提取器

  1. 未知网站:当域名没有站点特定提取器时
  2. 支持网站上的新格式:当站点更新导致现有提取器失效时
  3. 通用媒体文件:用于直接下载媒体文件

局限性

  1. 基于模式的提取:依赖于识别常见模式,这可能会因网站更改而中断
  2. 不支持身份验证:无法处理需要登录的网站
  3. 有限的 JavaScript 支持:无法执行 JavaScript 来显示隐藏内容
  4. 仅嵌入式支持:对于某些站点,只有当媒体嵌入自支持的平台时,才能提取

错误处理

  • 通用提取器尝试多种提取方法,即使某些方法失败也会继续进行
  • 嵌入式提取器在未找到嵌入式媒体时会引发 NotImplementedError(但仅在顶层,递归过程中不会)
  • 这两个提取器都包含大量的 try-except 块来优雅地处理错误

来源: src/you_get/extractors/universal.py9-19 src/you_get/extractors/embed.py138-141

总结

通用和嵌入式提取器提供了一个强大的备用机制,极大地扩展了 You-Get 的能力,使其超越了专门支持的网站。它们通过以下方式工作:

  1. 顺序备用:按顺序尝试多种提取方法
  2. 模式识别:使用正则表达式查找媒体 URL
  3. 递归解析:检查嵌入式内容和 iframes
  4. 利用站点特定提取器:识别来自受支持站点的嵌入式播放器

这些组件体现了“尝试从任何地方提取”的原则,使 You-Get 更加通用,并且对网站更改具有更强的弹性。虽然不如专门的站点提取器可靠,但它们使得 You-Get 能够处理比其他方式更广泛的网站。

来源: src/you_get/extractors/universal.py1-179 src/you_get/extractors/embed.py1-146