3

在 RI 中,想从 Google 趋势中获取给定类别的前 10 个搜索词。例如,类别 autmotive 的前 10 个搜索词包含在此 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”)。

4

1 回答 1

5

这就是你需要的:

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_documentobject中。您想要的数据是动态加载的,rvest无法应对 - 它只能获取网站源代码并检索那里的任何内容,而无需任何客户端处理。正如作者rvest所述,在这种情况下,您必须“对通信协议进行逆向工程并直接从服务器请求原始数据”或“使用像 RSelenium 这样的包来自动化 Web 浏览器”。

幸运的是,第一个解决方案被证明相对容易。

逆向工程谷歌趋势

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

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

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

为什么这是个坏主意

首先,没有进一步的承诺。这个图标下的 HTML</>将继续工作,直到谷歌决定关闭趋势嵌入,因为他们必须支持决定使用这个片段并忘记整个事情的网站。但是,只要 Google 愿意,调用的脚本内容、嵌入 HTML 页面的 URL 或 HTML 结构可能会发生变化。上面的代码明天可能会停止工作。

其次,谷歌决定他们不希望人们直接调用这个 URL。你可以这样做,尽管一般的礼貌说你不应该这样做。如果您还是决定这样做,则不应滥用它。任何人都猜想什么算作“滥用”。

较小的 R 代码改进

回到 R 代码,我调用html_text()了 function 而不是html_table(). 那是因为html_nodes()返回<span>元素列表,而不是<table>元素。

于 2015-12-28T22:04:13.867 回答