Raspando Dados de Anúncios do Mercado Livre com Beautiful Soup

Extraindo dados de anúncios da página de tendências do Mercado Livre

Lincoln Menezes
5 min readApr 8, 2020

Primeiro me sinto na obrigação de agradecer ao Mercado Livre pela disponibilidade dos dados. O que demonstra uma infraestrutura poderosa por trás dos códigos, pra suportar uma imensidão de requisições inimaginável pra mim, e sem travar. E nem to falando só do meu crawler, mas de todos os que possam existir e fazem a mesma extração de dados que eu, além do acesso de vendedores, compradores e curiosos.

Beautiful Soup vs Selenium

Quanto ao crawler, confesso que fiquei impressionado com o quanto se pode fazer com poucas linhas de código. Primeiro, minha intenção era usar o Selenium Webdriver pra conseguir esses dados, mas devido a uma experiência anterior e por ainda estar engatinhando no Beautiful Soup, uni o útil ao agradável. Aprendi um pouco mais dessa biblioteca e resolvi o problema de desempenho que estava me incomodando no Selenium. Não sou cientista da computação, mas uma rápida olhada no Gestor de Tarefas do Windows já mostra o quanto um navegador consome de memoria, e o Selenium é completamente dependente de um browser. Beautiful Soup usou em média a décima parte do pico de memória do Selenium, fazendo a extração de dados mais rápido inclusive. Em tarefas parecidas (extração de um conjunto de links e acesso a esses links pra extrair novos dados), o Selenium atingiu picos de 2,5GB de memoria RAM enquanto o Beautiful Soup ficou aí na casa dos 250MB no máximo de consumo.

A que serve?

Bom, não é novidade pra ninguém o tamanho do Mercado Livre. Desde vendas até vendedores, no Brasil, os caras são imbatíveis. E sempre me perguntei como prever os produtos que seriam moda no ML. O que tá sendo vendido, por quanto ta sendo vendido, qual é a média de preço para aquele produto.

Vamos dizer que você seja um vendedor, tem lá sua loja física ou virtual e está interessado em vender pelo ML. Bom, a primeira inclinação que eu teria é buscar na área de tendências da plataforma, descobrir o que está fazendo sucesso por lá. Vai que tenho em estoque. Agora vamos dizer que você já venda no pelo ML e quer se manter inteirado no que é tendência, pra começar a oferecer.

Pra isso que esse script serve.

Num primeiro momento o crawler retira os dados da seção de tendências do ML e salva em um arquivo csv pra posterior analise. Aí, usem a biblioteca que preferirem para fazer essa analise. Eu usei o pandas, mas isso é outra história.

Bora Codar!

O que vamos extrair?

Vamos extrair os dados da página abaixo que mostra as buscas mais populares do Mercado Livre.

tendências Mercado Livre

Primeira coisa importando as bibliotecas que vamos usar:

from bs4 import BeautifulSoup,  import requests,  import csv
from bs4 import BeautifulSoup, import requests, import csv

Depois a gente tem que criar um csv e deixar ele aberto para, conforme os dados forem sendo extraídos, sejam inseridos no arquivo.

csv_writer = csv.writer(csv_file)
csv_writer = csv.writer(csv_file)

Optei por já dizer em qual codificação queria gerar o arquivo (encoding=’utf-8'), mas é opcional.

Um comentário interessante é que o preço é dividido em duas class no ML, então tive que criar duas colunas no csv, uma para o campo dos reais, e a outra para o campo dos centavos.

O próximo passo foi criar duas listas vazias pra fazer um for nelas, e acessar cada link de anúncio extraído em loop.

listas_vazias_append_python
listas vazias

Logo depois criei três funções que fazem o trabalho todo.

A primeira delas acessa a página de tendências do Mercado Livre e copia os links das buscas mais populares.

funcao_request_mercado_livre_tendencias
funcao_request_mercado_livre_tendencias

No fim, pega todos os links de buscas populares na página de tendências e dá um append na lista acessar[ ], uma das listas vazias que foram criadas antes. E vai “printando” o está sendo feito. Sou ansioso, e se não tivesse nada me dizendo em que passo vamos, não conseguiria deixar o processo terminar.

A intenção é deixar essa informação guardada na lista pra gente usar daqui há pouco.

A segunda função acessa os links na lista “acessar” e copia os links de produtos para a lista vazia “produtos”, para que a gente entre em cada um deles e raspe os dados dos anuncio da primeira página. Nossa intenção é saber quais produtos estão na primeira página de cada busca e estudar as características desses anúncios.

funcao_request_mercado_livre_link_produtos
funcao_request_mercado_livre_link_produtos

Mais um print do que está sendo feito pra eu não largar o processo logo nos trinta segundos iniciais.

A terceira função extrai os dados de cada anúncio das paginas conseguidas no quadro de tendências.

funcao_request_mercado_livre_dados_produtos
funcao_request_mercado_livre_dados_produtos

Optei por usar o método try/except pra incluir um valor nulo toda vez que o script esbarrasse em uma exceção. O motivo é simples: extrair a maior quantidade possível por execução do script.

Digamos que o ao ser executado o crawler encontre um erro e feche. Como a quantidade de dado extraído é perdida após um erro, preferi salvar o que conseguisse, e preencher os dados faltantes com um valor nulo. Assim, na última requisição foram extraídos dados de 597 anúncios dos quais 562 foram mantidos, após filtro e tratamento pelo pandas.

De cada anúncio são extraídos os seguintes dados: categorias, titulo, preço, centavos, vendas_estado, descrição.

Essa função também fecha o arquivo csv quando acaba o loop em for pra manter os dados salvos.

O Resultado

Depois de rodar o script, temos o seguinte resultado:

jupyter-crawler
jupyter-crawler

Eu sei. Quase chorei quando vi essa coisa linda. Agora é tratar esse cara e estudar o que podemos encontrar nele.

Acabei de limpar os dados com o Pandas e devo publicar um outro artigo contando mais essa história.

Não vou disponibilizar o código porque, quem quiser aprender, acho bacana copiar e digitando pra conseguir guardar melhor. E é um script tão pequeno que pode ser copiado olhando em uns 10 min.

Fui. Até a próxima.

Linkedin Profile: Lincoln Menezes

--

--