Создание веб-страниц с помощью rvest

#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, вам также следует изменить его на >= , иначе вы никогда не закроете их.