我正在尝试从页面下载内容,并且我发现响应数据格式不正确或不完整,就好像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
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么办.我的目标是获取与浏览器中显示的链接相关联的数字:
https://www.vanguardcanada.ca/individual/etfs/etfs-detail-overview.htm?portId=9548
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,我想下载并刮掉'9548'.
不确定为什么getURL和GET似乎与浏览器中显示的结果大相径庭.似乎数据加载缓慢,几乎就像GET和getURL在完全加载之前一样.
例如,看看:
x <- "https://www.vanguardcanada.ca/individual/etfs/etfs-detail-prices.htm?portId=9548"
readHTMLTable(htmlParse(GET(x)))
Run Code Online (Sandbox Code Playgroud)
我认为问题是您可能无法理解此网页的工作原理.当你打电话时,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"))
Run Code Online (Sandbox Code Playgroud)
似乎工作.
但回到主要问题.处理此类问题时,我强烈建议您使用Chrome开发者工具(或您喜欢的浏览器中的等效工具).在Chrome开发者工具中,特别是在"网络"标签上,您可以看到Chrome为获取数据而发出的所有请求

如果单击第一个("etfs.html"),您可以看到该请求的标题和响应.在响应子选项卡上,您应该看到与GET或找到的内容完全相同getURL.然后我们下载了一堆CSS和javascript文件.看起来最有趣的文件是"GetETFJson.js".这实际上似乎以大约 JSON格式保存大部分数据.它实际上在JSON块前面有一些真正的javascript,这种方式会受到阻碍.但我们可以下载该文件
d3 <- GET("https://www.vanguardcanada.ca/individual/mvc/GetETFJson.js")
Run Code Online (Sandbox Code Playgroud)
用文本提取内容作为文本
p3 <- content(d3, as="text")
Run Code Online (Sandbox Code Playgroud)
然后将其转换为R对象
library(jsonlite)
r3 <- fromJSON(substr(p3,13,nchar(p3)))
Run Code Online (Sandbox Code Playgroud)
再一次,我们在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"
Run Code Online (Sandbox Code Playgroud)
所以希望这足以提取您需要的数据,以识别具有更多数据的URL路径.
| 归档时间: |
|
| 查看次数: |
1430 次 |
| 最近记录: |