基于rvest爬取谷歌搜索内容失效,求适配2022布局的修复方案
修复基于rvest提取谷歌搜索结果的失效代码
问题背景
此前可正常运行的rvest提取谷歌搜索结果标题、文本和链接的代码,现在返回空结果。核心原因有两点:一是谷歌频繁更新搜索页面的HTML结构,旧XPath选择器已不匹配当前元素;二是直接请求未模拟浏览器身份,被谷歌拦截后返回非预期页面内容。
修复方案
1. 模拟浏览器请求
谷歌会拦截无用户代理(User-Agent)的请求,需在read_html中添加浏览器UA头,确保返回正常的搜索结果页面。
2. 更新XPath选择器
根据当前谷歌搜索页面的DOM结构,调整标题、文本和链接的定位路径,匹配最新的结果容器及子节点。
完整修复代码
library(rvest) library(tidyverse) # 模拟浏览器的User-Agent,可替换为你常用浏览器的UA字符串 user_agent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" url <- 'https://www.google.com/search?q=Mario+Torres+Mexico' # 读取页面时添加UA头,避免被拦截 first_page <- read_html(url, user_agent = user_agent) # 定位每个搜索结果的容器卡片 result_cards <- first_page %>% html_nodes(xpath = "//div[@class='g']") # 提取标题、链接和描述文本 search_results <- tibble( title = result_cards %>% html_node(xpath = ".//h3") %>% html_text(), link = result_cards %>% html_node(xpath = ".//a") %>% html_attr("href") %>% str_remove("^/url\\?q=") %>% str_extract("^https.*?(?=&)"), text = result_cards %>% html_node(xpath = ".//div[@data-content-feature='1']") %>% html_text() ) print(search_results)
代码说明
- User-Agent设置:模拟真实浏览器请求,规避谷歌的反爬拦截
- 结果容器定位:通过
//div[@class='g']定位单个搜索结果的外层容器,这是当前谷歌搜索结果的标准类名 - 标题提取:直接从容器内的
h3节点获取标题文本 - 链接提取:先获取
a标签的href属性,去除谷歌跳转前缀/url?q=后,提取完整的真实链接 - 描述文本提取:通过
div[@data-content-feature='1']定位结果下方的描述文本节点
内容的提问来源于stack exchange,提问作者user007
相关产品推荐
相关产品推荐

