#r #web-scraping #rvest
#r #очистка веб-страниц #rvest
Вопрос:
Я пытался использовать rvest, чтобы получить все 471 обращение на этом сайте, но каждый раз мог получить только 25 обращений (независимо от того, расширен список или нет). Любая помощь будет оценена.
library("rvest")
url <- "http://investmentpolicyhub.unctad.org/ISDS?status=100"
cases <- url %>%
read_html() %>%
html_nodes(xpath='//*[@id="cases-list"]') %>%
html_table()
View(cases)
Спасибо.
Комментарии:
1. Он использует запрос XHR для загрузки дополнительных обращений, а веб-сервер проверяет наличие javascript при попытке загрузить URL-адрес запроса XHR, поэтому вам нужно будет использовать RSelenium.
Ответ №1:
Проблема в том, что вам нужно нажать кнопку «Показать все», чтобы показать остальную часть таблицы, чего вы не можете сделать с помощью rvest. Таким образом, использование RSelenium для навигации и rvest для синтаксического анализа,
library(RSelenium)
library(rvest)
pJS <- phantom() # install PhantomJS if necessary
remDr <- remoteDriver(browserName = 'phantomjs')
remDr$open()
remDr$navigate(url)
button <- remDr$findElement(using = 'css selector', 'a#loadWholeList')
button$clickElement()
Sys.sleep(60) # or just wait a while, or rerun the following bits till they work
html <- remDr$getPageSource()
cases <- html[[1]] %>% read_html() %>%
html_node('table#cases-list') %>%
html_table()
if(nrow(cases) > 26){
remDr$close()
pJS$stop()
}
Поскольку вы управляете [безголовым] браузером, биты после щелчка могут дать вам 25 строк или 471 строку, в зависимости от того, завершилась ли загрузка таблицы. Таблица довольно большая, поэтому для загрузки требуется некоторое время, как и в обычном браузере. Если вы не получите все, подождите некоторое время и запустите строки Sys.sleep
снова.
С терпением, хотя:
tail(cases[, 1:3])
## No. Year of initiation Short casename
## 466 466 1995 Goetz v. Burundi (I)
## 467 467 1995 Leaf Tobacco v. Albania
## 468 468 1994 Gruslin v. Malaysia (I)
## 469 469 1994 Saar Papier v. Poland (I)
## 470 470 1993 AMT v. Zaire
## 471 471 1987 AAPL v. Sri Lanka
Комментарии:
1. Алистер, большое спасибо за помощь. Это отлично работает, но мне потребовалось некоторое время, чтобы заставить phantomjs работать, а затем я заметил, что мне пришлось заменить 26 внутри «if (nrow (cases)> 26)» на 471, чтобы получить все случаи :))..
2.
remDr$close()
иpJS$stop()
просто выключите удаленный драйвер и PhantomJS. Они заключены в условное условие, поэтому они не будут выполняться, если у вас нет нужных данных. Если вы собираетесь изменить условие на 471, вам также следует изменить его на>=
, иначе вы никогда не закроете их.