【问题标题】:Using Jsoup to get youtube href links使用 Jsoup 获取 youtube href 链接
【发布时间】:2021-06-24 18:14:46
【问题描述】:

我目前正在使用 Jsoup 在执行搜索后尝试获取 Youtube 视频的 videoID。我正在尝试从 href 获取 videoID 并使用以下代码:

val doc = Jsoup.connect("https://www.youtube.com/results")
                .data("search_query", s).get()

          for (a in doc.select("a[href]")) {
              Log.d("MAIN", a.attr("abs:href"))
          }

但目前,结果如下所示:

所以我认为 youtube 给了我一个基本的回应,因为我没有用户代理。所以我就这么做了。

我尝试根据previous StackOverflow question添加以下内容

.ignoreContentType(true)
.userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
.referrer("http://www.google.com")
.timeout(12000)
.followRedirects(true)
.execute().parse()

它仍然给了我基本的反应。我想比较Log.d("MAIN", doc.toString()) 的结果,但元标记和随机数只有细微差别。并且由于某种原因,我没有获得文档的完整字符串版本,因此无法进行进一步比较。

搜索后如何获取 youtube 链接? (我想获得一个链接,其中有“watch?v=XXXXXXX”) 如果可能的话,我想要 kotlin 语言的解决方案。

【问题讨论】:

    标签: kotlin web-scraping youtube web-crawler jsoup


    【解决方案1】:

    如果您查看原始 youtube 响应 (doc),您会发现它返回了大量 js 代码(在 <script> 标记内)。此代码包含有关构建 HTML 的说明,您可以在浏览器中看到这些说明。但是Jsoupis not a browser emulator - 它不能执行javascript代码,所以没有你要找的a[href]元素。

    您需要使用其他工具或解析 javascript。幸运的是,在这种情况下,简单的正则表达式就足够了:

    val doc = Jsoup.connect("https://www.youtube.com/results").data("search_query", s).get()
    val regex = "\"videoId\":\"(\\w+)\"".toRegex()
    val videoIds = doc.select("script")
        .map { it.data() }
        .filterNot { it.isEmpty() }
        .flatMap { regex.findAll(it) }
        .map { it.groupValues[1] }
        .distinct()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      相关资源
      最近更新 更多