Парсинг данных с HH: ошибка R
Моя задача спарсить больше 2000 вакансий с hh. Когда я задаю параметр for (pageNum in 0:1000), выдает ошибку Error in open.connection(con, "rb") : HTTP error 400
Как можно решить данную проблему? Что означает эта ошибка? Может быть есть вариант по-другому скачать больше 2000 вакансий?
Name = character(), # Название компании
Name = character(), # Название вакансии
Currency = character(), # Валюта
From = character(), # Минимальная оплата
Area = character(), # Город
Requerement = character(), # Требуемые навыки
responsibility = character(),
stringsAsFactors = T)
for (pageNum in 0:1000) { # Всего страниц
data <- fromJSON(paste0("https://api.hh.ru/vacancies?text=\"'HR\"&page=", pageNum))
vacanciesdf <- rbind(vacanciesdf, data.frame(
data$items$area$name, # Город
data$items$salary$currency, # Валюта
data$items$salary$from, # Минимальная оплата
data$items$employer$name, # Название компании
data$items$snippet$requirement,# Требуемые навыки
data$items$snippet$responsibility,
data$items$name))
print(paste0("Upload pages:", pageNum + 1))
Sys.sleep(3)}
Ответы (1 шт):
Автор решения: Dima Shumekov
→ Ссылка
как раз сейчас парсим..
library(rvest)
library(xml2)
library(RCurl)
setwd(dirname(rstudioapi::getActiveDocumentContext()$path)); getwd(); gc()
options(scipen = 999)
start <- 40035001
end <- 40040000
time_start <- Sys.time()
t <- data.frame()
for (vac_number in c(start:end)) {
t_1 <- data.frame(vacancy = vac_number,
is_exist = url.exists(paste0('https://hh.kz/vacancy/', vac_number)))
t <- rbind(t, t_1)
message(vac_number)
}
time_end <- Sys.time()
d <- t %>% dplyr::filter(is_exist == TRUE)
time_start_1 <- Sys.time()
for (vac_number in d$vacancy) {
vacancy <- xml2::read_html(paste0('https://hh.kz/vacancy/', vac_number))
write_xml(vacancy, file = paste0(vac_number, ".html"))
message(vac_number)
}
time_end_2 <- Sys.time()
message(time_end-time_start)
message(time_end_2-time_start_1)
получается небыстро, по одной вакансии в секунду примерно. зато потом можно разобрать скачанные html-ки как уже удобно. обратите внимание, что архивные вакансии при этом у меня вылезли в unicode, и пришлось помучаться, чтобы вытащить необходимое
library(qdapRegex)
options(scipen = 999)
setwd(dirname(rstudioapi::getActiveDocumentContext()$path)); getwd(); gc()
vacancy_id <- 40000000
vacancy <- readLines(paste0(vacancy_id, '.html'), encoding = 'UTF-8') %>% as.data.frame()
title_1 <- vacancy[grep("vacancy-title__archived-from", vacancy$.), ]
title_start <- '<h1 data-qa="vacancy-title" class="bloko-header-1">'
title_end <- '<div class="vacancy-title__archived-from">'
title <- rm_between(title_1, title_start, title_end, extract = TRUE)[[1]]
skill_1 <- vacancy[grep('"keySkills": \\{"keySkill": \\[', vacancy$.), ]
skill_start <- '"keySkill": ["'
skill_end <- ']}, "driverLicenseTypes"'
s_1 <- rm_between(skill_1, skill_start, skill_end, extract = TRUE)[[1]]
s_2 <- stringi::stri_unescape_unicode(s_1)
place_1 <- vacancy[grep('"addressLocality"', vacancy$.), ] %>%
str_replace('"addressLocality":', '') %>% trimws() %>% as.data.frame() %>%
`colnames<-`('addressLocality')
place_2 <- vacancy[grep('"addressRegion"', vacancy$.), ] %>%
str_replace('"addressRegion":', '') %>% trimws() %>% as.data.frame() %>%
`colnames<-`('addressRegion')
place_3 <- vacancy[grep('"addressCountry"', vacancy$.), ] %>%
str_replace('"addressCountry":', '') %>% trimws() %>% as.data.frame() %>%
`colnames<-`('addressCountry')
total <- data.frame(id = vacancy_id, title = title, key_skill = s_2)