R浏览器和GET / getURL之间的差异

时间:2014-08-07 02:21:50

标签: r curl rcurl httr

我试图从页面下载内容,并且我发现响应数据格式不正确或不完整,就好像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)))

1 个答案:

答案 0 :(得分:6)

我认为问题是您可能无法理解此网页的工作原理。当您致电GET(url)时,您将获得该页面来源的实际html/text。这是直接从服务器发送的内容。这并不总是在浏览器中显示的内容。现在尤其如此,以后通过javascript生成大量页内内容。这正是这个页面正在发生的事情。页面上的“内容”在该页面的html源代码中找不到;它稍后通过javascript下载。

httrRCurl都不会执行使用您实际查看的表“填充”页面所需的javascript。有一个名为RSelenium的软件包能够与浏览器交互以执行javascript,但在这种情况下,我们实际上可以解决这个问题。

首先,请注意为什么getURL不起作用。看起来这个Web服务器会嗅探请求程序发送的用户代理以发回不同的内容。无论RCurl使用的默认用户代理是什么,都不足以从服务器获取html。您可以通过指定其他用户代理来解决此问题。例如

d2 <- getURL(url, .opts=list(useragent="Mozila 5.0"))

似乎有效。

但回到主要问题。处理此类问题时,我强烈建议您使用Chrome开发者工具(或您喜欢的浏览器中的等效工具)。在Chrome开发者工具中,特别是在“广告联盟”标签上,您可以看到Chrome为获取数据而发出的所有请求

enter image description here

如果单击第一个(“etfs.html”),您可以看到该请求的标题和响应。在回复子标签上,您应该会看到与GETgetURL完全相同的内容。然后我们下载了一堆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路径。