就这样开始了。请记住,在编写代码时,我完全是绿色的,我在R之外没有任何经验。
上下文--我想爬行的每一页都有一个遵循以下格式的URL:
http://www.hockey-reference.com/friv/dailyleaders.cgi?month=10&day=8&year=2014
此url中更改的变量是月、日和年份(以粗体表示)。
网址应从10-8至2014年开始,至6-18-2015年结束。当然,不是每天都有一个NHL游戏,所以有些网页将是空白的。
所有其他页面都有一个用于球员的HTML表和一个用于守门员的表。
我已经想出了如何爬行和导出到csv只有一页,并且不知道从这里到哪里去做它,这样我就可以一举完成上个赛季的每一场比赛(在我上面提到的日期之内)。
守则如下:
library(XML)
NHL <- htmlParse("http://www.hockey-reference.com/friv/dailyleaders.cgi?month=10&day=8&year=2014")
class(NHL)
NHL.tables <- readHTMLTable(NHL,stringAsFactors = FALSE)
length(NHL.tables)
head(NHL.tables[[1]])
tail(NHL.tables[[1]])
head(NHL.tables[[2]])
tail(NHL.tables[[2]])
write.csv(NHL.tables, file = "NHLData.csv")
提前感谢!
发布于 2015-08-29 17:03:53
我不知道你想如何写csv的,但这里是如何得到所有的表之间的日期。我在最初的几个URL上测试了这个,它运行得很好。注意,在读取表之前不需要解析html,因为readHTMLTable()
能够直接从URL读取和解析。
library(XML)
library(RCurl)
# create the days
x <- seq(as.Date("2014-10-12"), as.Date("2015-06-18"), by = "day")
# create a url template for sprintf()
utmp <- "http://www.hockey-reference.com/friv/dailyleaders.cgi?month=%d&day=%d&year=%d"
# convert to numeric matrix after splitting for year, month, day
m <- do.call(rbind, lapply(strsplit(as.character(x), "-"), type.convert))
# create the list to hold the results
tables <- vector("list", length(allurls))
# get the tables
for(i in seq_len(nrow(m))) {
# create the url for the day and if it exists, read it - if not, NULL
tables[[i]] <- if(url.exists(u <- sprintf(utmp, m[i, 2], m[i, 3], m[i, 1])))
readHTMLTable(u, stringsAsFactors = FALSE)
else NULL
}
str()
相当长,所以下面是对第一个元素的尺寸的一个小小的观察
lapply(tables[[1]], dim)
# $skaters
# [1] 72 23
#
# $goalies
# [1] 7 15
上面的for()
循环将构造一个URL,然后检查它是否存在于我们序列中的每一天。如果存在,我们将继续阅读当天的表。如果不是,列表元素将是NULL
。请看一下这个,如果它对您有效,那么我们将致力于将它写到文件中。
https://stackoverflow.com/questions/32288381
复制相似问题