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失败是报错的核心原因,手动配置步骤如下:
- 安装Chrome浏览器:
sudo apt update sudo apt install google-chrome-stable
- 查看当前Chrome版本:
google-chrome --version
- 手动下载对应版本的ChromeDriver(需匹配Chrome主版本号),解压后移动到系统路径并赋予权限:
unzip chromedriver_linux64.zip sudo mv chromedriver /usr/local/bin/ sudo chmod +x /usr/local/bin/chromedriver
- 测试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
相关产品推荐
相关产品推荐

