Если веб-страница содержит динамически генерируемые элементы, то rvest'ом или XML'ем её не взять. Проверить наличие таких элементов можно, сопоставляя содержимое страницы, полученное с помощью HTTP-запроса (httr, rvest и т.п.) с той же страницей, сохранённой в браузере (RSelenium).

Однако не всё так просто. Если сравнивать содержимое страниц (или отдельных их элементов, например, body) буквально, то расхождение между ними может вызвать единственный пробел, что конечно же не означает, будто страница сгенерирована динамически. Поэтому сравнивать мы будем не содержимое страниц, а их структуру. Для этого воспользуемся функцией html_structure из rvest (xml2). Кроме того, исследовать мы будем не весь документ, а лишь его "подозрительный" фрагмент.

В качестве примера рассмотрим объявления о защите диссертаций, публикуемые на сайте ВАК. Есть подозрение, что список объявлений генерируется динамически.

library(RSelenium)
startServer()
rd <- remoteDriver(remoteServerAddr = "localhost",
                   port = 4444,
                   browserName="firefox")
rd$open()
url <- "http://vak.ed.gov.ru/dis-list"
rd$navigate(url)

page_from_browser <- rd$getPageSource()[[1]] # содержимое страницы из браузера

library(rvest)

path <- ".//*[@id='filter_def']/div[2]"      # путь к списку объявлений

# Структура из страницы, сохранённой в браузере
hdoc1 <- read_html(page_from_browser) %>% html_node(xpath = path)
from_browser <- capture.output(html_structure(hdoc1))

# Структура из страницы, сохранённой по HTTP-запросу
hdoc2 <- read_html(url) %>% html_node(xpath = path)
from_scraper <- capture.output(html_structure(hdoc2))

Функция capture.output нужна для того, чтобы перехватить вывод html_structure() и сохранить его в переменной. Дело в том, что html_structure() просто печатает структуру документа на экране, так что приходится немного хитрить.

Фрагмент, сохранённый в браузере, имеет следующую структуру:

<div [style]>
  {text}
  <label>
    {text}
  {text}
  <input [style, onkeyup, filter_ctrl-2-first_name, filter_ctrl-1-last_name, filter_ctrl]>

А вот rvest не сохранил ничего:

[1] NA

Так что наши подозрения подтвердились.



Комментарии

comments powered by Disqus