Скребковая таблица с данными поста в R - PullRequest
0 голосов
/ 23 октября 2019

Я ищу помощь в очистке всех данных с веб-сайта. Стандартный подход, который я бы использовал с rvest (обрисован в общих чертах ниже), не работает, поскольку данные, по-видимому, находятся под запросом POST, и я не могу изменить URL-адрес, чтобы получить более 30 результатов из встроенной таблицы.

Я думаю, у меня есть 2 варианта:

  1. Выяснить параметры запроса Post после ссылки Export Data и реплицировать запрос (аналогично: Очистка динамической таблицы вR с POST )
  2. Определите параметры запроса Post, который изменяет номера страниц, и используйте некоторую форму purrr::map, чтобы отобразить все страницы, и очистите информацию, используя rvest,

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

Кроме того, я работаю со многими URL, которые имеют параметры запроса. Есть ли более эффективный способ создания URL (в случае, если я хочу сделать любой из параметров запроса частью аргумента функции)? Для этого я скопировал и вставил параметры из Firefox, затем вручную добавил запятые и кавычки. Должен быть более прямой способ сделать это.

rvest очистка одной страницы

library(dplyr)

url <- list(
  hostname = "www.fangraphs.com/auctiontool.aspx",
  scheme = "https",
  query =  list(
  type = "pit",
  proj = "2019",
  pos = "1,1,1,1,5,1,1,1,0,1,6,3,0,5,0",
  dollars = "260",
  teams = "12",
  mp = "20",
  msp = "5",
  mrp = "5",
  mb = "1",
  split = "",
  points = "c|0,1,2,3,4|0,1,2,3,4",
  lg = "MLB",
  rep = "0",
  drp = "0",
  pp = "C,SS,2B,3B,OF,1B",
  players = ""
)) %>% data.table::setattr("class", "url")

url <- httr::build_url(url)

page <-
  url %>%
  xml2::read_html()

players <-
  page %>%
  rvest::html_nodes("table.rgMasterTable a[href *= 'playerid']") %>%
  rvest::html_text()
# get playerid's
player_ids <-
  page %>%
  rvest::html_nodes("table.rgMasterTable a[href *= 'playerid']") %>%
  rvest::html_attr("href") %>%
  stringr::str_extract("[0-9]{2,8}")

# get players
df_players <-
  tibble(playerid = player_ids, Name = players) %>%
  distinct() 
# get column names
column_names <-
  page %>%
  rvest::html_nodes("th.rgHeader") %>%
  rvest::html_text()

table_data <-
  page %>%
  rvest::html_table(fill = TRUE, header = NA) %>%
  .[[15]] %>%
  as_tibble()
Created on 2019-10-23 by the reprex package (v0.3.0)

Затем моя попытка запустить запрос POST. Я застреваю при построении параметров из данных POST.

resp <- 
    httr::POST(url) %>%
    xml2::read_html()

  view <- 
    resp %>%
    rvest::html_nodes("input[name='__VIEWSTATE']") %>%
    rvest::html_attr("value")

  event <- 
    resp %>%
    rvest::html_nodes("input[name='__EVENTVALIDATION']") %>%
    rvest::html_attr("value")

# here is where I'm stuck.  I go into firefox, click export data, and then copy the post data.  The response is very long, and appears like it needs a ton of manual formatting to add quotes and commas.  What's the right way to build the params?  
  params <- 
    list(

  )

  request <- httr::POST(url, body = params, encode = "form")


  # Create data frame from scrape
  df <- read.csv(textConnection(as.character(request)))
...