Web-скрапинг

Задание 1

Установите и подключите пакет rvest. Импортируйте страницу https://cran.r-project.org/web/packages/rvest/index.html.

# install.packages('rvest')
library(rvest)
url <- 'https://cran.r-project.org/web/packages/rvest/index.html'
page <- read_html(url)

Задание 2

Проверьте, что страница импортировалась - выведите на печать структуру страницы или дочерние ноды. Для сокращения объема вывода можно просто вывести дочерние ноды от <body>.

Ноды организованы в виде списка, поэтому и навигация по ним соответствующая - для получения элементов <body> надо именно вызывать не второй элемент списка html_children(page), а элементы второго списка:

html_children(page)[[2]]
## {html_node}
## <body>
## [1] <div class="container">\n<h2>rvest: Easily Harvest (Scrape) Web Pages</h2 ...

Задание 3

Используя полный путь XPath, выведите на печать заголовок страницы (rvest:...).

html_element(page, xpath = '/html/body/div/h2') %>%
  html_text()
## [1] "rvest: Easily Harvest (Scrape) Web Pages"

Задание 4

Используя сокращенный XPath-путь, выведите на печать заголовок страницы (rvest:...), тег h2 единственный на всей странице.

html_element(page, xpath = '//h2') %>%
  html_text()
## [1] "rvest: Easily Harvest (Scrape) Web Pages"

Задание 5

Выведите на печать h4-заголовок второго блока (Reverse dependencies:).

html_element(page, xpath = '//h4[2]') %>%
  html_text()
## [1] "Downloads:"

Задание 6

Выведите на печать все h4-заголовки.

Наиболее очевидный путь - пройти циклом/lapply и собрать все заголовки. Правда, в этом случае придется включать проверку на наличие элемента. Можно пойти простым и чуть более рискованным путем, приемлемым для примитивных сайтов.

html_elements(page, xpath = '//h4') %>%
  html_text()
## [1] "Documentation:"        "Downloads:"            "Reverse dependencies:"
## [4] "Linking:"

Задание 7

Выведите на печать блок информации о пакете (от Version: 0.3.5 до Downlods:). Можно сократить вывод до трех строк.

x <- html_element(page, xpath = '/html/body/div/table') %>%
  html_table(header = FALSE)
head(x, 3)
## # A tibble: 3 × 2
##   X1       X2                                                                   
##   <chr>    <chr>                                                                
## 1 Version: "1.0.2"                                                              
## 2 Depends: "R (≥ 3.2)"                                                          
## 3 Imports: "httr (≥ 0.5), lifecycle (≥ 1.0.0), magrittr, rlang (≥\n0.4.10), sel…

Задание 8

Выведите на печать блок информации о пакете (от Version: 0.3.5 до Downlods:). Можно сократить вывод до трех строк. Вместо полного XPath-пути используйте сокращенный путь с фильтрацией по классу.

x <- html_element(page, xpath = '//table[@summary="Package rvest summary"]') %>%
  html_table(header = FALSE)
head(x, 3)
## # A tibble: 3 × 2
##   X1       X2                                                                   
##   <chr>    <chr>                                                                
## 1 Version: "1.0.2"                                                              
## 2 Depends: "R (≥ 3.2)"                                                          
## 3 Imports: "httr (≥ 0.5), lifecycle (≥ 1.0.0), magrittr, rlang (≥\n0.4.10), sel…

Задание 9

Извлеките и выведите на печать версию пакета (Version).

Тэг tbody появляется при рендере таблицы браузером, в исходном коде страницы (которые и импортируется с помощью read_html())он отсутствует, поэтому его надо исключить.

html_element(page, xpath = '//table[@summary="Package rvest summary"]/tr[1]/td[2]') %>%
  html_text()
## [1] "1.0.2"

Задание 10

Извлеките и выведите на печать рекомендуемую ссылку на пакет (Please use the canonical form).

html_element(page, xpath = '//p[2]/a') %>%
  html_attr('href')
## [1] "https://CRAN.R-project.org/package=rvest"