一段时间以来,我一直在使用R和RCurl包从网页上自动下载信息;我通常使用简单的函数,如getURL(), getForm()和postForm()。我通常只是找到HTML参数可选值并填充它们。但是,我遇到了一个网页,我认为使用传统的功能无法下载,因为我在url地址中找不到任何参数。我相信这是因为网页是写在javascript,我不知道如何处理它。我是一名数学家,使用R有丰富的经验,但对HTML有非常基本的了解,对javascript一无所知。
我不一定需要直接使用R,我可以使用其他软件,然后从R导入。我找到了一个名为mozrepl的Mozilla应用程序,但我无法使其工作。如果有人有更多的经验可以帮助我解决方案,我将不胜感激,是否使用不同的软件或把适当的命令在R或mozrepl。如果不能直接将信息下载到R变量中,则可以将其保存到文本文件中。
我想要下载的信息是在选择以下url中的日期值然后点击名为"consultartiie"的按钮后产生的。生成一个包含变量"Posturas"、"Montos"和"Participantes"的表。
http://www.banxico.org.mx/tiieban/leeArgumentos.faces?BMXC_plazo=28& BMXC_semanas = 4
我这样做是因为我的最终目标是把信息放在一起到一个数据框
这里javascript没有问题。javascript简单地创建了日历,这样您就可以选择提交到表单的日期。然而,还有很多其他的问题。
在服务器端,似乎他们试图检测无浏览器试图提取数据。此外,一旦表单正确提交,他们有一个重定向,这会导致问题。
require(RCurl)
require(XML)
appDate <- "20130502"
rURL <- "http://www.banxico.org.mx/tiieban/leeArgumentos.faces?BMXC_plazo=28&BMXC_semanas=4"
usera <- "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0"
curl <- getCurlHandle(cookiefile = "", verbose = TRUE, useragent = usera
, followlocation = TRUE, autoreferer = TRUE, postredir = 2
, httpheader = c(Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding" = "gzip, deflate"
, "Accept-Language" = "en-US,en;q=0.5"
, Connection = "keep-alive"), referer = "http://www.banxico.org.mx/tiieban/leeArgumentos.faces")
txt <- getURLContent(rURL, curl = curl, verbose = TRUE)
fParams <- structure(c(appDate, "Consultar+TIIE", "leeArgumentos")
,.Names = c( "leeArgumentos%3Afecha", "leeArgumentos%3Asubmit", "leeArgumentos"))
res <- postForm(rURL, .params = fParams, style = "post", curl = curl, binary = TRUE)
xRes <- htmlParse(rawToChar(res))
readHTMLTable(getNodeSet(xRes, "//*/table")[[3]])
Posturas Montos Participantes
1 4.3100 350 Banco Credit Suisse (México), S.A.
2 4.3245 350 Banco Inbursa S.A.
3 4.3200 350 Banco Invex S.A.
4 4.3375 350 Banco Mercantil del Norte S.A.
5 4.3350 350 Banco Nacional de México S.A.
6 4.3250 350 HSBC México S.A.
7 4.3300 350 ScotiaBank Inverlat, S.A.
有许多事情正在发生。表单的参数需要编码。例如,leeArgumentos:fecha
必须是leeArgumentos%3Afecha
。用户代理可能被检测为引用字符串和各种其他标头。
这看起来确实像一个javascript问题,而不是直接与r中的网页抓取相关的问题。
有很多方法可以解决这个问题,你可以看看抓取Javascript生成的数据,以及语言中关于web抓取Javascript内容的建议
您指向的示例似乎运行一个自定义脚本,show_calendar2
,在这里定义http://www.banxico.org.mx/tiieban/scripts/ts_picker2.js