[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