Android如何使用Jsoup爬取savevideo.tube动态页面搜索结果
问题根源
Jsoup本身不支持执行页面JavaScript,只能发起基础HTTP请求、解析静态返回的HTML内容。你遇到的动态加载下载链接场景,本质是点击搜索按钮后,前端通过异步请求向后端接口拉取数据再渲染到页面上,直接向网站首页POST参数根本不会触发这个数据拉取逻辑,自然拿不到结果。
你之前写的代码还有三个明显错误:
- 硬编码的
sid是无效值,这类参数一般是网站首次访问时动态生成的会话/校验参数,写死固定值会直接被反爬规则拦截 - 请求头配置过于简陋,仅写
Mozilla作为UA真实性太低,也没携带访问首页生成的合法Cookie、来源页等校验字段,请求会被网站判定为爬虫直接拦截 - 错误地向网站首页地址提交参数,首页路由本身不处理搜索提交的参数,搜索请求实际是发往专门的后端接口的
实现步骤
- 先定位真实的搜索接口
打开浏览器开发者工具,切换到网络面板并开启Fetch/XHR过滤,手动在网站输入视频链接点击搜索,找到加载下载结果的那个异步请求,记录下它的请求地址、请求方法、必带请求头、所有参数名。 - 无加密接口场景(Jsoup可直接实现)
- 第一步先以GET方式访问网站首页,从返回的HTML隐藏字段、响应Cookie中提取到合法的
sid、csrf校验值这类动态参数,同时保存好响应返回的Cookie - 第二步把待解析的视频链接、第一步拿到的动态参数,按照抓包拿到的接口要求组装请求,带上完整的请求头、Cookie发起请求,就能拿到包含下载链接的响应数据。如果接口返回的是JSON格式,要开启
ignoreContentType(true)配置,拿到响应体后自行解析JSON字段即可。
- 第一步先以GET方式访问网站首页,从返回的HTML隐藏字段、响应Cookie中提取到合法的
- 加密参数场景处理
如果抓包发现搜索接口有前端JS动态生成的加密签名、校验参数,逆向成本太高的话,直接换用支持浏览器渲染的工具(比如Selenium、Playwright),直接模拟页面加载、输入链接、触发点击的操作,等页面渲染完下载链接后直接提取DOM内容即可,不用逆向接口逻辑。
参考代码示例
// 首次访问首页,获取动态参数和合法Cookie val indexRequest = Jsoup.connect(Constants.BASE_URL) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") .method(Connection.Method.GET) .execute() // 从首页DOM中提取动态生成的sid,根据实际页面结构调整选择器 val validSid = indexRequest.parse().selectFirst("input[name='sid']")?.`val`().orEmpty() val siteCookies = indexRequest.cookies() // 向抓包获取的真实搜索接口发起请求 val searchResponse = Jsoup.connect("${Constants.BASE_URL}/search") // 替换为你抓包拿到的真实接口路径 .data("url", Constants.YOUTUBE_LINK) .data("sid", validSid) .cookies(siteCookies) .referrer(Constants.BASE_URL) .header("X-Requested-With", "XMLHttpRequest") .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") .ignoreContentType(true) .post() // 若返回HTML可直接解析DOM,返回JSON则通过searchResponse.body()获取字符串后解析 val downloadLinks = searchResponse.parse().select("a.download-link")
内容的提问来源于stack exchange,提问作者Maninder Singh
相关产品推荐
相关产品推荐

