You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jsoup在Java中爬取YouTube搜索结果首个href的CSS选择器问题

解决Jsoup爬取YouTube搜索结果链接的问题

我懂你现在卡在哪了——用Jsoup抓YouTube搜索结果的第一个视频链接却没输出,这主要是两个原因:YouTube的页面结构已经更新,而且它大量内容是动态渲染的,Jsoup只能抓取初始加载的静态HTML,这两点直接导致你的选择器失效了。

先说说你原有代码的问题:

  • 你用的h3.title-and-badge.style-scope.ytd-video-renderer选择器,现在YouTube搜索结果里的视频标题h3标签class早就不是这个了,甚至很多时候初始静态HTML里都不会直接包含完整的视频链接结构。

下面给你两个可行的解决方案:

方案一:适配当前YouTube静态HTML的选择器(临时可用,结构可能随时变动)

现在YouTube搜索结果的静态HTML里,视频链接通常藏在ytd-video-renderer元素下的a#video-title标签里,你可以试试这个调整后的代码:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.IOException;

public class WebTest {
    public static void main(String[] args) {
        try {
            Document doc = Jsoup.connect("https://www.youtube.com/results?search_query=childish+gambino+this+is+america")
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
                    .get(); // 必须加User-Agent,否则YouTube会返回反爬页面
            
            // 直接获取第一个匹配的视频链接元素
            Element firstVideoLink = doc.selectFirst("ytd-video-renderer a#video-title");
            if (firstVideoLink != null) {
                // 拼接完整链接,因为href是相对路径
                String fullLink = "https://www.youtube.com" + firstVideoLink.attr("href");
                System.out.println(fullLink);
            } else {
                System.out.println("未找到视频链接,可能页面结构更新或被反爬拦截");
            }
        } catch (IOException ex){
            ex.printStackTrace(); // 别留空catch!打印异常才能排查问题(比如网络、反爬)
        }
    }
}

这里的关键改进点:

  1. 添加了userAgent:YouTube会检测请求头,没有UA会返回无法解析的页面,这很可能是你之前没输出的核心原因之一!
  2. 用selectFirst直接获取第一个匹配元素,比Elements更高效
  3. 拼接完整的视频链接(原href是相对路径)
  4. 去掉空catch块,打印异常方便排查问题

方案二:应对动态渲染的长期解决方案

YouTube很多内容是JavaScript动态加载的,Jsoup无法执行JS,所以如果静态HTML里找不到内容,你需要用支持JS渲染的工具,比如Selenium或者HtmlUnit。以Selenium为例,简单示例:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class YoutubeScraper {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        try {
            driver.get("https://www.youtube.com/results?search_query=childish+gambino+this+is+america");
            // 等待页面加载(推荐用显式等待代替Thread.sleep,更稳定)
            Thread.sleep(3000);
            WebElement firstVideo = driver.findElement(By.cssSelector("ytd-video-renderer a#video-title"));
            String link = firstVideo.getAttribute("href");
            System.out.println(link);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

这个方案能模拟浏览器完整加载页面,获取动态渲染后的内容,稳定性比Jsoup高很多,但需要配置对应浏览器的驱动(比如ChromeDriver)。

额外提醒

  • YouTube的页面结构经常更新,所以选择器可能过段时间就失效,需要随时调整
  • 不要频繁爬取,遵守YouTube的robots.txt和使用条款,避免IP被封禁

内容的提问来源于stack exchange,提问作者gio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:15:36