Ну, я буду проклят.Они не используют некоторые более грубые функции ASP.NET, так что это действительно просто.Как я уже отмечал в аналогичном вопросе на этом сайте, нет никаких ограничений по очистке в несуществующем файле robots.txt, а также никаких условий / положений, которые я мог бы найти.
library(httr)
library(rvest)
library(docxtractr) # for data frame cleaning helper utilities
library(tidyverse)
Давайте получимпервая страница:
httr::GET(
url = "http://www.domainia.nl/quarantaine/2018/12/15"
) -> res
pg <- httr::content(res)
Теперь мы извлечем таблицу:
html_node(pg, xpath = ".//table[contains(., 'Domein')]") %>%
html_table(fill=TRUE, trim=TRUE) %>%
select(2:6) %>% # The table is full of junk so we trim it off
docxtractr::assign_colnames(3) %>% # The column headers in in row 3
docxtractr::mcga() %>% # Make the column names great again
tbl_df() -> pg_one
Назначьте ее в список, к которому мы добавим:
pgs <- list(pg01 = pg_one)
Теперь перейдите к оставшимся вкладкам (вы можете сделать дополнительный бит, необходимый для перехода за 10, если их больше 10, выделив строку нумерации страниц и получив максимальный / последний td
).
ВнутриЦикл, мы извлекаем поля состояния просмотра, настраиваем другие параметры тела POST
и увеличиваем получаемую страницу.Мы выдаем POST
, извлекаем новую таблицу в список и затем добавляем / промываем / повторяем для оставшихся страниц:
for (pg_num in 2:10) {
Sys.sleep(5) # be kind since you don't own the server or pay for the bandwidth
hinputs <- html_nodes(pg, "input[type='hidden']")
hinputs <- as.list(setNames(html_attr(hinputs, "value"), html_attr(hinputs, "name")))
hinputs$`ctl00$tbSearch` <- ""
hinputs$`ctl00$ddlState` <- "quarantaine"
hinputs$`__EVENTTARGET` <- "ctl00$ContentPlaceHolder1$gvDomain"
hinputs$`__EVENTARGUMENT` <- sprintf("Page$%s", pg_num)
httr::POST(
url = "http://www.domainia.nl/quarantaine/2018/12/15",
encode = "form",
body = hinputs
) -> res
httr::content(res) %>%
html_node(xpath = ".//table[contains(., 'Domein')]") %>%
html_table(fill=TRUE, trim=TRUE) %>%
select(2:6) %>%
docxtractr::assign_colnames(3) %>%
docxtractr::mcga() %>%
tbl_df() -> pgs[[sprintf("pg_%02s", pg_num)]] # assign it to a new named list entry
}
Наконец, объединяем все эти строки:
bind_rows(pgs)
## # A tibble: 954 x 5
## domein status archive geregistreerd_op uit_quarantaine
## <chr> <chr> <chr> <chr> <chr>
## 1 0172design.nl quarantaine 0 "" 15-12-2018
## 2 0172designs.nl quarantaine 0 "" 15-12-2018
## 3 0172kleding.nl quarantaine 0 "" 15-12-2018
## 4 0172online.nl quarantaine 0 "" 15-12-2018
## 5 123shows.nl quarantaine 0 "" 15-12-2018
## 6 123story.nl quarantaine 0 "" 15-12-2018
## 7 21018dagen.nl quarantaine 0 "" 15-12-2018
## 8 22academy.nl quarantaine 0 "" 15-12-2018
## 9 22aviationcampus.nl quarantaine 0 "" 15-12-2018
## 10 22campus.nl quarantaine 0 "" 15-12-2018
## # ... with 944 more rows