Futurecom 2010 - Web Semântica - Pessoas e máquinas pensando juntas!
Análise das Ofertas de Veículos do OLX Brasil
1. UMA ANÁLISE DAS OFERTAS ON-
LINE DE VEÍCULOS DOS USUÁRIOS
DO OLX BRASIL
AFONSO VALAU DE LIMA JUNIOR; DIEGO MAGALHÃES MENEZES;
DOUGLAS ZANATTA ULIAN; SANDRIELEM DA SILVA RODRIGUES
2. Contexto
Ao longo da última década, inovadores modelos de negócios têm surgido, trazendo mudanças
fundamentais aos tradicionais modelos econômicos. Empresas como a OLX, Airbnb, eBay, entre
outras, têm utilizado plataformas on-line para conectar oferta e demanda, promovendo a
interação de consumidores que formam ambos os lados do mercado. Estas iniciativas
apresentam rápido crescimento e estão sendo classificadas como parte de uma “economia
colaborativa” (OWYANG, TRAN e SILVA, 2013; TANZ, 2014).
3. Panorama Geral da Pesquisa
• Esta pesquisa centra-se em utilizar os dados do OLX (abreviatura de “Online Exchange" –
“troca online”), presente em mais de 100 países e em mais de 50 línguas. Em função dos
recursos disponíveis para a pesquisa optou-se por extrair os dados de usuários brasileiros
(http://www.olx.com.br/) que anunciaram na categoria “veículos e barcos”, subcategoria
“carros”.
• Para a coleta de dados utilizou-se o web scraping (extração de dados na web). O web
scraping é uma técnica de software que visa a extração de informações, simulando a
exploração humana da World Wide Web. Concentra-se em transformar dados não
estruturados presentes na web (no formato de HTML) em dados estruturados que podem ser
armazenados e analisados em um banco de dados ou planilha eletrônica.
• As análises dos dados coletados centrou-se em identificar diferenças de preço dos mesmos
produtos em diferentes regiões do Brasil, bem como, apresentar uma estatística descritivas
dos anúncios coletados.
4. OLX BRASIL
• O OLX Brasil é um site de classificados, onde os usuários podem vender e comprar itens usados,
como vestuário, carros, equipamentos eletrônicos, móveis e imóveis.
• De um lado do mercado estão os vendedores, esses podem postar anúncios de produtos ou
serviços que eles desejam comercializar, sendo cada anúncio, classificado em sua respectiva
categoria e subcategorias.
• Do outro lado do mercado, estão os compradores, que podem responder aos anúncios postados,
entrando em contato com o vendedor para fazer uma pergunta, uma oferta de um novo preço, ou
mesmo combinar a compra. Desta forma, o OLX atua facilitando a conexão desses dois lados do
mercado (oferta e demanda), não havendo qualquer transação monetária, esta, por sua vez, é
combinada entre os usuários.
• Atualmente a maioria das funcionalidades oferecidas pelo OLX são gratuitas, como criar conta e
anunciar um produto. No entanto, há opções para um anúncio pago e também para destacar um
anúncio, caso o usuário deseje fazê-lo. Desta forma, o principal objetivo do OLX é aumentar o
número de listagens lançadas, afim de tornar-se uma plataforma valiosa para a oferta e compra de
produtos.
5. COLETA DE DADOS
• Estrutura do OLX
• Estratégia Inicial de coleta
• Ferramentas utilizadas
• Características do código de coleta
• Problemas encontrados e seus contornos
• Resultados obtidos
• Soluções não exploradas
6. COLETA DE DADOS
Estrutura do OLX
• Dados estruturados
• Duas estruturas de classificação
• Categórica
• Geográfica
• Combinação de categorias é
utilizada para filtro dos anúncios
7. COLETA DE DADOS
Estrutura do OLX
• Anúncios ordenados por recência
• Divididos em páginas de índice
• Lista de páginas de índice
• Página de detalhes do anúncio
8. COLETA DE DADOS
Estrutura do OLX
• Geração automática de páginas
• CSS bem formatado facilita coleta
• Diferentes categorias e subcategorias,
estrutura genérica
• Qualidade e organização do gerador
da aplicação que gera as páginas
9. COLETA DE DADOS
Estratégia inicial de coleta
• Imitação do comportamento humano
1. Configurar a URL da página de índice da subcategoria versus região
2. Configurar a quantidade de páginas de índice a serem lidas
3. Criar estrutura da base de dados onde os anúncios serão armazenados
4. Iterar pelas páginas de índice, da primeira até a última
5. Acessar e extrair os anúncios de cada página de índice
6. Iterar pelos anúncios da página de índice
7. Acessar e extrair dados dos detalhes de cada anúncio
8. Transformar os dados para padronização
9. Armazenar dados no banco de dados
10. COLETA DE DADOS
Ferramentas utilizadas
Computador
• Notebook DELL Vostro 3450
• Processador Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz 2.80 GHz
• Memória RAM de 6,00 GB
• Disco Rígido de 750 GB
• Sistema Operacional Windows 7 Professional 64 Bits OEM com Service
Pack 1
• Adaptador de rede Dell Wireless 1702 802.11b/g/n
• Protocolo de conexão sem fio 802.11/n
• Acess Point/Router/Acess Point HUMAX Cable RG modelo HG100R-L2
• Link de internet ADSL de 30 Mbps da operadora NET
R
• Ambiente de software para computação estatística e gráfica.
• Versão 3.3.1 para processadores de 64 bits.
• Utilizado para execução dos scripts de coleta e análise dos dados.
R Studio
• Ambiente de desenvolvimento integrado (IDE) para o R.
• Versão 0.99.893 para processadores de 64 bits.
• Utilizado no desenvolvimento e na execução dos scripts.
SQLite
• Sistema Gerenciador de Banco de Dados Standalone.
• Versão 3.14.1 2016-08-11 18:53:32
• Utilizado no armazenamento dos dados.
DBeaver
• Sistema de Administração de Bancos de Dados
• Versão 3.7.8
• Utilizado na consulta aos dados coletados.
11. COLETA DE DADOS
Bibliotecas utilizadas
RVest
• Biblioteca de funções para download e para manipulação de
conteúdo XML e HTML.
• Versão 0.3.2
• Utilizada para busca e coleta dos dados das páginas acessadas.
RSQLite
• Biblioteca de funções para manipulação de bases de dados do SQLite.
• Versão 1.0.0
• Utilizada para criação da base de dados, leitura e carga dos dados.
lubridate
• Biblioteca de funções para manipulação de datas.
• Versão 1.6.0
• Utilizada para padronização de formatos de datas.
stringr
• Biblioteca de funções para manipulação variáveis literais.
• Versão 1.1.0
• Utilizada para troca de codificação dos textos.
bigmemory
• Biblioteca de funções para manipulação de grandes estruturas de
dados.
• Versão 4.5.19
• Utilizada para o acesso compartilhado à memória RAM por processos
rodando em núcleos diferentes.
foreach
• Biblioteca de funções para computação paralela.
• Versão 1.4.30
• Utilizada para divisão da carga de trabalho entre os núcleos do
processador do computador.
doSNOW
• Biblioteca de funções para computação paralela.
• Versão 1.0.14
• Utilizada em combinação com foreach para criação de cluster do tipo
SOCK no sistema operacional Windows.
12. COLETA DE DADOS
Características do código de coleta
• Isolamento de funcionalidades em
funções
• 997 linhas de código
• 21 funções
• Função principal contendo 78 linhas
• Menor função contendo 4 linhas
• Maior função contendo 201 linhas
• Não utilização de variáveis globais
13. COLETA DE DADOS
Problemas encontrados e seus contornos
Telefone armazenado como imagem
• Problema
Diferente da maioria dos dados armazenados no código HTML, o
telefone do anunciante é apresentado em uma imagem do tipo "TIF"
com fundo transparente.
• Contorno
Download da imagem, transformação do padrão "TIF" de fundo
transparente para o padrão "JPEG" com fundo branco utilizando o
ImageMagik, leitura dos dados através de um software de
reconhecimento óptico de caracteres (OCR) tesseract.
Desempenho
• Problema
O tempo médio de coleta de um anúncio, na estratégia inicial, foi de 3
segundos aproximadamente levando o tempo total de coleta de 1
milhão de anúncios para 34,72 dias aproximadamente.
• Contorno
Utilizar processamento paralelo para dividir a carga de trabalho entre
os núcleos do processador do computador de coleta.
O tempo médio de coleta de um anúncio passou para 1,09 segundos
aproximadamente levando o tempo total de coleta para 12,62 dias
aproximadamente.
Caracteres inválidos
• Problema
O texto imputado em alguns anúncios contém caracteres cuja
codificação difere do padrão de codificação da página do OLX.
Embora os navegadores resolvam esta "mistura" de codificações, a
biblioteca RVest não o faz.
• Contorno
Tratamento de excessões no código de download da página para
tentativa com os principais padrões de codificação.
Falha na função de substituição de caracteres do R
• Problema
A função "gsub" do R, que substitui cadeias padrão de caracteres em
uma variável literal por outra cadeia de caracteres, gera caracteres
inválidos quando o padrão de codificação quando a cadeia de
caracteres a ser substituída possui codificação indefinida.
• Contorno
Identificação de caracteres com codificação desconhecida e aplicação
de codificação padrão.
14. COLETA DE DADOS
Problemas encontrados e seus contornos
Duplicação de anúncios
• Problema
Ao mesmo tempo que o script percorre as páginas de índice e acessa os
anúncios, usuários vendedores inserem novos anúncios.
Como os anúncios são ordenados conforme sua rescência, alguns
anúncios acabam trocando de página, passando para páginas mais
antigas conforme os novos anúncios são inseridos.
Com isso os últimos anúncios de uma página de índice tornam-se os
primeiros da página seguinte e o script acaba por ler o mesmo anúncio
mais de uma vez, perdendo eficiência.
O uso de computação paralela amplifica o problema.
• Contorno
Utilizar uma lista compartilhada entre os múltiplos processos de coleta
para armazenar anúncios já lidos.
Para o acesso compartilhado a lista foi utilizada uma biblioteca de
manipulação de grandes estruturas de dados.
Esta biblioteca utiliza ponteiros para o acesso a memória ROM que
apontam sempre para o mesmo endereço, mesmo quando acessados
por diferentes processos.
A solução não resolveu o problema e não houve tempo suficiente para
investigar a causa.
A principal hipótese é o uso incorreto da biblioteca de acesso
compartilhado à memória.
Repetição da última página
• Problema
A quantidade de páginas de índice varia conforme novos anúncios são
inseridos ou removidos por usuários vendedores.
Quando o script tenta acessar uma página de índice que não existe
mais, a última página de índice é retornada.
O script, não sabendo que trata-se da mesma página, continua
baixando os anúncios e passando à próxima página.
Enquanto o índice da suposta última página não é acessado, os
anúncios da última página real são replicados na base de dados.
O uso de computação paralela amplifica o problema.
• Contorno
Utilização da memória compartilhada para anotar o índice da página de
índice acessada e verificar se a página já não foi lida.
15. COLETA DE DADOS
Problemas encontrados e seus contornos
Desempenho paralelo
• Problema
Por padrão, conforme os acessos HTTP crescem, as conexões HTTP são
recriadas. Ao recriar a conexão, o processo de renegociação da conexão
com o servidor gasta tempo extra, aumentando o tempo médio de
coleta dos anúncios para 1,62 segundos aproximadamente.
Neste cenário, a coleta de todos os anúncios levaria 18,76.
• Contorno proposto
Medir o tempo de execução de cada parte do código para identificar o
trecho de baixo desempenho.
Identificar o problema com a recriação de conexões HTTP.
Utilizar a biblioteca RCurl para realizar requisições HTTP múltiplas e
reutilização de conexões.
Não foi possível concluir a implementação da coleta com a nova
biblioteca. Os testes com 200 acessos múltiplos fizeram com que o
provedor banisse a conexão ADSL. Foi necessário contato por telefone
com a equipe técnica para reestabelecimento da conexão.
Testes com 50 acessos múltiplos tiveram sucesso.
Queda do link de internet/falta de luz
• Problema
Após 8 dias de execução, a conexão de ADSL de internet com o
provedor foi perdida.
Dois dias após a nova execução, um temporal derrubou uma árvore
sobre o transformador de energia que alimentava o computador e o
link de internet, desligando o computador e a conexão com a internet.
• Contorno
Em ambos os casos, o script foi reconfigurado para retomar a coleta a
partir da página de índice do último anúncio lido.
No hiato entre uma execução e outra, registros podem ter sido
alterados, incluídos ou excluídos, prejudicando a qualidade da coleta e
a representatividade da amostra.
16. COLETA DE DADOS
Resultados obtidos
Tempos de coleta
No total foram executadas 3 coletas:
• Do dia 7/11/2016 às 02:16 até o dia 7/11/2016 às 19:09 totalizando 16 horas e 53 minutos
• Do dia 7/11/2016 às 20:05 até o dia 15/11/2016 às 23:24 totalizando 195 horas e 19 minutos
• Do dia 15/11/2015 às 23:47 até o dia 17/11/2016 às 08:09 totalizando 32 horas e 22 minutos
• O tempo total de coleta foi de 10 dias 4 horas de 34 minutos.
Volumes
Foram coletados 419.753 anúncios dos quais 184.119 estavam repetidos.
O total de anúncios únicos foi de 235.634.
Forma de armazenamento
Os dados foram armazenados em uma tabela de uma base de dados do SQLite.
Após a coleta, uma nova tabela com registros únicos (não duplicados) foi gerada na mesma base de
dados.
17. COLETA DE DADOS
Soluções não exploradas
Dividir páginas de índice e detalhes
O problema da inclusão de novos anúncios
durante a coleta tornou-se o principal ofensor da
eficiência do script de coleta.
Uma alternativa de contorno é a divisão do
processo de coleta em duas etapas.
1. Acessar todas as páginas de índice,
coletando o endereço de todos os
anúncios antes de iniciar a coleta dos
dados dos anúncios.
2. Remover duplicatas antes da coleta dos
detalhes e então acessar cada anúncio
único.
Sincronização entre dispositivos
O problema da concorrência entre diferentes
processos executando em diferentes núcleos do
mesmo processador potencializou os problemas
de duplicidade de anúncios.
A correta utilização da memória
compartilhada poderia evitar o problema, e
abriria espaço para criação de grupos de trabalho
distintos entre os processos.
O primeiro grupo leria índices, segundo leria os
anúncios carregados pelos índices.
Esta solução diminuiria o tempo entre a
leitura do índice e a leitura do anúncio, reduzindo
as chances de não captura de alterações.
18. COLETA DE DADOS
Soluções não exploradas
Download e processamento posterior
O tempo gasto na pesquisa, coleta e
transformação dos dados após o download da
página HTML aumentam a chance de novos
anúncios terem sido inseridos ou removidos,
alterando a ordem dos anúncios nas páginas de
índice.
Uma alternativa para contornar o problema
é o armazenamento do conteúdo HTML das
páginas em uma base de dados de transição para
posterior processamento.
Download via requisições múltiplas
O tempo de requisição das páginas HTTP é o
principal ofensor do desempenho de coleta.
Bibliotecas escritas em C para requisição de
conteúdo via protocolo HTTP são capazes de
disparar requisições múltiplas, síncronas e
assíncronas, e reaproveitar a conexão
estabelecida com um mesmo servidor.
O uso de requisições múltiplas e
reaproveitamento de conexões pode reduzir
consideravelmente o problema do tempo de
requisição.
21. Granularidade dos dados Heatmap – registros por estado
Gráficos interativos disponíveis em: https://public.tableau.com/views/WebscrapingOLX/Histria1?:embed=y&:display_count=yes
22. Heatmap - Mediana dos preços de carros por estado
Gráficos interativos disponíveis em: https://public.tableau.com/views/WebscrapingOLX/Histria1?:embed=y&:display_count=yes
24. Amplitude da Amostra
Devido a uma quantidade considerável de observações que possuíam preços indicando erro de imputação do
usuário no momento do preenchimento do anúncio, assumimos arbitrariamente que esses anunciantes ou não
tinham a intenção de preencher o campo preço ou preencheram de forma incorreta, impossibilitando a análise.
Portanto, em um primeiro momento optamos por excluir 14.866 anúncios da amostra com preço (campo
actual_price) abaixo de R$500,00 e superiores a R$3.300.00,00. Esses valores foram selecionamos de acordo com
dois modelos de carro que representam o limite inferior e superior da amostra.
Id Title Actual Price
266753566 Renault Sandero privilege 2012 automatico - 2012 -1
266097646 S 10 LT 12/13 4×4 manual.extra - 2013 79990000
264825710 Vendo - 2000 96844558
265372860 Carro - 2007 99999999
Exemplo de preenchimento incorreto
25. Limite Superior Limite Inferior
Id Title Actual Price Description
Limite Inferior 265476614 Vw - Volkswagen Brasilia R$ 500,00 Brasília sem motor, o motor travou e tirei fora so
encaixar outro e andar
Limite Superior 266253025 Lamborghini Aventador 2016 Top - 2016 R$ 3.300.000,00 vendo Lamborghini Aventador 2016 em ótimo
estado
27. Região Estado Frequência
%
(Estado/região)
%
(Região/Brasil)
Centro-oeste
Distrito Federal - DF 9.343 46,20%
9,68%
Goiás - GO 6.854 33,89%
Mato Grosso - MT 1.650 8,16%
Mato Grosso do Sul - MS 2.375 11,74%
Total Região 20.222 100,00%
Nordeste
Alagoas - AL 1.296 4,72%
13,15%
Bahia - BA 7.198 26,21%
Ceará - CE 4.749 17,29%
Maranhão - MA 1.356 4,94%
Paraíba - PB 2.341 8,52%
Pernambuco - PE 5.575 20,30%
Piauí - PI 971 3,54%
Rio Grande do Norte - RN 2.204 8,03%
Sergipe - SE 1.773 6,46%
Total Região 27.463 100,00%
Norte
Acre - AC 599 6,47%
4,43%
Amapá - AP 309 3,34%
Amazonas - AM 2.998 32,38%
Pará - PA 2.849 30,77%
Rondônia - RO 1.147 12,39%
Roraima - RR 629 6,79%
Tocantins - TO 729 7,87%
Total Região (Norte) 9.260 100,00%
Sudeste
Espírito Santo - ES 5.644 5,10%
53,03%
Minas Gerais - MG 20.089 18,14%
Rio de Janeiro - RJ 23.089 20,85%
São Paulo - SP 61.918 55,91%
Total Região (Sudeste) 110.740 100,00%
Sul
Paraná - PR 19.406 47,16%
19,70%
Rio Grande do Sul - RS 11.962 29,07%
Santa Catarina - SC 9.780 23,77%
Total Região Sul) 41.148 100,00%
Total 208.833 100,00%
A Base permitiu inferências que
podem partir de uma análise
inicialmente ampla por região e
estado.
28. Região Frequência %
Baixada Santista e Litoral Sul 2.129 3,44%
Bauru, Marília e região 2.736 4,42%
Grande Campinas 8.021 12,95%
Presidente Prudente e região 2.299 3,71%
Ribeirão Preto e região 4.342 7,01%
S. José do Rio Preto e região 2.969 4,80%
São Paulo e região 31.011 50,08%
Sorocaba e região 3.341 5,40%
V. do Paraíba e Litoral Norte 5.070 8,19%
Total 61.918 100,00%
Cidade Frequência %
São Paulo 16.472 26,60%
Campinas 2.845 4,59%
São José Dos Campos 2.577 4,16%
Sorocaba 2.104 3,40%
Santo André 1.980 3,20%
Ribeirão Preto 1.945 3,14%
São Bernardo do Campo 1.886 3,05%
Guarulhos 1.751 2,83%
São José do Rio Preto 1.488 2,40%
Osasco 1.132 1,83%
Outras 27.738 44,80%
Total 61.918 100,00%
Estado de São Paulo
Chegando à análises mais micro, por região dentro
de um estadoe por cidadedentrodessaregião.
29. Horários de Postagens
REGIÃO NORDESTE REGIÃO NORTE
0,00%
10,00%
20,00%
30,00%
40,00%
50,00%
60,00%
70,00%
80,00%
90,00%
100,00%
% % % % % % % % %
AL BA CE MA PB PE PI RN SE
18:00 - 23:59
12:00 - 17:59
06:00 - 11:59
00:00 - 05:59
0,00%
10,00%
20,00%
30,00%
40,00%
50,00%
60,00%
70,00%
80,00%
90,00%
100,00%
% % % % % % %
AC AM AP PA RO RR TO
18:00 - 23:59
12:00 - 17:59
06:00 - 11:59
00:00 - 05:59