【问题标题】:Using R to crawl multiple pages使用 R 爬取多个页面
【发布时间】:2015-08-29 16:42:22
【问题描述】:

就这样吧。请记住,在编写代码方面我完全是新手,而且我在 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")

提前致谢!

【问题讨论】:

标签: xml r


【解决方案1】:

我不确定您要如何编写 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。请看看这个,如果它适合你,那么我们会努力将它写入文件。

【讨论】:

  • 写得就像我用单个 csv 文件写的那样,溜冰者占据一组列,守门员占据一组单独的列,理想情况下守门员表之间没有中断,因为它们的行数总是少于玩家表。它适用于我的目的!谢谢
  • 我也很难写到 csv。 data.frame(skaters = list(Rk = c(1L, 112L, 223L, 334L, 378L, : 参数暗示不同的行数:432, 25 这很奇怪,因为我可以将 10-08-2014 写入 csv 而没有问题,并且行数也不同
  • 您能否在帖子中显示您希望 csv 的外观。您可能只想在write.csv() 中使用append = TRUE
猜你喜欢
  • 2017-09-12
  • 1970-01-01
  • 2023-03-05
  • 2021-03-14
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多