使用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
相关产品推荐
相关产品推荐

