2015-01-16 8 views
1

나는 R을 사용하여 웹을 긁어 모으기 위해 노력해 왔으며 여러 페이지에서 비교적 쉽습니다. 하지만 하나의 특정 웹 페이지와 주 동안 고투했습니다R을 사용하여 웹에서 javascript 로딩 데이터를 다운로드 하시겠습니까? 까다로운 웹 긁기

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

문제는, 내 생각, 결국, 페이지는 자바 스크립트를 사용하여 데이터를로드한다는 사실에있다.

처음에는 매우 간단한 경우라고 생각했습니다. 결국, 당신이 데이터를 볼 수있는 브라우저에 넣어 그냥 링크입니다, 그래서 좋아,이 요청을 얻고 나는 순진하게도이 같은 노력 좋은 된 HTTP입니다 생각했다 : 그것은으로

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

을 did not work, 나는 웹 페이지가 어떻게 작동 하는지를 확인했고 그것은 다음과 같다. 먼저 쿠키와 몇 개의 매개 변수를 설정 한 다음 http POST 요청을 통해 브라우저를 URL https://www.commerzbank.de/rates/do.rates으로 리디렉션합니다. 이 새 페이지는 데이터를 다운로드하고이를 표시하는 HTML 코드를 생성하는 거대한 자바 스크립트 코드 (코드의 1923 행, http://jsbeautifier.org/으로 포맷 됨)를로드합니다. 이 코드는 원본 페이지에서 설정 한 쿠키 및 매개 변수를 사용하여 다운로드 및 표시 할 데이터를 결정합니다.

나는이 웹 페이지의 데이터를 얻기 위해 R에서 너무 많은 것을 시도했다. 나는 너무 오랫동안 (그리고 때로는 당혹스러워 할 것이기 때문에) 내가 시도한 모든 미친 물건들을 넣지는 않겠지 만, RCurl과 다른 패키지 (repmis, scrapeR, httr, rjson 등)의 대부분의 기능을 가지고 노려 보았습니다. . 이러한 패키지 중 어느 것도 (최소한 자동으로) 자바 스크립트 코드를 실행하여 데이터를 다운로드 할 수있는 방법이 없기 때문에 아무 것도 작동하지 않는 것 같습니다.

이 작업을 수행하는 데 도움이되는 패키지/숨김 기능이 있습니까?

미리 감사드립니다.

+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도이 vignette에 설명 된대로 PhantomJS를 활용 헤드리스 브라우징을 지원합니다.