【问题标题】:discontinued urls while web scraping using rvest (R)使用 rvest (R) 进行网页抓取时已停用的网址
【发布时间】:2015-12-16 12:06:54
【问题描述】:

我已经构建了一个函数,它获取一个 url 并在抓取网页后返回所需的结果。功能如下:

library(httr) 
library(curl) 
library(rvest) 
library(dplyr)

sd_cat <- function(url){
  cat <- curl(url, handle = new_handle("useragent" = "myua")) %>%
  read_html() %>%
  html_nodes("#breadCrumbWrapper") %>%
  html_text()

x <- cat[1]

#y <- gsub(pattern = "\n", x=x, replacement = " ")

y <- gsub(pattern = "\t", x=x, replacement = " ")

y <- gsub("\\d|,|\t", x=y, replacement = "")

y <- gsub("^ *|(?<= ) | *$", "", y, perl=T)

z <- gsub("\n*{2,}","",y)

z <- gsub(" {2,}",">",z)

final <- substring(z,2)

final <- substring(final,1,nchar(final)-1)

final

#sample discontinued url: "http://www.snapdeal.com//product/givenchy-xeryus-rouge-g-edt/1978028261"
#sample working url: "http://www.snapdeal.com//product/davidoff-cool-water-game-100ml/1339014133"
}

这个函数在包含多个 url 的字符向量上使用 sapply 可以正常工作,但是如果单个 url 被中断,函数会抛出

open.connection(x, "rb") 中的错误:HTTP 错误 404。

我需要一种方法来跳过已停用的网址,以使该功能正常工作。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    更好的解决方案是使用 httr 并在响应不正常时故意采取措施:

    library(httr) 
    library(rvest) 
    
    sd_cat <- function(url){
      r <- GET(url, user_agent("myua"))
      if (status_code(r) >= 300)
        return(NA_character_)
    
      r %>%
        read_html() %>%
        html_nodes("#breadCrumbWrapper") %>%
        .[[1]] %>% 
        html_nodes("span") %>% 
        html_text()
    }
    
    sd_cat("http://www.snapdeal.com//product/givenchy-xeryus-rouge-g-edt/1978028261")
    sd_cat("http://www.snapdeal.com//product/davidoff-cool-water-game-100ml/1339014133")
    

    (我还用更好地使用 rvest 替换了您的正则表达式)

    【讨论】:

      【解决方案2】:

      也许可以试试for,而不是sapply。你可以毫无问题地使用tryCatch()

      url <- c("first_url", "second_url")
      result <- vector("list", length(url))
      
      for(i in 1:length(url)){
          result[[i]] <- tryCatch({sd_cat(url[i])}, error=function(err) "Error 404")
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-15
        • 2015-09-06
        • 1970-01-01
        • 2019-10-11
        • 2018-10-27
        相关资源
        最近更新 更多