[R-br] Problema com dataframe em tutorial de web scraping

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[R-br] Problema com dataframe em tutorial de web scraping

R-br mailing list
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

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


_______________________________________________
R-br mailing list
[hidden email]
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.