Как получить 10 лучших поисковых запросов Google Trends в R?

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


person kanimbla    schedule 28.12.2015    source источник
comment
См. раздел Rvest не распознает селектор css, чтобы узнать об общей проблеме, с которой вы столкнулись. Мой ответ может пролить свет на то, почему ваш код не работает. Вы пробовали использовать пакет GTrendsR?   -  person Mirek Długosz    schedule 28.12.2015
comment
Спасибо за ваш комментарий! Я проверил исходный код URL-адреса и, по-видимому, 10 самых популярных поисковых запросов там даже не появляются. К сожалению, gtrendsR не предоставляет лучшие поисковые запросы для категории.   -  person kanimbla    schedule 28.12.2015


Ответы (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< /a>, в таких случаях вы должны «перепроектировать протокол связи и запрашивать необработанные данные непосредственно с сервера» или «использовать пакет, такой как RSelenium, для автоматизации веб-браузера».

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

Реверс-инжиниринг Google Trends

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

Этот фрагмент в основном выполняет код JavaScript, который создает элемент <iframe>, отображающий содержимое 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. Как оказалось, этот сайт содержит данные, которые вы запрашиваете.

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

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

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

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

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

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

person Mirek Długosz    schedule 28.12.2015
comment
Большое спасибо за этот очень подробный ответ, это именно то, что мне нужно. Большая помощь! - person kanimbla; 29.12.2015
comment
@kanimbla, если вы нашли этот ответ полезным, рассмотрите возможность принятия его. - person Mirek Długosz; 29.12.2015