我一直在尝试使用R进行一些网页抓取,并且在几个页面中相对容易。但是我已经为一个特定的网页苦苦挣扎了几个星期:
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代码运行以下载数据。
是否有任何包/隐藏功能可以帮助我完成此操作?
提前谢谢。
假设您想在页面中间抓取表格的数据,这里有一个使用 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进行无头浏览,如本小插曲中所述。