Automatizando a Gestão de Imagens: Como Reduzi um Trabalho de 1 Mês para 2 Semanas com Python
Desafio
Essa semana recebi uma tarefa de um cliente. O desafio consistia em:
- Pegar 2 planilhas de produtos com mais de 10 mil linhas.
- Confirmar as informações entre elas.
- Baixar as imagens que estavam definidas a partir de links na planilha.
- Fazer o download dessas imagens.
- Enviar as imagens para o Strapi.
- Pegar o link da imagem depois de realizar o upload e trocar na planilha.
- Salvar e nomear a imagem com o código (EAN) presente na planilha.
- Trocar o link antigo pelo novo link do arquivo enviado para o Strapi.
Solução
Esse desafio tinha o prazo de 1 mês para ser feito manualmente e linha por linha. Decidi então encontrar formas de automatizar o processo por meio de desenvolvimento. Com isso, construí uma aplicação em Python que faz tudo isso de forma 100% automática.
Resultados
Com essa aplicação, conseguimos:
- Otimizar o tempo de processamento.
- Validar as informações com precisão.
- Reduzir o prazo de entrega de 1 mês para praticamente 2 semanas.
Tecnologias Utilizadas
- Python: Para o desenvolvimento da aplicação.
- Pandas: Para manipulação das planilhas Excel.
- Requests: Para download das imagens e upload para o Strapi.
- TQDM: Para exibir uma barra de progresso.
- Strapi: Para armazenar e gerenciar as imagens.
import os
import pandas as pd
import requests
from tqdm import tqdm
TOKEN = "seu_token_de_autorizacao_aqui"
def download_image(url, filename):
response = requests.get(url, stream=True)
if response.status_code == 200 and 'Content-Length' in response.headers:
total_size = int(response.headers['Content-Length'])
with open(filename, 'wb') as f:
with tqdm(total=total_size, unit='B', unit_scale=True, desc=f"Downloading {filename}") as pbar:
for chunk in response.iter_content(chunk_size=1024):
f.write(chunk)
pbar.update(len(chunk))
return True
return False
def upload_image_to_strapi(image_path, ean):
url = 'https://seu_servidor_strapi/upload'
headers = {"Authorization": f"Bearer {TOKEN}"}
payload = {'fileInfo': f'{{"name": "{ean}.png", "folder": "1"}}'}
files = {'files': (f"{ean}.png", open(image_path, 'rb'), 'image/jpeg')}
response = requests.post(url, headers=headers, data=payload, files=files)
if response.status_code == 200:
json_response = response.json()
return json_response[0]['url'] if json_response else None
return None
def process_excel(file_path):
df_produtos = pd.read_excel('produtos.xlsx')
df_wix = pd.read_excel(file_path)
downloads_dir = os.path.join(os.path.dirname(file_path), 'downloads')
if not os.path.exists(downloads_dir):
os.makedirs(downloads_dir)
for index, row in tqdm(df_produtos.iterrows(), total=len(df_produtos), desc="Processing rows"):
ean = int(row['ean'])
image_url = row['link_imagem']
if pd.notnull(image_url):
image_filename = os.path.join(downloads_dir, f"{ean}.png")
if download_image(image_url, image_filename):
strapi_link = upload_image_to_strapi(image_filename, ean)
if strapi_link:
df_produtos.at[index, 'link_imagem2'] = strapi_link
df_produtos.to_excel('produtos.xlsx', index=False)
for index, row in tqdm(df_wix.iterrows(), total=len(df_wix), desc="Updating Wix sheet"):
ean = int(row['ean'])
product_image_url_series = df_produtos.loc[df_produtos['ean'] == ean, 'link_imagem2']
if not product_image_url_series.empty:
df_wix.at[index, 'link_imagem2'] = product_image_url_series.iloc[0]
df_wix.to_excel(file_path, index=False)
if __name__ == "__main__":
process_excel('PlanilhaWix.xlsx')