如何在R中获得Google Trends十大搜索字词?

时间:2015-12-28 16:05:33

标签: r css-selectors rvest google-trends

在R中,我想从特定类别的Google趋势中获取前10个搜索字词。例如,类别autmotive的前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')。

1 个答案:

答案 0 :(得分: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_document对象中。您想要的数据动态加载rvest无法应对 - 它只能获取网站源代码并检索其中的任何内容,而无需任何客户端处理。作为author of rvest stated,在这种情况下,您必须对通信协议进行反向工程,并直接从服务器请求原始数据&#34;或者&#34;使用像RSelenium这样的软件包自动化网络浏览器&#34;。

幸运的是,事实证明第一种解决方案相对容易。

逆向工程Google趋势

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

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

但是,您应该意识到Google决定只发布第一个HTML代码段,您应该完全了解其后果。

为什么这是个坏主意

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

其次,Google决定他们不希望别人直接调用此网址。你可以这样做,虽然常见的礼貌说你不应该。无论如何你决定这样做,你不应该滥用它。任何人都会猜到什么是&#34;滥用&#34;。

次要R代码改进

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