【问题标题】:R Scrape-Loop hangs itself upR Scrape-Loop 自行挂起
【发布时间】:2021-07-24 11:40:25
【问题描述】:

我一直在努力解决以下问题: 我有一个带有 +22'000 URL 的向量,我将其放入抓取循环中。 抓取循环没有给我任何错误消息,但突然停止工作,即使代码仍在运行(红色停止符号仍然存在,但循环实际上不再运行)。好像 R 挂了。

我的猜测是,这与打开的连接有关,即使我插入了 'close(url)' 代码。

install.packages("pacman")
require(pacman)

pacman::p_load(stringr, tibble, xml2, stringr, dplyr, tidyr, base, readxl,rvest,RCurl)

OEM_Nummer_Toner<-read_html('https://www.tonerpartner.ch/oem-Nummer/')%>%
  html_nodes('ul>li>a')%>%
  html_attr('href')

Output <- data.frame(matrix(ncol=1, nrow=0))
colnames(Output)<-'URL'

i<-1      

for (j in OEM_Nummer_Toner) {

  Sys.sleep(runif(1, min=0.5, max=1))
  
  url<- paste0('https://www.tonerpartner.ch',j)
  
  if (url.exists(url)==TRUE){
  
  url<-url(url,'rb')
  html<-read_html(url)
  close(url)
  
  update<- html %>%
    html_nodes('.articletitle')%>%
    html_attr('href')
  
  update<-as.tibble(update)
  
  names(update)<-'URL'
  
  Output<<-rbind(Output, update)
  }
  else
    {}
  print(i)
  print(j)
  print(update)
  i<-i+1
}

第一个循环生成向量以在第二个循环中循环。

我一直在研究这个问题,但我什至没有真正找出问题所在。

非常感谢! 大卫

【问题讨论】:

  • 您可以验证您的连接数理论,例如在 linux 系统上this way。我认为if(url.exists(url)==TRUE) 可以简化为if(url.exists(url))。你可以debug你的代码来看看发生了什么。

标签: r for-loop web-scraping apply rvest


【解决方案1】:

您正在for 循环中增长对象,这非常低效且缓慢。试试看:

urls <- paste0('https://www.tonerpartner.ch',OEM_Nummer_Toner)

purrr::map_df(urls, ~{
  Sys.sleep(runif(1, min=0.5, max=1))
  if(RCurl::url.exists(.x)) 
    tibble(URL = .x %>% 
                  read_html %>% 
                  html_nodes('.articletitle') %>% 
                  html_attr('href'))

  else tibble(URL = NA)
}) -> result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2018-03-23
    • 1970-01-01
    • 2023-01-13
    • 2020-10-05
    • 1970-01-01
    • 2020-10-23
    • 2019-02-15
    相关资源
    最近更新 更多