如何在for循环中添加一个间隔以防止“太多请求”错误(+ 2个次要问题)?

时间:2019-04-10 16:55:03

标签: r web-scraping

我目前正处于硕士论文的数据准备阶段,但遇到了一个问题。我正在尝试使用R循环中的for循环和rvest软件包(基于约90k ID的向量)来抓取网站。 如何在for循环中添加时间间隔以防止HTML-请求过多错误?

我还有两个小问题,我需要一些帮助:

  1. 如果我仅使用10个ID的向量来测试循环,则循环将继续覆盖结果,从而覆盖观察值1-9,并且仅显示观察值10。

  2. 我可以成功地刮取一个元素(名字),但是当我尝试刮取第二个元素并将其添加到另一列中时,代码失败。

我已经修改了一段时间,所以我已经进行了很多迭代,这是我唯一可以使用的版本。为了覆盖观察结果,我尝试在[playernames]之后添加[i],但会产生错误“新列将在现有列之后留下漏洞”。

# playerid is a vector of ~90k different IDs. (wouldn't work as a list)
# I successfully manage to scrape the first name of the player, although it keeps overwriting the observation.

for(i in playerid){
  websiteX <- paste("http://www.X.com/id=",i, sep="")
  websiteX <- read_html(websiteX)
  playernames <- data.frame(first =websiteX %>% html_node("dd:nth-child(2)") %>% html_text() ,
                            stringsAsFactors=FALSE)
  playernames$playerid <- i
}

# I want to also scrape the surname using: sur =websiteX %>% html_node(websiteX, "dd:nth-child(4)") %>% html_text() ,

简而言之,我想要的是一个90k播放器ID的数据框,然后是名字的第一列和名字的第二列。

如果我使用整个90k ID集并且仅尝试刮取名字,我将得到一个HTML重载错误。如果我仅抓取几个名称(例如10),它将不断覆盖观察结果。

我没有办法实现对姓氏的抓取,也不清楚如何添加时间间隔以防止出现过载错误。

# Changing 
playernames <- data.frame~... 
# to 
playernames[i] <- data.frame~... 
# produces the new columns would leave holes after existing columns error.

0 个答案:

没有答案