如何用gtrendsR或其他R包获取超5个关键词的谷歌趋势数据?
解决gtrendsR查询超过5个关键词的问题
谷歌趋势本身限制单次查询最多支持5个关键词,所以gtrendsR包会抛出length(keyword) <= 5 is not TRUE的报错。可以通过分批次查询+标准化合并的方式解决,核心思路是用一个共同的基准关键词对齐不同批次的相对搜索量数值,具体步骤如下:
方法:分批次查询并标准化合并
1. 准备参数与分组关键词
选择一个搜索量相对稳定的关键词作为基准(比如示例中的"Lion"),将剩余关键词分成每组最多4个的小组(每组加上基准词后刚好5个,符合谷歌趋势的限制):
library(gtrendsR) library(dplyr) library(purrr) # 原始关键词列表 keywords <- c("Butterfly", "Cockroach", "Parrot", "Ostrich", "Lion", "Platypus", "Alligator") # 基准关键词(用于对齐不同批次的相对值) base_keyword <- "Lion" # 移除基准词,得到待分组的关键词 target_keywords <- setdiff(keywords, base_keyword) # 每4个关键词分为一组(每组+基准词后总数为5) keyword_groups <- split(target_keywords, ceiling(seq_along(target_keywords)/4)) # 给每个组添加基准关键词 keyword_groups <- purrr::map(keyword_groups, ~c(base_keyword, .x)) # 固定查询参数 country <- 'BR' time <- "2011-01-01 2021-12-31" channel <- 'web'
2. 批量执行查询
用purrr::map批量调用gtrends函数,获取每个分组的趋势数据:
# 批量查询所有分组 trends_list <- purrr::map(keyword_groups, ~gtrends(keywords = .x, gprop = channel, geo = country, time = time))
3. 标准化并合并数据
谷歌趋势的搜索量是相对值(以批次内最高搜索量为100),所以需要用基准词的数值将不同批次的结果统一尺度:
# 处理每个批次的数据,标准化后合并 processed_data <- purrr::map_dfr(trends_list, function(trend_obj) { # 提取兴趣时间序列数据,处理"<1"的特殊值 interest_df <- trend_obj$interest_over_time %>% dplyr::select(date, keyword, hits) %>% dplyr::mutate(hits = as.numeric(ifelse(hits == "<1", 0.5, hits))) # 获取基准词的搜索量数据 base_hits <- interest_df %>% dplyr::filter(keyword == base_keyword) %>% dplyr::pull(hits) # 标准化:将非基准词的数值按基准词的比例调整,统一尺度 interest_df %>% dplyr::mutate( hits = ifelse(keyword != base_keyword, (hits / base_hits) * 100, hits) ) %>% # 去重基准词(每个批次都包含基准词,只保留一份) dplyr::filter(!(keyword == base_keyword & duplicated(date))) }) # 查看合并后的结果 head(processed_data)
说明
- 基准词的选择很重要,尽量选搜索量稳定、覆盖整个时间周期的关键词,避免出现搜索量为0的情况,否则会导致标准化出错。
- 如果不需要严格的相对值对比,也可以直接分批次查询后单独分析,但这种方式无法跨批次比较关键词的搜索热度。
内容的提问来源于stack exchange,提问作者user18443305
相关产品推荐
相关产品推荐

