在 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
无法应对 - 它只能获取网站源代码并检索其中的任何内容,而无需任何客户端处理。作为author of rvest
stated ,在这种情况下,您必须“对通信协议(protocol)进行逆向工程并直接从服务器请求原始数据”或“使用像 RSelenium 这样的包来自动化 Web 浏览器”。
幸运的是,事实证明第一个解决方案相对简单。
逆向工程 Google 趋势
在您链接到的 Google 网站上,在您感兴趣的图表下方,有一个小图标:</>
.单击它会为您提供 HTML 片段,可用于将该图表嵌入您自己的网站。
此代码段主要执行创建 <iframe>
的 JavaScript 代码显示 http://www.google.com/trends/...&export=5&w=300&h=420 内容的元素.事实证明,该网站包含您请求的数据。
但是,您应该意识到 Google 决定只发布第一个 HTML 代码段并且您应该充分意识到这样做的后果。
为什么这是个坏主意
首先, future 没有 promise 。此 HTML 在 </>
下图标将继续工作,直到 Google 决定关闭趋势嵌入,因为他们必须支持决定使用此代码段而忘记整个事情的网站。但是调用的脚本内容、嵌入式 HTML 页面的 URL 或 HTML 结构可能会随时更改,只要 Google 愿意。上面的代码明天可能会停止工作。
其次,Google 决定不希望人们直接调用此 URL。你可以做到,尽管通常的礼貌告诉你你不应该。如果你决定这样做,你不应该滥用它。任何人都可以猜测什么算作“滥用”。
小的 R 代码改进
回到 R 代码,我调用了 html_text()
函数而不是 html_table()
.那是因为 html_nodes()
返回 <span>
的列表元素,不是 <table>
元素。
关于r - 如何在 R 中获取 Google Trends 前 10 个搜索词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34496782/