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

Her*_*sas 1 r web-scraping rcurl httr

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

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

我认为,问题在于最终页面使用javascript加载数据.

起初我认为这是一个非常简单的案例; 毕竟,它只是一个链接,你放在浏览器中查看数据,所以我认为好,这是一个很好的旧的获取请求,我天真地尝试这样的事情:

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

由于它不起作用,我检查了网页的工作方式,如下所示.首先,它设置一些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代码运行以下载数据.

是否有任何包/隐藏功能可以帮助我实现这一目标?

提前致谢.

ale*_*emm 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
Run Code Online (Sandbox Code Playgroud)

RSelenium甚至支持利用PhantomJS进行无头浏览,如本插图所述.