Очистка с помощью rvest: Получение ошибки HTTP 502 - PullRequest
0 голосов
/ 04 июля 2019

У меня есть скрипт R, который использует rvest для извлечения некоторых данных из accuweather. URL-адреса обвинения содержат идентификаторы, которые однозначно соответствуют городам. Я пытаюсь получить идентификаторы в заданном диапазоне и связанные названия городов. Сам rvest отлично работает для одного идентификатора, но когда я перебираю цикл for, он в конечном итоге возвращает эту ошибку - "Ошибка в open.connection (x," rb "): ошибка HTTP 502."

Я подозреваю, что эта ошибка связана с тем, что сайт блокирует меня. Как мне обойти это? Я хочу вырезать из довольно большого диапазона (10 000 идентификаторов), и он продолжает давать мне эту ошибку после ~ 500 итераций цикла. Я тоже пробовал closeAllConnections() и Sys.sleep() но безрезультатно. Буду очень признателен за любую помощь с этой проблемой.

РЕДАКТИРОВАТЬ: Решено . Я нашел способ обойти это через эту тему: Использовать tryCatch для перехода к следующему значению цикла при ошибке? . Я использовал tryCatch() с error = function(e) e в качестве аргумента, и он подавил сообщение об ошибке и позволил циклу продолжаться без прерывания. Надеюсь, это будет полезно всем, кто столкнулся с подобной проблемой.

library(rvest)
library(httr)

# create matrix to store IDs and Cities
# each ID corresponds to a single city 
id_mat<- matrix(0, ncol = 2, nrow = 10001 )

# initialize index for matrix row  
j = 1

for (i in 300000:310000){
  z <- as.character(i)
# pull city name from website 
  accu <- read_html(paste("https://www.accuweather.com/en/us/new-york-ny/10007/june-weather/", z, sep = ""))
  citystate <- accu %>% html_nodes('h1') %>% html_text()
# store values
  id_mat[j,1] = i
  id_mat[j,2] = citystate
# increment by 1 
  i = i + 1 
  j = j + 1
    # close connection after 200 pulls, wait 5 mins and loop again
    if (i %% 200 == 0) {
        closeAllConnections()
        Sys.sleep(300)
        next 
  } else {
        # sleep for 1 or 2 seconds every loop
        Sys.sleep(sample(2,1))
  }
}

1 Ответ

1 голос
/ 05 июля 2019

Проблема, похоже, исходит от научной нотации.

Как отключить научную запись?

Я немного изменил ваш код, теперь он работает:

library(rvest)
library(httr)

id_mat<- matrix(0, ncol = 2, nrow = 10001 )

readUrl <- function(url) {
out <- tryCatch(
{   
  download.file(url, destfile = "scrapedpage.html", quiet=TRUE)
  return(1)
},
error=function(cond) {

  return(0)
},
warning=function(cond) {
  return(0)
}
)    
return(out)
}

j = 1

options(scipen = 999)

for (i in 300000:310000){
  z <- as.character(i)
# pull city name from website 
  url <- paste("https://www.accuweather.com/en/us/new-york-ny/10007/june-weather/", z, sep = "")
  if( readUrl(url)==1) {
  download.file(url, destfile = "scrapedpage.html", quiet=TRUE)
  accu <- read_html("scrapedpage.html")
  citystate <- accu %>% html_nodes('h1') %>% html_text()
# store values
  id_mat[j,1] = i
  id_mat[j,2] = citystate
# increment by 1 
  i = i + 1 
  j = j + 1
    # close connection after 200 pulls, wait 5 mins and loop again
    if (i %% 200 == 0) {
        closeAllConnections()
        Sys.sleep(300)
        next 
  } else {
        # sleep for 1 or 2 seconds every loop
        Sys.sleep(sample(2,1))
  }
   } else {er <- 1}
  }
...