Если веб-страница содержит динамически генерируемые элементы, то 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