My access was blocked while I was doing, but my code ended up being below. There are some explanations of how each part works. I only used contemporary Hadley Wickham packages, including the rvest
that you wanted to use.
Unfortunately the scraper is not so useful because of captcha and locks. The site allows to make budgets here. The code below can be used for other scrapers. I recommend that you do a nicer handling of errors, for example using dplyr::failwith
or tryCatch
.
library(rvest)
library(httr)
library(tidyr)
library(dplyr)
library(stringr)
#' Tem captcha?
#'
#' Verifica se uma resposta tem captcha
#'
#' @param r resultado de uma request (pacote \code{\link{httr}}).
#'
#' @return \code{TRUE} se tiver captcha e \code{FALSE} caso contrário.
tem_captcha <- function(r) {
res <- r %>%
content('text') %>%
read_html() %>%
html_nodes(xpath = '//form[@action="/verificarCaptcha/confirmar"]') %>%
length()
res > 0
}
bloqueado <- function(r) {
r %>%
content('text') %>%
str_detect('Acesso bloqueado')
}
#' Baixar categorias
#'
#' Baixa as categorias a partir do link inicial
#' ex.: http://empresasdobrasil.com/empresas/alta-floresta-mt/
#'
#' @param link URL do município.
#'
#' @return \code{data.frame}
baixar_categorias <- function(link) {
r <- GET(link)
if (r$status_code != 200) return(data.frame(result = 'erro'))
if (tem_captcha(r)) return(data.frame(result = 'captcha'))
if (bloqueado(r)) return(data.frame(result = 'bloqueado'))
u_base <- 'http://empresasdobrasil.com'
r %>%
content('text') %>%
read_html() %>%
html_nodes('.container a.linhas') %>% {
data.frame(tipo = html_text(.),
link_categoria = paste0(u_base, html_attr(., 'href')),
stringsAsFactors = FALSE)
} %>%
mutate(result = 'OK')
}
#' Baixar empresas
#'
#' Baixa as empresas a partir do link de uma categoria
#' ex.: http://empresasdobrasil.com/empresas/alta-floresta-mt/hoteis
#'
#' @param link URL da categoria
#'
#' @return \code{data.frame}
baixar_empresas <- function(link) {
r <- GET(link, write_disk('arq.html', overwrite = TRUE))
if (r$status_code != 200) return(data.frame(result = 'erro'))
if (tem_captcha(r)) return(data.frame(result = 'captcha'))
if (bloqueado(r)) return(data.frame(result = 'bloqueado'))
u_base <- 'http://empresasdobrasil.com'
r %>%
content('text') %>%
read_html() %>%
html_node('table') %>% {
tab <- html_table(.) %>%
setNames('nome_razao') %>%
separate(nome_razao, c('nome_fantasia', 'razao_social'),
sep = ' - ', extra = 'merge', fill = 'left')
links <- html_nodes(., 'a') %>%
html_attr('href')
tab$link_empresa <- paste0(u_base, links)
tab
} %>%
mutate(result = 'OK')
}
#' Baixar infos de uma empresa
#'
#' Baixa as empresas a partir do link de uma categoria
#' ex.: http://empresasdobrasil.com/empresas/alta-floresta-mt/hoteis
#'
#' @param link URL da categoria
#'
#' @return \code{data.frame}
baixar_empresa <- function(link) {
r <- GET(link)
if (r$status_code != 200) return(data.frame(result = 'erro'))
if (tem_captcha(r)) return(data.frame(result = 'captcha'))
if (bloqueado(r)) return(data.frame(result = 'bloqueado'))
r %>%
content('text') %>%
read_html() %>% {
data.frame(titulo = html_text(html_nodes(., 'h4')),
texto = html_text(html_nodes(., 'h5')),
stringsAsFactors = FALSE)
} %>%
mutate(result = 'OK')
}
baixar_tudo <- function(link) {
link <- 'http://empresasdobrasil.com/empresas/alta-floresta-mt/'
d <- link %>%
baixar_categorias() %>%
group_by(tipo, link_categoria) %>%
do(baixar_empresas(.$link_categoria)) %>%
ungroup() %>%
group_by(tipo, link_categoria, nome_fantasia,
razao_social, link_empresa) %>%
do(baixar_empresa(.$link_empresa))
d
}
Partner, vc has to create a function to scrape the links from the first layer (categories) and for each item in the category do the same for the link companies. I recommend using Rselenium because navigation can be allied to link lists. Loop scrape for each list address. Abs,
– Pedro Brom
I was making a script to answer your question, but I ran into it: Screenshot. The site does not allow mass access, and any attempt will cause you to fall into the captcha. Unless you know (or discover) a way to resolve it, the way is to buy the services they offer.
– Molx
Ah, and if you insist, as I was doing here, you’ll get here: http://empresasdobrasil.com/acessoBloqueado. Then it won’t even solve.
– Molx