2015-01-16 3 views
1

Я пытался сделать некоторые скребки с помощью R, и на нескольких страницах это было относительно легко. Но я боролся в течение нескольких недель с одной конкретной веб-страницы:загрузить javascript-загрузка данных из Интернета с помощью R? tricky web scraping

https://www.commerzbank.de/de/hauptnavigation/kunden/kursinfo/devisenk/weitere_waehrungen___indikative_kurse/indikative_kurse.jsp

Проблема, как мне кажется, заключается в том, что в конце концов, страница загружает данные с помощью JavaScript.

Сначала я подумал, что это очень простой случай; В конце концов, это просто ссылка, которую можно поместить в браузере, чтобы увидеть данные, так что я думал, хорошо, это старый-добрый HTTP GET запрос, и я наивно пытался что-то вроде этого:

library(httr) 
url <- "https://www.commerzbank.de/de/hauptnavigation/kunden/kursinfo/devisenk/weitere_waehrungen___indikative_kurse/indikative_kurse.jsp" 
res1 <- GET(url = url) 

Как это не работает, я проверил, как работает веб-страница, и это выглядит следующим образом. Во-первых, он устанавливает некоторые файлы cookie и несколько параметров, а затем перенаправляет браузер (с помощью HTTP-запроса POST) на url https://www.commerzbank.de/rates/do.rates. Эта новая страница загружает огромный код javascript (1923 строки кода, отформатированный http://jsbeautifier.org/), который отвечает за загрузку данных и генерирование html-кода для его отображения. Этот код использует файлы cookie и параметры, установленные на исходной странице, чтобы определить, какие данные загружать и отображать.

Я пробовал слишком много вещей в R, чтобы получить данные на этой веб-странице. Я не буду включать здесь все сумасшедшие вещи, которые я пробовал, потому что это было бы слишком долго (и иногда неловко), но я пробовал играть с большинством функций RCurl и других пакетов (repmis, scrapeR, httr, rjson, среди прочих) , Ничто не работает, потому что ни один из этих пакетов, похоже, не имеет возможности (по крайней мере автоматически) сделать код javascript для загрузки данных.

Есть ли какой-либо пакет/скрытая функция, которая поможет мне выполнить это?

Заранее спасибо.

+0

Посмотрите на теги, которые вы задали на свой вопрос, а затем соблюдайте правописание. –

+3

Да, я вижу, сломаю вместо соскабливания ..., извините за это ..., но ясно, что английский не мой родной язык и, видимо, я с ним борюсь, ..., я думаю, если бы вы когда-либо пытались выучите иностранный язык, который вы, возможно, потеряли в орфографии. Благодаря! –

ответ

5

Предполагая, что вы хотите очистить данные таблицы в середине страницы, вот решение, использующее RSelenium.

library(RSelenium) 
library(magrittr) 

base_url = "https://www.commerzbank.de/de/hauptnavigation/kunden/kursinfo/devisenk/weitere_waehrungen___indikative_kurse/indikative_kurse.jsp" 

checkForServer() 
startServer() 
remDrv <- remoteDriver() 
remDrv$open() 

remDrv$navigate(base_url) 

remDrv$getPageSource()[[1]] %>% htmlParse %>% 
readHTMLTable(header = TRUE) %>% 
extract2(1) %>% head 

# ISO        Land Mittelkurs  Geld Brief 
# 1 AFN      Afghanistan 66,6600 65,6600 67,6600 
# 2 ALL       Albanien 140,2300 137,7300 142,7300 
# 3 AMD       Armenien 553,6000 523,6000 583,6000 
# 4 ANG Curaçao, St. Martin (südl. Teil)  2,0392 1,9892 2,0892 
# 5 AOA       Angola 119,7755 116,7755 122,7755 
# 6 ARS      Argentinien  9,9598 9,8798 10,0398 

RSelenium даже поддерживает обезглавленный просмотр Усиливая PhantomJS, как описано в этом vignette.