“Nois vamo a São Paulo
Que a coisa tá feia
Por terras alheias
Nós vamos vagar”
Patativa do Assaré, A Triste Partida (1964).
Este é mais um texto em que eu desenvolvo um código, processos bem simples, fácil de fazer em casa e não custa nada (só algumas requisições em uma API). Pois bem, o objetivo deste post é mostrar como fazer a coleta de informações do site da OLX e usá-las para visualizar o viés preço-local, que é aquele que os anunciantes assumem quando publicam um imóvel. Por exemplo, quanto mais elevado for o preço anunciado naquela região, haverá um viés de comportamento para que novos anunciantes mantenham os preços elevados. O que é mais interessante disso é que as regiões vizinhas, por não serem “hypadas” acabam ficando com preços menores e isso faz com que o custo benefício fique semelhante ao das regiões mais caras (custo de oportunidade).
Primeiramente, você deve carregar os pacotes abaixo e “setar a chave” de API da empresa Here, especialista em serviços de geocodificação.
require(tidyverse)
require(rvest)
require(magrittr)
require(hereR)
set_key("COPIA_NÃO_COMÉDIA")
Em seguida partimos para o processo de webscrapping (raspagem da Web). No site da OLX os anúncios são apresentados em caixas. Poderíamos selecionar (usando a opção do navegador “Inspecionar elemento”) os dados dos imóveis individualmente. Porém, ocorre que algumas caixas não dispõe de todas as informações e isso gera um desequilíbrio no número de linhas do data.frame ideal, impossibilitando sua criação.
Dessa forma, é necessário selecionar todo o conteúdo da caixa e aí então extrair as informações desejadas. Neste tutorial vamos extrair: preços, bairro e proposta de negócio para os imóveis em São Luís.
df <- list()
pb <- txtProgressBar(0, 100, style = 3)
for (i in 1:100) {
olx <- read_html(str_c("https://ma.olx.com.br/regiao-de-sao-luis/imoveis?o=", i))
boxes <- olx %>% html_nodes(".gIEtsI") %>% html_text()
prices <- parse_number(
str_remove_all(
str_sub(
boxes,
start = str_locate(boxes, fixed("R$"))[,1]+3,
end = str_locate(boxes, fixed("R$"))[,2]+7
), "[[:punct:]]+"
)
)
address <- str_to_title(
str_sub(
boxes,
start = str_locate(boxes, fixed("São Luís, "))[,1]+10,
end = str_locate(boxes, fixed("Profissional"))[,1]-1
)
)
types <- ifelse(
str_detect(boxes, "Venda|venda") == T,
"Venda",
ifelse(
str_detect(boxes, "Aluguel|aluguel") == T,
"Aluguel",
"Outro")
)
df[[i]] <- tibble(address, prices, types)
setTxtProgressBar(pb, i)
}
tabela <- data.table::rbindlist(df)
Utilizando o comando for criamos uma estrutura de repetição que ataca as 100 páginas disponibilizadas pela OLX retornando um tbl_df com quase 5 mil imóveis.
Agora vamos tratar essas informações, neste exemplo irei calcular a média do preço dos imóveis voltados para a venda, em cada bairro e em seguida vou fazer a geocodificação do bairro, consumindo algumas requisições da API do HERE.
tabela %<>%
filter(types == "Venda",
prices > 0,
str_length(address) < 30) %>%
remove_missing() %>%
group_by(address) %>%
summarise(builds = n(),
price = mean(prices, na.rm = T),
sd_price = sd(prices, na.rm = T))
geoaddress <- geocode(
address = paste(
tabela$address, "São Luís", "Maranhão", "Brasil",
sep = ", ")
)
tabela$id <- 1:75
tabela %<>%
left_join(geoaddress, by = "id")
tabela$lng <- st_coordinates(tabela$geometry)[,1]
tabela$lat <- st_coordinates(tabela$geometry)[,2]
E por fim, faremos a visualização essas informações usando o pacote Leaflet:
require(sf)
require(leaflet)
leaflet(tabela) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
lng = ~lng,
lat = ~lat,
label = ~paste("R$", format(round(price, 2),
big.mark = ".",
decimal.mark = ","),
"-", address.x),
popup = ~paste("R$", format(round(sd_price, 2),
big.mark = ".",
decimal.mark = ",")),
radius = ~sqrt(price/1000)+5,
stroke = F,
fillOpacity = 1,
fillColor = ~colorQuantile("YlOrRd", price)(price)
) %>%
addMeasure(
position = "bottomleft",
primaryLengthUnit = "kilometers",
primaryAreaUnit = "hectares",
activeColor = "dodgerblue4",
completedColor = "dodgerblue"
)
Nota-se que existem duas regiões principais sendo afetadas pelo viés: São Francisco/Renascença/Ponta D’Areia e Conjuntos/Vinhais. As localidades de tamanhos menores e cores mais claras possuem preços mais baixos e nota-se sua presença nos arredores desses centros. Em outras palavras, Jaracaty e Cohama apresentam, nesta extração, um custo benefício mais interessante para quem visa os maiores polos de negócios e empregos: Renascença e Centro.