首页 > 解决方案 > 在使用 rvest 进行网络抓取时向每个表添加一列

问题描述

我正在尝试抓取此网页上的最后五个日期。我有seq_dates_test(我想在该网页上抓取的日期序列):

structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")

我正在使用下面的代码块成功地抓取这些日期

url <- "http://mcsafetyfeed.org/incidents.php?date="

url %>% 
  map2_chr(seq_dates_test,paste0) %>% 
  map_df(. %>% 
    read_html() %>% 
      html_nodes("table") %>% 
    html_table(header = TRUE) %>%
    # Extract out first element of list
    magrittr::extract2(1)
    )

但是,我想mutate为每个表创建一个日期列(对应于每个日期)。我尝试在mutate(Date = seq_dates_test)之后添加extract2,但出现此错误...

mutate_impl(.data, dots) 中的错误:列Date的长度必须为 285(行数)或 1,而不是 5



更新:我将如何更改我的代码,以便如果表 X 的长度为 0,我会跳过该表并继续抓取下一个表?

标签: rrvestpurrr

解决方案


paste是矢量化的,所以我们不需要做map2. 我们可以直接paste使用带有日期的 'url' 并提取表格并使用.id'Date' 通过命名来创建列vector

library(tidyverse)
out <- map_df(set_names(paste0(url, seq_dates_test), seq_dates_test), ~
      .x %>% 
         read_html() %>% 
         html_nodes("table") %>% 
         html_table(header = TRUE) %>%    
         magrittr::extract2(1), .id = 'Date')

dim(out)
#[1] 1365    6

head(out)
#        Date     Time                                                         Event                               Address     Responding Agency
#1 2019-03-20 23:51:00                                             Parking complaint              1398 DEWEY AV, Rochester Rochester City Police
#2 2019-03-20 23:12:00 Dangerous condition - no immediate danger to life or property        2970 W HENRIETTA RD, Henrietta  Monroe County Police
#3 2019-03-20 22:50:00                                                 Odor of smoke          2349 E RIDGE RD, Irondequoit     Ridge Culver Fire
#4 2019-03-20 22:44:00                                           Dangerous condition          DENISE RD/LAKE AV, Rochester Rochester City Police
#5 2019-03-20 22:00:00                                             Parking complaint               3150 W RIDGE RD, Greece         Greece Police
#6 2019-03-20 21:58:00           Accident of motor vehicles involving unknown injury SB RT 590 AT BROWNCROFT BL, Rochester New York State Police
#       Event ID
#1 CTYP190793429
#2 MCOP190793334
#3 RCUF190793284
#4 CTYP190793264
#5 GREP190793188
#6 NYSP190793186

更新

如果我们需要进行错误检查并返回默认值,可以使用or tryCatchpossiblyfrompurrr

f1 <- function(x) {
        x %>%
           read_html() %>% 
           html_nodes("table") %>% 
           html_table(header = TRUE) %>%    
           magrittr::extract2(1)


}            
pos1 <- possibly(f1, otherwise = NULL, quiet = TRUE)

outlst1 <- map(set_names(paste0(url, seq_dates_test), 
                  seq_dates_test), pos1, .id = 'Date')

然后过滤掉NULL元素

bind_rows(discard(outlst1, is.null))

数据

seq_dates_test <- structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")
url <- "http://mcsafetyfeed.org/incidents.php?date="

推荐阅读