下载 javascript- 使用 R 从网络加载数据?棘手的网页抓取

download javascript-loading data from the web using R? tricky web scraping

我一直在尝试使用 R 进行一些网页抓取,并且在几个页面中它相对容易。但是我已经为一个特定的网页苦苦挣扎了数周:

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

我认为问题出在最后,页面使用 javascript.

加载数据

起初我以为这是一个很简单的案例;毕竟,它只是一个 link 放在浏览器中查看数据,所以我想好吧,这是一个很好的旧 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. This new page loads a huge javascript code (1923 lines of code, as formatted by http://jsbeautifier.org/)和生成 html 代码来显示它。此代码使用原始页面设置的 cookie 和参数来确定要下载和显示的数据。

我在 R 中尝试了太多东西来获取这个网页中的数据。我不会把我尝试过的所有疯狂的东西都放在这里,因为它太长了(有时会令人尴尬),但我已经尝试过使用 RCurl 和其他包(repmis、scrapeR、httr、 rjson 等)。似乎没有任何效果,因为这些软件包中的 none 似乎有办法(至少自动)使 javascript 代码 运行 下载数据。

是否有任何 package/hidden 功能可以帮助我完成此任务?

提前致谢。

假设你想抓取页面中间table的数据,这里有一个使用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 中所述。