2016-01-05 2 views
0

Я нахожу, что задачи веб-очистки в R часто могут быть достигнуты с помощью простого в использовании пакета rvest, извлекая код html, который создает веб-страницу. Однако этот «обычный» подход (как я могу это назвать), кажется, пропускает некоторые функции, когда веб-сайт использует Javascript для отображения соответствующих данных. В качестве рабочего примера я хотел бы очистить заголовки новостей с сайта this. Двумя основными препятствиями для обычного подхода являются кнопка «загрузить больше» внизу и извлечение заголовков с использованием xpath. В частности:Скремблирование Javascript Сгенерированный контент в R

library(rvest) 
library(magrittr) 

url = "http://www.nestle.com/media/news-archive#agregator-search-results" 
webs = read_html(url) 

# Headline of the first news based on its xpath 
webs %>% html_nodes(xpath="//*[@id='agregator-search-results']/span[2]/ul/li[1]/a/span[2]/span[1]") %>% html_text 
#[1] "" 

# Same for the description of the first news 
webs %>% html_nodes(xpath="//*[@id='agregator-search-results']/span[2]/ul/li[1]/a/span[2]/span[2]") %>% html_text 
#[1] "" 

Может быть кто-то может пролить свет на (один из) следующие вопросы:

  1. ли я пропускаю что-то очевидное здесь? То есть, возможно ли очистить заголовки, используя обычный подход, основанный на rvest в этом случае? Что касается моего нынешнего понимания, однако, это не так.
  2. Есть RSelenium и phantom JS единственный способ пойти сюда? Иными словами, можно ли выполнить задачу без использования RSelenium и phantomJS, в частности? Это может включать либо извлечение заголовков, либо загрузку большего количества заголовков (или обоих).

Любой ввод оценивается.

ответ

1

Имо, иногда лучше искать необработанные данные в фоновом режиме:

library(jsonlite) 
library(RCurl) 
n <- 8 # number of news items to pull 
useragent <- "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0" 
url <- sprintf("http://www.nestle.com/_handlers/advancedsearch.ashx?q=Nestle%%2Bdaterange%%3A..2016-01-05&index=0&num=%d&client=Nestle_Corp&site=Nestle_Corp_Media&requiredfields=MediaType:/media/pressreleases/allpressreleases|MediaType:/Media/NewsAndFeatures|MediaType:/Media/News&sort=date:D:R:d1&filter=p&access=p&entsp=a&oe=UTF-8&ie=UTF-8&ud=1&ProxyReload=1&exclude_apps=1&entqr=3&getfields=*", n) 
json <- getURL(url, useragent=useragent) 
res <- fromJSON(json) 
df <- res$GSP$RES$R 
head(cbind(df[, c("U", "T")], df$FS$'@VALUE')) 
#                        U                     T df$FS$"@VALUE" 
# 1         http://www.nestle.com/media/newsandfeatures/nestle-150-years &#39;Good Food, Good Life&#39;: Celebrating 150 years of <b>Nestlé</b> <b>...</b>  2016-01-01 
# 2         http://www.nestle.com/media/newsandfeatures/2015-in-pictures           2015 in pictures | <b>Nestlé</b> Global  2015-12-23 
# 3       http://www.nestle.com/media/news/nescafe-dolce-gusto-expands-in-brazil    Coffee superstar: Nescafé Dolce Gusto expands in Brazil <b>...</b>  2015-12-17 
# 4      http://www.nestle.com/media/news/nestle-waters-new-bottling-plant-italy <b>Nestlé</b> Waters needs youth, for its new bottling plant in Italy <b>...</b>  2015-12-10 
# 5 http://www.nestle.com/media/news/nestle-launch-wellness-club-personalised-health-service-japan  Matcha made in nutritional heaven: <b>Nestlé</b> launches Wellness <b>...</b>  2015-12-08 
# 6  http://www.nestle.com/media/news/nestle-completes-chf-8-billion-share-buyback-programme   <b>Nestlé</b> completes CHF 8 billion share buyback programme <b>...</b>  2015-12-07 

df содержит больше информации, некоторые из которых prly должен быть безгнездными, если вы хотите использовать его.

+0

Благодарим за предложенный подход! Мне придется посмотреть на это более подробно. Как вы получили расширенный URL-адрес? – Nico21

+1

Я использовал https://addons.mozilla.org/de/firefox/addon/httpfox/ – lukeA

+0

Можете ли вы потянуть больше новостей таким образом? В частности, если количество доступных элементов неизвестно. – Nico21

Смежные вопросы