如何使用rvest获取谷歌搜索结果中的超链接
解决rvest获取谷歌搜索结果链接的问题
你的代码返回全NA的核心原因是:XPath选中了<h3>元素,但<h3>本身没有href属性——搜索结果的链接属性是在包裹<h3>的<a>标签上的。另外,谷歌会拦截无标识的爬虫请求,需要模拟浏览器UA才能正常获取页面内容。
以下是修正后的代码,可直接将搜索结果的标题和对应链接存入dataframe:
library(rvest) library(tidyverse) library(httr) # 设置浏览器请求头,避免被谷歌反爬拦截 headers <- add_headers( "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 url <- 'https://www.google.com/search?q=Mario+Torres+Mexico' # 获取页面内容 first_page <- GET(url, headers) %>% read_html() # 提取标题、原始跳转链接和清理后的真实链接 search_results <- first_page %>% # 定位到包含搜索结果的容器,选中包裹h3的a标签 html_elements(xpath = "//div[contains(@class, 'g')]//a[h3]") %>% transmute( # 提取结果标题 result_title = html_element(., "h3") %>% html_text(), # 提取谷歌的跳转链接 raw_google_link = html_attr(., "href"), # 从跳转链接中提取真实目标URL clean_target_link = str_extract(raw_google_link, "^/url\\?q=([^&]+)") %>% str_remove("^/url\\?q=") ) # 查看最终结果 print(search_results)
关键说明:
- 请求头设置:谷歌会拦截默认的rvest爬虫标识,添加浏览器UA能绕过基础反爬机制
- XPath调整:
//div[contains(@class, 'g')]//a[h3]精准定位到每个搜索结果的链接载体(包含h3的a标签),避免选中无关链接 - 链接清理:谷歌返回的
href是跳转格式(/url?q=真实链接&参数),通过字符串处理提取出真正的目标URL
如果后续谷歌调整页面结构导致XPath失效,可通过浏览器右键「检查」功能查看当前DOM结构,对应调整选择器即可。
内容的提问来源于stack exchange,提问作者user007
相关产品推荐
相关产品推荐

