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

rvest爬取谷歌等搜索引擎失效,Ubuntu下RSelenium报错求助

问题:提取城市名并获取对应州信息失败

需求与原尝试代码

想要提取数据框df中headquarter_location列的所有城市名称,拼接成谷歌搜索链接后搜索,以此获取对应州信息。原尝试代码如下:

# 提取城市列并生成谷歌搜索链接
HQ <- df$headquarter_location
google_links <- paste("https://www.google.com/search?q=", HQ, sep = "")

# 定义爬取函数
g_result <- function(google_links){
  google_page <- read_html(google_links)
  state_country <- google_page %>% 
    html_nodes(".E75vKf span") %>% html_text()
} 

# 计划用sapply将结果整理到新列

遇到的问题

  • 直接用read_html爬取谷歌、必应、DuckDuckGo等主流搜索引擎页面完全无效,仅能正常爬取IMDb、维基百科这类普通网站
  • 尝试用RSelenium解决时,在Ubuntu 22.04 LTS系统上反复出现BEGIN: Download重复报错,无法正常运行

解决方案

一、为什么直接爬搜索引擎无效?

主流搜索引擎都有严格的反爬机制,会检测请求的用户代理(read_html默认不带浏览器标识)、请求频率等,直接发送请求会被拦截,返回的内容不是实际搜索页面,自然无法提取到目标节点内容。

二、修复RSelenium在Ubuntu 22.04的下载报错

RSelenium自动下载ChromeDriver失败是报错的核心原因,手动配置步骤如下:

  1. 安装Chrome浏览器:
sudo apt update
sudo apt install google-chrome-stable
  1. 查看当前Chrome版本:
google-chrome --version
  1. 手动下载对应版本的ChromeDriver(需匹配Chrome主版本号),解压后移动到系统路径并赋予权限:
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
  1. 测试RSelenium连接(替换chromever为你的Chrome版本号):
library(RSelenium)
driver <- rsDriver(browser = "chrome", chromever = "120.0.6099.109") # 示例版本号
remDr <- driver[["client"]]
remDr$navigate("https://www.google.com")

如果仍有问题,检查是否安装了Java环境(RSelenium依赖):

sudo apt install default-jre

三、更稳定的替代方案:使用地理编码API

比起爬取搜索引擎,用专门的地理编码API更可靠,无需处理反爬。以下是用OpenStreetMap的Nominatim API(免费无密钥)的示例:

library(httr)
library(jsonlite)

# 定义获取州信息的函数
get_state_from_city <- function(city_name) {
  # 构造请求URL并编码特殊字符
  url <- URLencode(paste0("https://nominatim.openstreetmap.org/search?q=", city_name, "&format=json&addressdetails=1"))
  response <- GET(url)
  
  # 检查请求是否成功
  if (http_status(response)$category != "Success") {
    return(NA)
  }
  
  result <- fromJSON(content(response, "text"))
  # 无搜索结果返回NA
  if (length(result) == 0) {
    return(NA)
  }
  
  # 提取美国城市的州信息(其他地区可调整字段)
  state <- result$address$state[[1]]
  return(state)
}

# 应用到数据框,添加1秒延迟避免触发API频率限制
df$state <- sapply(df$headquarter_location, function(x) {
  Sys.sleep(1)
  get_state_from_city(x)
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:05:19