Python · Amazon
Monitore preços da Amazon com Python
Os preços na Amazon mudam o tempo todo, e ninguém quer abrir a mesma página de produto toda manhã. Neste guia, você cria um pequeno script que faz isso por você: ele consulta o preço atual dos produtos que interessam, registra cada verificação em um arquivo fácil de abrir em planilhas e avisa quando um preço cai abaixo do valor que você está disposto a pagar.
Você não precisa lidar com a página da Amazon em si. A everydata.io carrega a página de produto ao vivo para você e devolve dados limpos – título, preço, moeda, disponibilidade –, então o script continua curto e não quebra quando a Amazon muda o layout.
Atualizado em · por everydata.io
O que você terá no final
- Um script que verifica uma lista de produtos da Amazon e adiciona cada preço ao prices.csv.
- Um aviso quando um preço cai ou atinge o seu alvo.
- Um agendamento diário, para que ele rode sem você.
O que você precisa
- Python 3.10 ou mais recente e o pacote
requests(pip install requests). - Uma chave de API gratuita da everydata.io – crie uma aqui.
- O ASIN de cada produto: o código de 10 caracteres depois de
/dp/no endereço da Amazon.
01Mantenha sua chave de API fora do código
Entre na sua conta, copie a chave no painel e coloque-a em uma variável de ambiente. O script a lê de lá, então a chave nunca acaba em um arquivo que você possa compartilhar.
export EVERYDATA_API_KEY="ds_your_key"02Consulte um produto
Comece com uma única requisição para ver o que volta. O endpoint de produto por ASIN recebe o ASIN e o marketplace (com para amazon.com, de para amazon.de e assim por diante).
import os
import requests
API = "https://api.everydata.io"
KEY = os.environ["EVERYDATA_API_KEY"]
resp = requests.get(
f"{API}/amz/amazon-lookup-product-by-asin",
params={"asin": "B07ZPKN6YR", "domainCode": "com"},
headers={"x-api-key": KEY},
timeout=60,
)
resp.raise_for_status()
product = resp.json()
print(product["productTitle"])
print(product["price"], product["currency"], "-", product["warehouseAvailability"])A resposta é JSON. Toda resposta começa com responseStatus e responseMessage, seguidos do produto. Esta é uma versão resumida do exemplo documentado:
{
"responseStatus": "PRODUCT_FOUND_RESPONSE",
"responseMessage": "Product successfully found!",
"productTitle": "Apple iPhone 11, 64GB, Black - Unlocked (Renewed)",
"productRating": "4.2 out of 5 stars",
"countReview": 60024,
"asin": "B07ZPKN6YR",
"warehouseAvailability": "This item cannot be shipped to your selected delivery location. Please choose a different delivery location.",
"retailPrice": 0,
"price": 0,
"currency": "USD"
}Repare em price neste exemplo: ele é 0. Isso acontece quando a página não mostra nenhum preço de compra – aqui, porque o item não podia ser enviado para o local de entrega. Seu script deve tratar 0 como “sem preço no momento”, e não como um produto grátis.
03Verifique uma lista de produtos e salve cada resultado
Agora transforme a requisição única em um pequeno monitor. WATCHLIST guarda os produtos e o preço que você está esperando. Cada execução consulta cada produto uma vez, adiciona uma linha a prices.csv e compara o novo preço com o último que foi salvo.
"""Check the price of a few Amazon products and append each check to prices.csv."""
import csv
import os
import re
import time
from datetime import datetime, timezone
from pathlib import Path
import requests
API = "https://api.everydata.io"
KEY = os.environ["EVERYDATA_API_KEY"]
CSV_FILE = Path("prices.csv")
DOMAIN = "com" # amazon.com – use "de", "co.uk", "fr" … for other marketplaces
# ASIN -> the price at which you want to hear about it
WATCHLIST = {
"B07ZPKN6YR": 30.00,
}
def api_get(path: str, params: dict) -> dict:
"""GET an everydata.io endpoint. Waits when rate limited (429) and retries a failed page load (5xx) once."""
retried = False
for _ in range(4):
resp = requests.get(f"{API}{path}", params=params, headers={"x-api-key": KEY}, timeout=60)
if resp.status_code == 429:
# Too many requests at once. The answer says how long to wait: "... Try again in 12 seconds."
wait = re.search(r"in (\d+) seconds", resp.text)
time.sleep(int(wait.group(1)) + 1 if wait else 60)
continue
if resp.status_code >= 500 and not retried:
retried = True # 5xx answers are not counted against your quota
time.sleep(10)
continue
resp.raise_for_status() # 4xx (wrong key, quota used up, bad parameter) or a second 5xx
return resp.json()
raise RuntimeError("still rate limited after several waits – try again later")
def last_price(asin: str) -> float | None:
"""The most recent price we saved for this ASIN, if any."""
if not CSV_FILE.exists():
return None
with CSV_FILE.open(newline="") as f:
rows = [r for r in csv.DictReader(f) if r["asin"] == asin and r["price"]]
return float(rows[-1]["price"]) if rows else None
def main() -> None:
previous = {asin: last_price(asin) for asin in WATCHLIST}
now = datetime.now(timezone.utc).isoformat(timespec="seconds")
new_file = not CSV_FILE.exists()
with CSV_FILE.open("a", newline="") as f:
writer = csv.writer(f)
if new_file:
writer.writerow(["checked_at", "asin", "title", "price", "retail_price", "currency", "availability"])
for asin, target in WATCHLIST.items():
try:
p = api_get("/amz/amazon-lookup-product-by-asin", {"asin": asin, "domainCode": DOMAIN})
except (requests.RequestException, RuntimeError) as exc:
print(f"{asin}: could not check this time ({exc}) – the next run tries again")
continue # one failed product does not stop the others
price = p.get("price") or None # 0 means the page showed no price
writer.writerow([
now, asin, p.get("productTitle"), price or "", p.get("retailPrice") or "",
p.get("currency") or "", p.get("warehouseAvailability") or "",
])
if price is None:
print(f"{asin}: no price on the page ({p.get('warehouseAvailability')})")
elif price <= target:
print(f"{asin}: {price} {p.get('currency')} – at or below your target of {target}")
elif previous[asin] is not None and price < previous[asin]:
print(f"{asin}: dropped from {previous[asin]} to {price} {p.get('currency')}")
if __name__ == "__main__":
main()Execute com python3 track.py. A primeira execução cria o arquivo; as seguintes adicionam uma linha por produto. Você pode abrir prices.csv em qualquer programa de planilhas para montar um gráfico de preços.
api_get trata as duas respostas que você vai encontrar mais cedo ou mais tarde. Se uma página não puder ser carregada, a API responde com um status 5xx, como 502 ou 503; essas respostas não contam na sua cota, então o script espera alguns segundos e tenta mais uma vez. Se você enviar requisições demais de uma vez, a resposta é 429 e informa quantos segundos esperar – o script espera esse tempo e continua. Um produto que continuar falhando é informado e pulado, e a próxima execução tenta de novo.
04Decida como quer ser avisado
O script imprime uma linha em três casos: a página não mostra preço, o preço está igual ou abaixo do seu alvo, ou caiu desde a última verificação. Imprimir basta se você lê o log. Se preferir receber uma mensagem, substitua as três chamadas print pelo que você já usa – um e-mail via smtplib do Python, um webhook de chat ou um serviço de push.
05Execute todos os dias
Em um Mac ou Linux que fica ligado, o cron é o agendador mais simples. Esta linha executa o monitor todas as manhãs às 7:00 e mantém um log:
# Every day at 07:00 – edit with: crontab -e
0 7 * * * cd /home/you/price-tracker && EVERYDATA_API_KEY=ds_your_key /usr/bin/python3 track.py >> track.log 2>&1No Windows, o Agendador de Tarefas faz o mesmo trabalho. Qualquer servidor pequeno ou um job agendado de CI também serve.
Cada verificação de produto é uma requisição. Por exemplo: três produtos verificados uma vez por dia dão cerca de 90 requisições por mês, o que cabe no plano gratuito de 100 requisições. Para mais produtos ou mais verificações por dia, veja os preços.
06Opcional: leia o histórico de preços que a everydata.io já tem
Toda consulta de produto feita pela everydata.io também armazena o preço observado. O endpoint de histórico de preços devolve essas observações dos últimos days dias. Ele só conhece produtos que alguém já consultou; para um produto que ninguém verificou ainda, a lista vem vazia – seu próprio arquivo CSV continua sendo o registro confiável.
resp = requests.get(
f"{API}/amz/amazon-price-history",
params={"asin": "B07ZPKN6YR", "domainCode": "com", "days": 90},
headers={"x-api-key": KEY},
timeout=60,
)
data = resp.json()
print(data["count"], "observations")
for point in data["history"]:
print(point["observedAt"], point["price"], point["inStock"]){
"responseStatus": "PRODUCT_FOUND_RESPONSE",
"responseMessage": "Product successfully found!",
"asin": "B07ZPKN6YR",
"domainCode": "com",
"days": 90,
"currency": "USD",
"count": 2,
"history": [
{
"observedAt": "2026-09-18T10:12:00Z",
"price": 39.99,
"retailPrice": 49.99,
"inStock": true
},
{
"observedAt": "2026-09-19T09:40:00Z",
"price": 34.99,
"retailPrice": 49.99,
"inStock": true
}
]
}Endpoints usados neste guia
Product Details by ASIN · API Amazon
Price History (observations collected by this API) · API Amazon
O que mais você pode fazer com esses dados
Monitor de preços Amazon via API: preço da buy box, preço de tabela, estoque e histórico de preços por ASIN em JSON, em 15+ marketplaces. 100 grátis/mês.
API de produtos da Amazon em vez de um scraper: título, marca, preço, nota, imagens, bullets, especificações, variações e avaliações em JSON, por URL/ASIN.
Ofertas do dia e relâmpago da Amazon em JSON: preço da oferta, preço de tabela, desconto e status por ASIN, com filtros por departamento, desconto e nota.
Teste com seus próprios dados
O plano gratuito inclui 100 requisições por mês, válidas em todas as plataformas – o suficiente para seguir este guia do início ao fim.