【问题标题】:How to get link to third party site in 'about channel' section via python如何通过python在“关于频道”部分获取第三方网站的链接
【发布时间】:2021-12-20 13:41:51
【问题描述】:

我想在文本文档中显示有关 YouTube 个人资料中的链接的信息,我尝试通过请求库来实现,但 Google 提供了隐私和安全的链接,我在 YouTube API 文档中没有找到相关信息.谁知道,你可以帮忙解决这个问题

【问题讨论】:

  • 啊,Stackoverflow 在你尝试的时候效果最好,它不起作用,你分享代码,然后然后我们评论它

标签: youtube-api


【解决方案1】:

这不可能使用 YouTube API,我实际上发现自己需要做和自己一样的事情,但由于 YouTube API 缺乏必要的功能而无法做到(希望很快就会添加!)

我看到你提到了 Python,我唯一的解决方案是在 Node 中,但我会做一个大的解释,你可以基于它来编写你的代码。为了在没有 YouTube API 的情况下获取横幅链接,我们需要抓取数据,因为 YouTube 使用客户端渲染,我们需要从源中抓取 JSON 配置。

在名为ytInitialData 的脚本中定义了一个变量,它是一个很大的 JSON 字符串,包含有关频道、观众和 YouTube 配置的大量信息。我们可以通过这个JSON链接解析找到banner链接。

const request = require("request-promise").defaults({
  simple: false,
  resolveWithFullResponse: true
})

const getBannerLinks = async () => {
  return request("https://www.youtube.com/user/pewdiepie").then(res => {
    if (res.statusCode === 200) {
      const parsed = res.body.split("var ytInitialData = ")[1].split(";</script>")[0]
      const data = JSON.parse(parsed)
      const links = data.header.c4TabbedHeaderRenderer.headerLinks.channelHeaderLinksRenderer
      const allLinks = links.primaryLinks.concat(links.secondaryLinks || [])

      const parsedLinks = allLinks.map(l => {
        const url = new URLSearchParams(l.navigationEndpoint.commandMetadata.webCommandMetadata.url)
        return {
          link: url.get("q"),
          name: l.title.simpleText,
          icon: l.icon.thumbnails[0].url
        }
      })

      return parsedLinks
    } else {
      // Error/ratelimit - Handle here
    }
  })
}

链接的抓取方式如下:

  • 我们向频道的 URL 发出 HTTP 请求
  • 我们使用split解析正文以提取横幅链接所在的JSON字符串
  • 我们将 JSON 字符串解析为 JSON 对象
  • 我们从他们的 JSON 部分中提取链接(这是一个很大的 JSON 对象data.header.c4TabbedHeaderRenderer.headerLinks.channelHeaderLinksRenderer
  • 因为有两种类型的链接(主要的,一种显示文本的链接和次要的,不显示文本的链接),我们必须将它们连接在一起,以便我们可以通过它们进行映射
  • 然后我们通过链接映射并使用 URLSearchParams 提取 q 查询参数,因为 YouTube 会加密它们的传出链接(很可能是出于安全原因),然后也使用相应的对象提取名称和图标。

这不是一个完美的解决方案,如果 YouTube 更新/更改其前端的任何内容,这可能很容易破坏您的程序。 YouTube 对他们的软件也有速率限制,如果您尝试批量抓取,则会遇到 429/403 错误。

【讨论】:

  • Спасибо за ответ, сейчас попробую переписать код на python, и посмотрим что выйдет)
猜你喜欢
  • 2019-01-02
  • 2016-01-25
  • 2016-12-23
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2017-05-26
  • 2019-09-14
  • 1970-01-01
相关资源
最近更新 更多