segunda-feira, 26 de setembro de 2016

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. 

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 não concorda? Vamos ver na prática então:

Primeiro passo: como e onde olhar para saber a quantidade disponível de um produto no ML. Futuramente isso pode mudar, mas hoje é assim:

Considere esse anúncio que estava ativo na data de hoje: http://produto.mercadolivre.com.br/MLB-713818524-mouse-logitech-g602-wireless-2500dpi-11-botoes-gar-3-anos-_JM
É 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 +/- assim:



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) 

 Você vai ver isso:



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 o código, ir até o diretório onde está o script e dar o comando: "python3 nomeDoScript.py".

Agora vamos entender o que foi feito.

Aqui importamos a biblioteca BeautifulSoup e urlopen para poder se conctar 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. 

Nenhum comentário:

Postar um comentário

Criando uma API em C para usar com CFFI - PostgreSQL

Uma lib bem legal do Postgres é a libpq . Instalação no Debian 7, 8 e 9: sudo apt update && sudo apt install libpq-dev Ela po...