web-scraping - Jsoup 解析 Youtube 页面
问题描述
我正在使用 Jsoup 解析YouTube页面,但我得到的内容与我从浏览器代码中得到的内容不同
我从 Jsoup 得到的内容,正文 以
<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 -->
而从浏览器正文开始
<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 发送的标头返回不同的内容。
要调试此类问题,我建议在打开网络开发人员工具的情况下在 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()
推荐阅读
- swift - 当变量嵌套在对象中时,如何使用 SwiftUI 将绑定传递给子视图?
- hyperledger-fabric - 一个组织的 sdk 客户端如何向另一个组织背书节点发送交易请求
- google-cloud-platform - 要求最小有效行比率达到 0.50 来训练模型,而得到比率 0.096547
- angular - 将 ngif 指令应用于
- 元素?
- soapui - 如何在 SOAP UI 中通过绑定“传输 clientCredentialType="Windows"”访问 SOAP API
- amazon-emr - 如何将 EMR 笔记本限制为特定用户或 IP?
- dart - darjs 中的 for in 的替代方法是什么?
- mongodb - 如何为 MongoDB Atlas 上的数据库设置 Python EVE REST API 服务设置
- python-3.x - 我如何从线程中的每个请求中获取新的 IP?
- excel - VBA - 隐藏单独的行,没有范围