首页 > 解决方案 > Jsoup 解析 Youtube 页面

问题描述

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

我从 Jsoup 得到的内容,正文

  <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 --> 

而从浏览器正文开始

 <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

标签: web-scrapingjsoup

解决方案


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

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

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


推荐阅读