Как получить Google Trends топ-10 поисковых терминов в R?

В R I хотели бы получить 10 лучших поисковых терминов от Google Trends для данной категории. Например, первые 10 поисковых терминов для категории automotive включены в этот 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 ответ

Решение

Это то, что вам нужно:

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 не может справиться с этим - он может только получить исходный код сайта и извлечь все, что есть, без какой-либо обработки на стороне клиента. Как автор rvest заявлено, что в подобных случаях вы должны "перепроектировать протокол связи и запросить необработанные данные непосредственно с сервера" или "использовать пакет, такой как RSelenium, для автоматизации веб-браузера".

К счастью, первое решение оказалось относительно простым.

Обратный инжиниринг Google Trends

На веб-сайте Google, на который вы ссылались, прямо под диаграммой, которая вас заинтересовала, есть этот маленький значок: </>, Нажав на нее, вы получите фрагмент кода HTML, который можно использовать для встраивания этой диаграммы на свой сайт.

Этот фрагмент в основном выполняет код JavaScript, который создает <iframe> элемент, отображающий содержание http://www.google.com/trends/...&export=5&w=300&h=420. Оказывается, этот сайт содержит данные, которые вы запрашиваете.

Однако вы должны понимать, что Google решил опубликовать только первый HTML-фрагмент, и вы должны быть полностью осведомлены о последствиях этого.

Почему это плохая идея

Во-первых, нет дальнейших обещаний. Этот HTML под </> Значок будет работать до тех пор, пока Google не решит закрыть встраивание Trends, поскольку они должны поддерживать сайты, которые решили использовать этот фрагмент, и забыть обо всем. Но содержимое вызываемого сценария, URL-адрес встроенной HTML-страницы или структура HTML могут измениться, когда Google захочет. Код выше может перестать работать завтра.

Во-вторых, Google решил, что они не хотят, чтобы люди называли этот URL напрямую. Вы можете сделать это, хотя обычная вежливость говорит, что вы не должны. Если вы все равно решите это сделать, вам не следует злоупотреблять этим. Кто-то догадывается, что считается "злоупотреблением".

Незначительные улучшения кода R

Вернемся к коду R, я позвонил html_text() функция вместо html_table(), Это потому html_nodes() возвращает список <span> элементы, а не <table> элемент.

Другие вопросы по тегам