我试图从页面下载内容,并且我发现响应数据格式不正确或不完整,就好像GET或getURL在加载这些数据之前一样。
library(httr)
library(RCurl)
url <- "https://www.vanguardcanada.ca/individual/etfs/etfs.htm"
d1 <- GET(url) # This shows a lot of {{ moustache style }} code that's not filled
d2 <- getURL(url) # This shows "" as if it didn't get anything
我不知道该怎么办。我的目标是获取与浏览器中显示的链接相关联的数字:
https://www.vanguardcanada.ca/individual/etfs/etfs-detail-overview.htm?portId=9548
所以在这种情况下,我想下载并刮掉&#39; 9548&#39;
不确定为什么getURL和GET似乎与浏览器中显示的结果截然不同。似乎数据加载缓慢,几乎就像GET和getURL在它满载之前拉动一样。
例如,请看:
x <- "https://www.vanguardcanada.ca/individual/etfs/etfs-detail-prices.htm?portId=9548"
readHTMLTable(htmlParse(GET(x)))
答案 0 :(得分:6)
我认为问题是您可能无法理解此网页的工作原理。当您致电GET(url)
时,您将获得该页面来源的实际html/text
。这是直接从服务器发送的内容。这并不总是在浏览器中显示的内容。现在尤其如此,以后通过javascript生成大量页内内容。这正是这个页面正在发生的事情。页面上的“内容”在该页面的html源代码中找不到;它稍后通过javascript下载。
httr
和RCurl
都不会执行使用您实际查看的表“填充”页面所需的javascript。有一个名为RSelenium
的软件包能够与浏览器交互以执行javascript,但在这种情况下,我们实际上可以解决这个问题。
首先,请注意为什么getURL
不起作用。看起来这个Web服务器会嗅探请求程序发送的用户代理以发回不同的内容。无论RCurl使用的默认用户代理是什么,都不足以从服务器获取html。您可以通过指定其他用户代理来解决此问题。例如
d2 <- getURL(url, .opts=list(useragent="Mozila 5.0"))
似乎有效。
但回到主要问题。处理此类问题时,我强烈建议您使用Chrome开发者工具(或您喜欢的浏览器中的等效工具)。在Chrome开发者工具中,特别是在“广告联盟”标签上,您可以看到Chrome为获取数据而发出的所有请求
如果单击第一个(“etfs.html”),您可以看到该请求的标题和响应。在回复子标签上,您应该会看到与GET
或getURL
完全相同的内容。然后我们下载了一堆CSS和javascript文件。看起来最有趣的文件是“GetETFJson.js”。这实际上似乎以几乎 JSON格式保存了大部分数据。它实际上在JSON块前面有一些真正的javascript,这种方式会受到阻碍。但是我们可以用
d3 <- GET("https://www.vanguardcanada.ca/individual/mvc/GetETFJson.js")
并使用
将内容解压缩为文本p3 <- content(d3, as="text")
然后使用
将其转换为R对象library(jsonlite)
r3 <- fromJSON(substr(p3,13,nchar(p3)))
再一次,我们使用上面的substr
来删除非JSON内容,以便于解析。
现在,您可以浏览返回的对象。但看起来您想要的数据存储在以下向量
中cbind(r3$fundData$Fund$profile$portId, r3$fundData$Fund$profile$benchMark)
[,1] [,2]
[1,] "9548" "FTSE All World ex Canada Index in CAD"
[2,] "9561" "FTSE Canada All Cap Index in CAD"
[3,] "9554" "Spliced Canada Index"
[4,] "9559" "FTSE Canada All Cap Real Estate Capped 25% Index"
[5,] "9560" "FTSE Canada High Dividend Yield Index"
[6,] "9550" "FTSE Developed Asia Pacific Index in CAD"
[7,] "9549" "FTSE Developed Europe Index in CAD"
[8,] "9558" "FTSE Developed ex North America Index in CAD"
[9,] "9555" "Spliced FTSE Developed ex North America Index Hedged in CAD"
[10,] "9556" "Spliced Emerging Markets Index in CAD"
[11,] "9563" "S&P 500 Index in CAD"
[12,] "9562" "S&P 500 Index in CAD Hedged"
[13,] "9566" "NASDAQ US Dividend Achievers Select Index in CAD"
[14,] "9564" "NASDAQ US Dividend Achievers Select Index Hedged in CAD"
[15,] "9557" "CRSP US Total Market Index in CAD"
[16,] "9551" "Spliced US Total Market Index Hedged in CAD"
[17,] "9552" "Barclays Global Aggregate CAD Float Adjusted Index in CAD"
[18,] "9553" "Barclays Global Aggregate CAD 1-5 Year Govt/Credit Float Adj Ix in CAD"
[19,] "9565" "Barclays Global Aggregate Canadian 1-5 Year Credit Float Adjusted Index in CAD"
[20,] "9568" "Barclays Global Aggregate ex-USD Float Adjusted RIC Capped Index Hedged in CAD"
[21,] "9567" "Barclays U.S. Aggregate Float Adjusted Index Hedged in CAD"
所以希望这足以提取您需要的数据,以确定更多数据的URL路径。