Книга только что вышла из печати, а в ней уже происходят изменения. Раздел вакансий на сайте Минтруда Республики Беларусь превратился в одноимённый раздел на портале службы занятости Беларуси. Изменился дизайн сайта, в результате чего пример с динамически генерируемой ссылкой на файл (с.180-183) больше не работает.

С одной стороны, это плохая новость. С другой стороны, идеи заложенные в примере остаются рабочими, равно как и инструкция по созданию профиля Mozilla Firefox. Покажем как теперь работать с порталом службы занятости Беларуси.

На сайте есть обычная форма запроса, где можно указать название интересующей вакансии

search.png

Вакансии, возвращаемые по запросу, могут располагаться на нескольких страницах. Число вакансий на странице можно регулировать.

res.png

Посмотрим, как устроена наша форма. Воспользуемся для этого инструментами разработчика.

form.png

Здесь указан путь к приложению, выполняющему запрос (action) и заголовок HTTP с названием вакансии (profession).

Составим и выполним HTTP-запрос:

library(httr)
res <- GET("http://vacancy.mintrud.by/",
            path = "/ru/applicant/search-jobs",
            query = list(profession="бухгалтер",at_page=312))
res$url # проверим URL составленного запроса
page <- content(res, as = "text", encoding = "UTF-8")

res$url позволяет сравнить строку запроса, получившуюся у нас, с той, что отображается в адресной строке браузера.

Заголовок at_page задает число вакансий, отображаемых на одной странице. Здесь я схитрил и, зная общее число вакансий, указал отображать их все (312). Разумеется, для профессий с большим числом вакансий этот номер может не пройти и нужно будет писать цикл с перебором по номерам страниц.

Получив страницу page, обрабатываем её при помощи пакета rvest:

library(rvest)
hdoc <- read_html(page)

df <- hdoc %>% html_table() %>% .[[1]] # таблица всего одна и она первая в списке
df <- df[,-1]                          # удалим ненужный первый столбец

Таблица вакансий сохраняется в df.

Код примера хранится здесь.



Комментарии

comments powered by Disqus