【问题标题】:How to skip a page scrape when table is missing in RR中缺少表时如何跳过页面抓取
【发布时间】:2020-06-01 06:05:28
【问题描述】:

我正在构建一个抓取玩家姓名以及他为数千名不同玩家效力的年份的信息。我已经建立了一个成功的函数来做到这一点,但不幸的是,在某些情况下,我需要的另一半数据(玩了几年)的表不存在。对于这些实例,我想添加一种方法来告诉抓取绕过这些实例。代码如下:

(注意:对象“url_final”是活跃网页URL的列表,其中有很多)

library(rvest)
library(curl)
library(tidyverse)
library(httr)
df <- map_dfr(.x = url_final,
                .f = function(x){Sys.sleep(.3); cat(1); 

 fyr <- read_html(curl(x, handle = curl::new_handle("useragent" = "Mozilla/5.0"))) %>% 
  html_table() %>%
  .[[1]] 

 fyr <- fyr %>%
  select(1) %>%
  mutate(name = str_extract(string = x, pattern = "(?<=cbb/players/).*?(?=-\\d\\.html)"))

                })

这是一个活动页面的示例,您可以在其中通过将 map_dfr 中的 .x 调用中的“url_final”替换为:

https://www.sports-reference.com/cbb/players/karl-aaker-1.html

这里是其中一个实例的示例,其中没有表,因此返回一个错误,打破了抓取的循环。

https://www.sports-reference.com/cbb/players/karl-aaker-1.html

【问题讨论】:

  • 把你的函数放在purrr::safely()。旁注:看起来您的示例链接完全相同。

标签: r web-scraping purrr rvest


【解决方案1】:

添加会忽略任何错误的 try-Catch 怎么样?

library(tidyverse)
library(rvest)

df <- map_dfr(.x = url_final,
              .f = function(x){Sys.sleep(.3); cat(1); 
                 tryCatch({
                 fyr <- read_html(curl::curl(x, 
                      handle = curl::new_handle("useragent" = "Mozilla/5.0"))) %>%
                      html_table() %>% .[[1]] 

               fyr <- fyr %>%
                       select(1) %>%
                       mutate(name = str_extract(string = x, 
                         pattern = "(?<=cbb/players/).*?(?=-\\d\\.html)"))
               }, error = function(e) message('Skipping url', x))
            })

【讨论】:

  • 谢谢你罗纳克!我认为有一个旁路解决方案 - 只是不知道它是什么。每天学习!
猜你喜欢
  • 2018-08-25
  • 2022-06-23
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多