Monitorando produtos no ML com Python 3 via BeautifulSoup

Hoje vamos fazer uma coisa relativamente simples, mas bem legal. Vamos criar um BOT que irá se conectar com um anúncio do Mercado Livre e irá dizer pra nós qual é a quantidade disponível desse produto no estoque do vendedor.

[ Hits: 5.592 ]

Por: Pedro Ferrarezi em 10/10/2016


Introdução



Hoje vamos fazer uma coisa relativamente simples, mas bem legal. Vamos criar um BOT que irá se conectar com um anúncio do Mercado Livre e irá dizer pra nós qual é a quantidade disponível desse produto no estoque do vendedor.

Por motivos variados talvez você precise fazer isso um dia, talvez não com o ML, mas com outro site. Vamos fazer algo específico: monitorar apenas a quantidade do produto no ML. Mas o exemplo de código que vamos criar serve para monitorar qualquer informação de qualquer site! Basta você saber um pouco de HTML e criar a lógica certa. Para este exemplo vamos usar Python 3.4.

Um pouco sobre BeautifulSoup extraído e traduzido da documentação oficial:

"Beautiful Soup é uma biblioteca Python para extrair dados de arquivos HTML e XML. Ele funciona com o seu analisador favorito para fornecer maneiras idiomáticas de navegar, pesquisar e modificar a árvore convertida (DOM). Ele comumente salva programadores horas ou dias de trabalho."
Palavras bonitas mesmo não concorda? A seguir vamos ver na prática.

Mão na massa

Considere esse anúncio que estava ativo na data de hoje:
É um G602 (eu tenho hihi).

Ostentações a parte vamos ao que interessa, no navegador Chrome ou Firefox, entre no anúncio e clique com o botão direito em cima do preço e selecione "exibir código fonte".

Aperte ctrl + F e busque pela palavra "Quantidade".

Você vai ver uma coisa +/- ao anexo 1.

Não precisa pensar muito pra ver que o input "productStockQuantity" tem os atributos "min" e "max" setados. E o atributo "max" está com o valor = 2.

Significa que mesmo que você queira comprar mais de 2 unidades, não vai poder. Por quê? Porque só tem 2 no estoque.

Podemos ver também que junto com esse input tem mais 2 outros e os 3 inputs estão dentro de uma tag div, que por sua vez está dentro de um form (id="productInfo").

Mas não é necessário acessar o form pra pegar o input de quantidade do produto, podemos acessar diretamente o input, vajamos o código necessário pra fazer tudo isso:

from bs4 import BeautifulSoup
from urllib.request import urlopen

url = 'http://produto.mercadolivre.com.br/MLB-713818524-mouse-logitech-g602-wireless-2500dpi-11-botoes-gar-3-anos-_JM'
html = urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')
quntidadeMaxima = soup.find(id="productStockQuantity")["max"]
print(quntidadeMaxima) 

Então você verá no terminal o número 2.

Sempre quis dizer isso: mais fácil que isso é difícil! rsrs

Se você nunca desenvolveu em Python, para executar o código abaixo basta abrir um editor de texto colar esse código, ir até o diretório onde está o script e dar o comando:

python3 nomeDoScript.py

Para instalar o BeautifulSoup para Python 3 no Debian 8 e distribuições derivadas (Mint, Ubuntu etc) execute como root:

# apt-get install python3-bs4

Agora vamos entender o que foi feito.

Aqui importamos a biblioteca BeautifulSoup e urlopen para poder se conectar com o site e ler as tags html dele.

from bs4 import BeautifulSoup
from urllib.request import urlopen

Em seguida lemos todo o texto HTML do link abaixo e jogamos dentro de uma variável.

url = 'http://produto.mercadolivre.com.br/MLB-713818524-mouse-logitech-g602-wireless-2500dpi-11-botoes-gar-3-anos-_JM'
html = urlopen(url).read()

Aqui pegamos o texto html e passamos para o BeautifulSoup transformar em um objeto Python que podemos ler facilmente com a sintaxe Python.

soup = BeautifulSoup(html, 'html.parser')

Então pedimos ao BeautifulSoup buscar na tag de quantidade do produto (productStockQuantity) o valor do atributo "max", daí criamos uma variável e jogamos esse conteúdo dentro dela, depois mandamos imprimir o valor na tela.

quntidadeMaxima = soup.find(id="productStockQuantity")["max"]
print(quntidadeMaxima)

Desculpe possivelmente ofender sua inteligência, mas talvez você pense: "ué! Ele fez um script que lê uma quantidade de um produto anunciado? É melhor eu entrar no site e olhar ué...". Na verdade eu demonstrei como ler 1 produto a título de exemplo...

Imagine agora que por um motivo qualquer você têm 1000 anúncios cadastrados em um banco de dados e você precise monitorar esses anúncios a cada meia hora. Não vai dar pra você "entrar no site e olhar".

Mas você pode fazer uma função Python que retorna a quantidade disponível com base em uma url passada como parâmetro. Por Exemplo:

from bs4 import BeautifulSoup
from urllib.request import urlopen

def quantidadeDisponivelML(urlProduto):
    html = urlopen(urlProduto).read()
    soup = BeautifulSoup(html, 'html.parser')
    quntidadeMaxima = soup.find(id="productStockQuantity")["max"]
    return quntidadeMaxima

if __name__ == '__main__': 
    url = 'http://produto.mercadolivre.com.br/MLB-713818524-mouse-logitech-g602-wireless-2500dpi-11-botoes-gar-3-anos-_JM'
    quantidadeDisponivel = quantidadeDisponivelML(url)
    print(quantidadeDisponivel)

E imagine que você poderia chamar essa função de uma outra função que pega cada link e passa para essa retornar a quantidade etc.

Use sua criatividade! Um forte abraço a todos e até a próxima!

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

PDFBox - Aplicativo Java para baixar o DOU completo

Leitura recomendada

Pydev - Preparando o Eclipse para o Python

PEP 8 - Guia de estilo para código Python

RapidScan - Multi-Tool WEB Vulnerability Scanner

Trabalhando com permutações em ordem lexicográfica crescente

Alimentando Desktopcouch com Zeitgeist

  
Comentários
[1] Comentário enviado por fernando-sales em 11/10/2016 - 18:56h

Muito bom
Favoritando...

*---------------------------------------------*/
Blog: www.fernandosales.com.br

[2] Comentário enviado por marciogeraldo08 em 19/10/2016 - 10:17h

Muito interessante. Parabéns e obrigado pelo post.

[3] Comentário enviado por SawyeRv2 em 07/11/2016 - 11:40h

Olá, muito bom o artigo, favorito!

Amigo uma duvida, consigo usar ele em um pagina php, onde são lançadas vagas em um DB, mas não tenho acesso à ele;

A duvida é usar este mesmo modelo de código para monitorar quando estas vagas caem no DB e ficam disponíveis para uso no sistema?
Sabe me dar alguma dica sobre isto?!

Grato.


Contribuir com comentário