[R-br] Problema com dataframe em tutorial de web scraping
Helder Gramacho
agrohelder em gmail.com
Seg Nov 5 23:53:18 -02 2018
Boa noite pessoal,
Estou tentando reproduzir um tutorial de web scraping no r que está
disponível na seguinte página:
https://sillasgonzaga.github.io/2016-11-18-olx1/
Em determinada etapa aparece o seguinte erro:
Error in `[[<-.data.frame`(`*tmp*`, "adicional", value = character(0)) :
replacement has 0 rows, data has 50 In addition: Warning message:
In function_list[[k]](value) : NAs introduced by coercion
Timing stopped at: 3 0.75 4.94
Ao que parece existe um problema com o número de linhas do dataframe quando
as informações são extraídas, mas não consigo detectar qual o problema,
alguém poderia me ajudar?
O código que estou executando é o que segue abaixo:
# Pacotes para instalar no R:
if(!require(c('magrittr','rvest','readr','stringr','curl','tidyr','dplyr')))
{install.packages(c('magrittr','rvest','readr','stringr','curl','tidyr','dplyr')
,type='binary',dep=T)}
library("magrittr") # não vivo sem esse pacote
library("rvest") # principal pacote para web-scraping
library("readr") # usado para extrair numeros de texto
library("stringr") # usado para o data cleaning
library('curl') # usado como suporte para o rvest
library("tidyr") # data cleaning
library("dplyr") # data cleaning
url_apt <- "
http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/aluguel/apartamentos"
number_pages <- 245 #hard coded
# Criar vetor com todos os urls para as páginas do olx
lista_urls <- paste0(url_apt, "?o=", 1:number_pages)
limparString <- function(x) {
# x = string coletado do olx
x %<>% str_replace_all("[\t]", "")
x %<>% str_replace_all("[\n]", "")
x %<>% str_replace_all("Apartamentos", "")
x %<>% str_replace_all("Anúncio Profissional", "")
x %<>% str_replace("-", "")
x %<>% str_replace_all("[R$]", "")
x %<>% str_replace_all("[.]", "")
x %<>% str_trim()
return(x)
}
extrairAnuncios <- function(url_pagina, info_adicional) {
### INPUTS:
# url_pagina: url de uma pagina do olx com uma lista de links de anúncios.
# info_adicional: variavel booleana. se verdadeiro, faz o scraping de
dados adicionais do anuncio
# ... deve ser usado apenas para apartamentos, pois a sintaxe do html
para quartos é diferente
mycurl <- curl(url_pagina, handle = curl::new_handle("useragent" =
"Mozilla/5.0"))
mycurl <- read_html(mycurl)
x <- mycurl %>% html_nodes(".OLXad-list-link")
# extrair link do anuncio
col_links <- mycurl %>% html_nodes(".OLXad-list-link") %>%
html_attr("href")
# extrair titulo do anuncio
col_titles <- mycurl %>% html_nodes(".OLXad-list-link") %>%
html_attr("title")
# extrair preço
precos <- lapply(x, . %>% html_nodes(".col-3"))
precos %<>% lapply(html_text)
precos %<>% unlist()
precos %<>% limparString()
precos %<>% as.numeric()
col_precos <- precos
# extrair bairros
bairros <- mycurl %>% html_nodes(".OLXad-list-line-2") %>% html_text()
bairros %<>% str_replace_all("[\t]", "")
bairros %<>% str_replace_all("[\n]", "")
bairros %<>% str_replace_all("Apartamentos", "")
bairros %<>% str_replace_all("Aluguel de quartos", "")
bairros %<>% str_replace_all("Anúncio Profissional", "")
bairros %<>% str_replace("-", "")
bairros %<>% str_trim()
col_bairros <- bairros
# extrair informações adicionais de apartamento
if (info_adicional) {
adicional <- mycurl %>% html_nodes(".mt5px") %>% html_text()
adicional %<>% str_replace_all("[\t]", "")
adicional %<>% str_replace_all("[\n]", "")
col_adicionais <- adicional
}
return(data.frame(link = col_links,
titulo = col_titles,
preco = col_precos,
bairro = col_bairros,
adicional = col_adicionais,
stringsAsFactors = FALSE))
}
url_teste <- lista_urls[1]
system.time(df <- extrairAnuncios(url_teste, info_adicional = TRUE))
Agradeço a ajuda,
*Hélder Santos*
*Eng. Agr. Salvador-BA*
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20181105/0bbd645b/attachment.html>
Mais detalhes sobre a lista de discussão R-br