首页 > 解决方案 > 我将如何/在 Node 中使用什么来抓取

问题描述

我特别想在这个特定的示例链接中抓取视频 src 道具:

https://clips.twitch.tv/embed?clip=HyperHandsomeWatermelonTBTacoRight&tt_medium=clips_api&tt_content=embed

我已经尝试过 request-promise 和cheerio,但不幸的是它们不允许加载脚本,我认为这是这个特定示例所必需的。

我已经尝试过 puppeteer,它成功地抓取了视频 src 链接,但是 puppeteer 对于我的目的而言效率极低且速度很慢(抓取多个链接)。

我一直在尝试 JSDom,因为它允许在抓取之前加载脚本,但是我无法准确找到如何将 JSDom 用于我的特定用例。任何帮助或见解将不胜感激,谢谢!

标签: javascriptnode.jsreactjs

解决方案


在这种情况下,<video>服务器的响应中不存在该元素。它仅在页面上完成一些脚本后才会出现,该页面在浏览器中运行。

要解决这个问题,你需要一个无头浏览器,它可以加载页面、执行脚本、等待网络调用和代码渲染。您提到使用 Puppeteer 时遇到性能问题,幸运的是,有很多无头浏览器,请查看此无头浏览器列表


至于您使用 Twitch.tv 的具体情况,不如直接向 Twitch API 发出请求?查看对视频状态的调用。

从那里获取源代码:

function async getSrcFromUrl(url) {

    // Figure out how to parse the clip name (HyperHandsomeWatermelonTBTacoRight)
    const clip = getClipNameFromURL(url); 

    // Then fetch
    const status = JSON.parse(await request(`https://clips.twitch.tv/api/v2/clips/${clip}/status`));
    return status.quality_options[0].source;
}

const src = await getSrcFromUrl("https://clips.twitch.tv/embed?clip=HyperHandsomeWatermelonTBTacoRight&tt_medium=clips_api&tt_content=embed");

推荐阅读