我想抓取 http://ifsfd.fudan.edu.cn/fdurmb/indexchart1.jsp 里flash的数据

用chrome的审查元素 -》Network -》XHR 刷新页面 就能看出取数据的地址是 http://ifsfd.fudan.edu.cn/fdurmb/data?df=2000%2F01%2F03&type=0%2C1%2C2&dt=2013%2F01%2F16

这是json格式,好在R里面有读取JSON的包rjson

<br />
require(rjson)<br />
require(RCurl)<br />
fdjson <- getURL("http://ifsfd.fudan.edu.cn/fdurmb/data?df=2000%2F01%2F03&type=0%2C1%2C2&dt=2013%2F01%2F16")<br />
fdlist <- fromJSON(fdjson)<br />
</p>

这样读取的json是list

</p>
<p>> fdlist[[1]]<br />
$d<br />
[1] "2000-01-03"</p>
<p>$v0<br />
[1] 100.995</p>
<p>$v1<br />
[1] 105.7158</p>
<p>$v2<br />
[1] 105.1078<br />
</p>

我希望得到一个数据框,所以要做一下处理

<br />
n <- length(fdlist)</p>
<p>for(i in 1:n){<br />
	if(i == 1){<br />
		res <- as.data.frame(fdlist[[i]])<br />
	}else{<br />
		res <- rbind(res,as.data.frame(fdlist[[i]]))<br />
	}<br />
}</p>
<p>res$d <- as.character(res$d)</p>
<p>
</p>

有没有其他办法呢,搜了一下,下面是几种方法

<br />
# 用plyr包里的ldply函数<br />
require(plyr)<br />
fddf <- ldply(fdlist,data.frame)</p>
<p># 用do.call<br />
n <- length(fdlist)<br />
for(i in 1:n){<br />
	fdlist[[i]] <- data.frame(fdlist[[i]])<br />
}</p>
<p>fddf <- do.call("rbind",fdlist)</p>
<p># 用rbind.fill<br />
require(plyr)<br />
fddf <- rbind.fill(fdlist)<br />
</p>

fdm <-matrix(unlist(fdlist),ncol=4,byrow=T)

fddf <- data.frame(fdm[,-1])

row.names(fddf) <- fdm[,1]

回复 第2楼 的 微微:很好 速度也很快! 不过我还是想保持第一列是日期的字符串

回复 第2楼 的 微微:按照你的思路写了下

<br />
fdm <-matrix(unlist(fdlist),ncol=4,byrow=T)<br />
fddf <- data.frame(fdm)<br />
fddf[,2] <- as.numeric(fddf[,2])<br />
fddf[,3] <- as.numeric(fddf[,3])<br />
fddf[,4] <- as.numeric(fddf[,4])<br />
colnames(fddf) <- c("d","v0","v1","v2")<br />
fddf$d <- as.character(fddf$d)<br />
</p>

但是经过 as.numeric的处理后 数据框里的数没有正确转换 这是怎么回事呢,我改成下面的就对了

<br />
fdm <-matrix(unlist(fdlist),ncol=4,byrow=T)<br />
fddf <- data.frame(fdm)<br />
fddf[,2] <- as.numeric(fdm[,2])<br />
fddf[,3] <- as.numeric(fdm[,3])<br />
fddf[,4] <- as.numeric(fdm[,4])<br />
colnames(fddf) <- c("d","v0","v1","v2")<br />
fddf$d <- as.character(fddf$d)<br />
</p>

后来发现,在把矩阵fdm转成数据框fddf时,每个字符都变成了factor,data.frame函数有个参数stringsAsFactors,设置成FALSE就可以了

<br />
fdm <-matrix(unlist(fdlist),ncol=4,byrow=T)<br />
fddf <- data.frame(fdm, stringsAsFactors = F)<br />
fddf[,2] <- as.numeric(fddf[,2])<br />
fddf[,3] <- as.numeric(fddf[,3])<br />
fddf[,4] <- as.numeric(fddf[,4])<br />
colnames(fddf) <- c("d","v0","v1","v2")<br />
</p>

咦~我这里运行出来,是日期字符串啊。