Jsoup 解析 Youtube 页面

Jsoup to parse Youtbue page

我正在使用 Jsoup 解析 YouTube 页面,但我得到的内容与从浏览器得到的内容不同 代码

我从 Jsoup 获取的内容,body

开头
  <iframe src="https://accounts.google.com/ServiceLogin?uilel=3&amp;service=youtube&amp;passive=true&amp;continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26feature%3Dpassive%26next%3D%252Fsignin_passive%26hl%3Dar&amp;hl=ar" style="display: none"></iframe><!-- end of chunk --> 

while from browser body

开头
 <body dir="rtl" >
    <script >
      if (window.ytcsi) {window.ytcsi.tick("bs", null, '');}      ytcfg.set('initialBodyClientWidth', document.body.clientWidth);

      window.ytcfg.set('SERVICE_WORKER_KILLSWITCH', false);
    </script>

我的代码



fun main(){
parse("https://www.youtube.com/playlist?list=PL2-FkZlJhxqVXZO1c6gKgsAdiet0zcOAO")
}

fun parse(baseLink: String) {
    val doc: Document = Jsoup.connect(baseLink).get()
    println("contennt : ${doc.body()}")
   // val items = doc.select("a.ytd-playlist-video-renderer")
    val items = doc.select("ytd-playlist-video-renderer")
    items.forEach {
        // print header
        println("Item : $it")
        val img = it.select("imge#img")
        val imgLink = img.attr("src")
        println("Image : $img , Link $imgLink")
    }
}

Jsoup 版本 1.13.1

我没有具体的答案,但根据经验,我可以说这种行为在 YouTube 等复杂网站中很常见。 Web 服务器将根据您的浏览器或 Jsoup 发送的 header 发送不同的内容。

要调试此类问题,我建议在 Chrome 或打开网络开发人员工具的 Firefox 中发出请求。 Select URL 的请求,右键单击并复制为 cURL。将其粘贴到记事本中,并在您的终端中发出此 curl 请求。它应该 return HTML 与您的网络浏览器中的完全相同。在您的记事本中,删除 cookie header 并重试 - 看看它是否仍然包含您想要的内容。然后尝试将其他 header 一个一个地删除。试着想出你能给出正确响应的最简单的 curl 命令。您会发现一些 headers,如果丢失,将导致 Youtube returning 有所不同。一旦您无法进一步简化 curl 命令,将这些 header 复制到 JSoup,您应该会发现它的工作原理是一样的。例如,您可能需要执行以下操作:

val doc: Document = Jsoup.connect(baseLink).header("Accept-Language", "en-GB,en;q=0.5").get()