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

使用Jsoup爬取谷歌搜索结果提取目标URL的方法是否正确

问题背景

我正在尝试编写一个方法,接收地点名称作为入参,返回对应地点的weather.com页面URL;目前需要获取谷歌搜索结果中第一条结果的URL,但实现过程中遇到了困难。
当前实现代码如下:

{
    String temp = loc.replace(" ","+"); // 拼接谷歌搜索链接
    String input = "https://www.google.com/search?q="+temp+"+site%3Aweather.com%2Fweather%2Ftoday&rlz=1C1VDKB_enUS946US946&ei=RXacYvTuDs_SuvQPiOagkA8&ved=0ahUKEwi0pajd_pX4AhVPqY4IHQgzCPIQ4dUDCA4&uact=5&oq="+temp+"+site%3Aweather.com%2Fweather%2Ftoday&gs_lcp=Cgdnd3Mtd2l6EANKBAhBGABKBAhGGABQAFiFEWC-EmgAcAB4AIABUIgB7gaSAQIxM5gBAKABAcABAQ&sclient=gws-wiz";
    try{
        doc = Jsoup.connect(input).get();
        Elements e = doc.select("div.yuRBf");
        Element link = e.select("a").first();
        System.out.println(link.attr("href")); // 预期这里输出目标URL
        System.out.println("done");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

核心疑问:上述代码中使用的Jsoup相关方法是否能够正确提取到目标URL?

解答

这段代码无法正确提取到目标URL,存在两个致命问题:

  • 触发谷歌反爬拦截:Jsoup默认请求不带真实浏览器标识,访问谷歌搜索时大概率会被判定为爬虫,返回人机验证页面而非正常搜索结果,此时div.yuRBf节点根本不存在,代码会直接抛出空指针异常。
  • 选择器逻辑完全不稳定:即便绕过反爬拿到正常搜索结果,硬编码div.yuRBf类名的写法也不可靠——谷歌搜索结果的DOM类名是动态生成的,会随版本、地区、访问环境变化,该类名仅在特定场景下临时有效,复用性极差。另外谷歌搜索结果的href属性默认是自家跳转地址,并非weather.com原始链接,即便拿到也需要做字符串截取清洗才能使用。

如果要做本地调试,可以先给Jsoup请求添加真实浏览器的User-Agent头,绕过基础反爬校验:

doc = Jsoup.connect(input)
        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36")
        .get();

定位链接时不要依赖动态类名,通用逻辑是匹配所有href属性以/url?q=开头的a标签,取第一个元素即为第一条搜索结果,之后截掉href的跳转前缀和尾部跟踪参数,就能拿到原始的目标页面URL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:57:19