使用R抓取多个网页

时间:2015-08-29 16:42:23

标签: xml r

所以这就是它。请记住,在编写代码时我完全是绿色的,而且我没有R之外的经验。

上下文 - 我想要抓取的每个网页都有一个遵循以下格式的网址:

http://www.hockey-reference.com/friv/dailyleaders.cgi?month= 10 和天= 8 &安培;年= 2014

此网址中更改的变量是月,日和年(以粗体显示)

网址应从10-8-2014开始,到2015年6月18日结束。当然不是每天都有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")

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不确定你是怎么写csv的,但是在这里你可以获得这些日期之间的所有表格。我在前几个网址上对此进行了测试,效果很好。请注意,在阅读表之前,您不需要解析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。请看一下这个,如果它对您有用,那么我们就可以将其写入文件。