如何在 R 中获取 Google Trends 前 10 个搜索词?

How to get Google Trends top 10 search terms in R?

在 R 中,我想从 Google 趋势中获取给定类别的前 10 个搜索词。例如,汽车类别的前 10 个搜索词包含在 this url:

url <- "https://www.google.com/trends/explore#cat=0-47&geo=US&cmpt=q&tz=Etc%2FGMT-1"

为了检索搜索词,我尝试了以下操作:

library("rvest")
top_searches <- url %>%
  read_html() %>%
  html_nodes(xpath='//*[@class="trends-bar-chart-name"]') %>%
  html_table()

然而,此代码生成一个空列表(请注意,我使用 Selectorgadget 来计算 'xpath')。

这就是你需要的:

library("rvest")

url <- 'http://www.google.com/trends/fetchComponent?hl=pl&cat=0-47&geo=US&cmpt=q&tz=Etc/GMT-1&tz=Etc/GMT-1&content=1&cid=TOP_ENTITIES_0_0&export=5&w=300&h=420'

top_searches <- url %>%
  read_html() %>% 
  html_nodes(xpath='//*[@class="trends-bar-chart-name"]') %>% 
  html_text(trim=TRUE)
# [1] "Car - Transportation mode"             "Sales - Industry"                     
# [3] "Chevrolet - Automobile Company"        "Ford - Automobile Make"               
# [5] "Tire - Industry"                       "Craigslist Inc. - Advertising company"
# [7] "Truck - Truck"                         "Engine - Literature Subject"          
# [9] "Kelley Blue Book - Company"            "Toyota - Automobile Make" 

如果您对为什么您的方法不起作用以及我如何设法解决该问题感兴趣,请继续阅读。


问题

问题是您要查找的内容不在xml_document 对象 中。您想要的数据是 动态加载的 rvest 无法处理 - 它只能获取网站源代码并检索那里的任何内容,没有任何 client-side 加工。作为 author of rvest stated,在这种情况下你必须 "reverse engineer the communications protocol and request the raw data directly from the server" 或 "use a package like RSelenium to automate a web browser".

幸运的是,事实证明第一个解决方案相对简单。

Reverse-engineering Google 趋势

在您链接到的 Google 网站上,在您感兴趣的图表下方,有一个小图标:</>。单击它会为您提供 HTML 片段,可用于 在您自己的网站上嵌入该图表

此代码段主要执行 JavaScript 代码,创建 <iframe> 元素显示 http://www.google.com/trends/...&export=5&w=300&h=420 的内容。事实证明,该网站包含您请求的数据。

但是,您应该意识到 Google 决定只发布第一个 HTML 片段,您应该充分意识到这样做的后果。

为什么这是个坏主意

首先,没有任何承诺</> 图标下的 HTML 将继续工作,直到 Google 决定关闭趋势嵌入,因为他们必须支持决定使用此片段而忘记整个事情的网站。但是被调用的脚本内容,嵌入式 HTML 页面的 URL 或 HTML 结构可能会随着 Google 的需要而改变。上面的代码明天可能会停止工作。

其次,Google 决定不希望人们直接调用此 URL。你可以做到,虽然通常的礼貌说 你不应该。如果你决定这样做,你不应该滥用它。任何人都可以猜测什么算作 "abuse".

R 代码的小改进

回到 R 代码,我调用了 html_text() 函数而不是 html_table()。这是因为 html_nodes() returns 列表 <span> 元素,而不是 <table> 元素。