如何从 DataforSEO API 集成中提取 Google Trends 的所有 Rising 相关查询到单/一列数据框架?
我运行下面的脚本没有错误,但仍然没有得到结果。 “res_json”根本不显示上升的关键字。
设置实时“Google Trends Explore”任务文档: https://docs.dataforseo.com/v3/keywords_data/google_trends/explore/live/
library(httr)
library(jsonlite)
username <- "YOUR_EMAIL"
password <- "YOUR_API_PASSWORD"
headers = c( `Authorization` = paste('Basic',base64_enc(paste0(username,":",password))), `Content-Type` = 'application/json' )
data = paste0('[{"api": "keywords_data","function": "explore","se": "google_trends","location_code": 2840,"category_code": 0,"type": "web","time_range": "past_7_days","keywords": ["coffee","coffee machine","coffee shop"]}]')
res <- POST(url = 'https://api.dataforseo.com/v3/keywords_data/google_trends/explore/live', httr::add_headers(.headers=headers), body = data)
res_text <- content(res, "text")
res_json <- fromJSON(res_text, flatten = TRUE)
我使用了 rjsoncons CRAN 包和 JMESPath 查询语言。
library(rjsoncons)
简短的答案可能类似于(取决于您查询的具体情况)
query <- "
tasks[].result[].items[?type=='google_trends_queries_list'].data.rising |
[][]"
j_pivot(json, query, as = "data.frame")
为了解释这一点,我查看了您引用的页面,其中包括响应架构和带有示例查询/响应的侧边栏。我将完整的示例响应复制到 R 中(我仅显示前几行)
json <- '{
"version": "0.1.20220420",
"status_code": 20000,
"status_message": "Ok.",
...
然后以交互方式探索它
listviewer::jsonedit(json)
响应是一个带有“任务”字段的对象。 “任务”字段是一个对象数组,每个对象都包含一个“结果”字段。 “结果”字段是一个对象数组,每个对象都包含一个“项目”字段。 “items”字段是一个对象数组,每个对象都包含一个“type”字段。 “类型”字段标识项目中的信息。为了查找每个项目的类型,我使用了以下 JMESPath 表达式,以及
j_query()
函数来查询 JSON 对象
query <- "tasks[].result[].items[].type"
j_query(json, query)
## ["google_trends_graph","google_trends_map","google_trends_topics_list","google_trends_queries_list"]
很好,响应中有一个“google_trends_queries_list”。我更新了查询以使用
items[?type == 'google_trends_queries_list']
仅选择此项,然后查看“数据”对象和“上升”数组
query <- "tasks[].result[].items[?type=='google_trends_queries_list'].data.rising"
j_query(json, query)
## [[[]]]
对于这个特定的响应,“rising”字段由零长度数组组成。
让我们使用“google_trends_topics_list”继续该示例。以下查询告诉我该项目中有 15 个“上升”元素
query <- "tasks[].result[].items[?type=='google_trends_topics_list'].data.rising"
j_query(json, query)
返回上升主题的数组的数组的数组。可以修改 JMESPath 表达式,以使用管道运算符 |
和两级解包 将其“解包”为上升主题数组
query <- "
tasks[].result[].items[?type=='google_trends_topics_list'].data.rising |
[][]"
最后,这个上升主题列表可以使用
j_pivot()
表示为 data.frame 或 tibble
j_pivot(json, query, as = "tibble")
## # A tibble: 15 × 4
## topic_id topic_title topic_type value
## <chr> <chr> <chr> <int>
## 1 /m/086df Web design Discipline 400
## 2 /m/07xy0 Uniform Resource Locator Topic 250
## 3 /m/02cwm Design Topic 140
## 4 /m/055t58 Google Maps Website 130
## 5 /m/05x35 Plug-in Computing 90
## 6 /m/026sq Data Topic 80
## 7 /m/07k1x Tool Topic 80
## 8 /m/081rb Writing Language writing syst… 70
## 9 /m/085n4 Website Topic 70
## 10 /m/05z1_ Python Programming language 60
## 11 /m/0bngkg Yelp Company 60
## 12 /m/03l68z Google Ads Topic 60
## 13 /m/02x3zp_ Content Media 50
## 14 /m/05fbf64 Google APIs Topic 50
## 15 /m/05s_jbn Application programming interface key Topic 50
使用“搜索”放大镜查找“上升”的出现。我记下了发生的路径——响应有一个“任务”数组,每个任务有一个“结果”数组,每个结果有一个“项目”数组,然后一些项目有一个“数据”对象,其中包含‘上升’阵列。我将此路径编写为 JMESPath 查询,并使用
j_query
从 rjsoncons CRAN 包中提取数据的相关部分。
query = "tasks[].result[].items[].data.rising"
rising = j_query(json, query)