просмотрите список URL-адресов и загрузите HTML-таблицу R

#r #loops #web-scraping

#r #циклы #очистка веб-страниц

Вопрос:

Я пытаюсь загрузить информацию об игроке из справочника по баскетболу.

У меня есть csv, который я импортировал как фрейм данных (data_allplayers), в котором есть два столбца: один с URL-адресом, а другой с именем, под которым я хочу сохранить этот файл.

 https://www.basketball-reference.com/players/g/gordoaa01/gamelog/2020
Aaron Gordon
2
https://www.basketball-reference.com/players/h/holidaa01/gamelog/2020
Aaron Holiday
3
https://www.basketball-reference.com/players/n/naderab01/gamelog/2020
Abdel Nader
 

и т.д. для 529 строк.

Я хочу просмотреть его и сохранить каждый URL-адрес и основную таблицу данных в этом местоположении в dataframe, который затем сохраняется с именем игрока.

Я могу отлично загружать эти таблицы, но я вручную / индивидуально использую:

 #player1  
webpage <- read_html("https://www.basketball-reference.com/players/g/gordoaa01/gamelog/2020")
tbls <- html_nodes(webpage, "table") %>% 
  html_table(fill = TRUE)
Aaron_Gordon <- as.data.frame(tbls[8])
 

Но мне не нравится превращать это в цикл, используя URL-адреса, уже заполненные в моем списке. Полный код, который я пробовал, приведен ниже, любая помощь приветствуется!

 # Load libraries
library(dplyr) 
library(readxl)
library(rvest)
library(data.table) 
library(readr)
library(plyr)



data_allplayers <- read_csv("NBA_rebounds - players1.csv")
#delete the unwanted columns, add headers
data_allplayers <- select(data_allplayers, url, full_name)
header <- c("url", "name")
setnames(data_allplayers, header)
#removes first row
data_allplayers <- data_allplayers[-c(1), ]


#attempt at loop that doesn't work

for(i in 1:nrow(data_allplayers)){
  webpage <- read_html(data_allplayers$url[[i,]])
  tbls <- html_nodes(webpage, "table") %>% 
    html_table(fill = TRUE)
  Data_scrape <- as.data.frame(tbls[8])
  Report1_Name <- data_allplayers$name[[i,]]
  write.csv(Data_scrape, paste0(Report1_Name,".csv"))
}
 

Комментарии:

1. Поделитесь своим CSV-файлом для 3 игроков. Цикл работает абсолютно нормально, я создал свой собственный csv, и он написал нормально. for(i in 1:nrow(data_allplayers)){ webpage <- read_html(data_allplayers$url[i]) tbls <- html_nodes(webpage, "table") %>% html_table(fill = TRUE) Data_scrape <- as.data.frame(tbls[8]) Report1_Name <- data_allplayers$full_name[i] write.csv(Data_scrape, paste0(Report1_Name,".csv")) }

2. Спасибо за исправление ошибок в моем цикле, очень признателен, он работает нормально, но теперь у меня другая проблема, заключающаяся в том, что он возвращает ошибку после 75 итераций.

3. Ошибка в open.connection (x, «rb»): ошибка HTTP 500.

4. на самом деле все в порядке, я понял, что некоторые URL-адреса в моем csv были неверными, и я исправил это сейчас, кажется, работает нормально. еще раз спасибо

Ответ №1:

Вот один из способов сделать это с Map :

 library(rvest)

Map(function(x, y) {
  read_html(x) %>%
    html_nodes('table') %>%
    html_table(fill = TRUE) %>%
    .[[8]] %>%
    write.csv(paste0(y, '.csv'), row.names = FALSE)
}, data_allplayers$url, data_allplayers$name)
 

Для меня это отлично работает для 3 значений, которыми вы поделились.

 data_allplayers <- structure(list(url = c("https://www.basketball-reference.com/players/g/gordoaa01/gamelog/2020 ", 
"https://www.basketball-reference.com/players/h/holidaa01/gamelog/2020 ", 
"https://www.basketball-reference.com/players/n/naderab01/gamelog/2020 "
), name = c(" Aaron Gordon", " Aaron Holiday", " Abdel Nader"
)), class = "data.frame", row.names = c(NA, -3L))