Jsoup 解析 Youtube 页面
Jsoup to parse Youtbue page
我正在使用 Jsoup 解析 YouTube 页面,但我得到的内容与从浏览器得到的内容不同
代码
我从 Jsoup 获取的内容,body 以
开头
<iframe src="https://accounts.google.com/ServiceLogin?uilel=3&service=youtube&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26feature%3Dpassive%26next%3D%252Fsignin_passive%26hl%3Dar&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()
我正在使用 Jsoup 解析 YouTube 页面,但我得到的内容与从浏览器得到的内容不同 代码
我从 Jsoup 获取的内容,body 以
开头 <iframe src="https://accounts.google.com/ServiceLogin?uilel=3&service=youtube&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26feature%3Dpassive%26next%3D%252Fsignin_passive%26hl%3Dar&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()