r - 使用RVest(R)进行网页抓取时,URL停止使用

标签 r web-scraping rvest

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

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"
}

在包含多个网址的字符向量上使用sapply时,此函数可以正常工作,但是如果中断了单个网址,则该函数将抛出

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

我需要一种方法来跳过不连续的URL,以使该功能正常工作。

最佳答案

更好的解决方案是使用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替换了您的正则表达式)

关于r - 使用RVest(R)进行网页抓取时,URL停止使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34311626/

相关文章:

r - 除了功能帮助文件和演示之外,是否有 R 包的通用手册, "quantstrat","blotter","FinancialInstrument"等?

Rvest:抓取多个 URL

python - Scrapy:LinkExtractor 不工作

python - Python 中带有过滤功能的漂亮汤查询

ios - 如何以编程方式填写网络表单以获取过去的身份验证页面? (在 iOS 中)

r - 从 rvest R 中的属性中抓取名称(值)

r - 使用 R 填写 html 表单并下载生成的文件

c++ - 'unlockEnvironment' 通过 'Rcpp' 而不是 'inline' 实现

r - 使用R中的match函数按原样获得nomatch返回值

r - 如何聚合 R 行中的每 4 行