2 pontos por GN⁺ 2024-08-07 | 1 comentários | Compartilhar no WhatsApp

Rastreando preços de supermercados

  • Em dezembro de 2022, foi criado um site para acompanhar as variações de preços de três grandes supermercados da Grécia.
  • Nesse processo, foi preciso resolver vários problemas, e muitos aprendizados foram obtidos.

Fazendo scraping de sites em js

  • O principal problema eram os sites renderizados com JavaScript.
  • Foi usado o Playwright para controlar o navegador de forma programática.
  • O Playwright oferece suporte aos navegadores Chromium, Safari e Firefox, e pode ser usado com Node, Java, .NET e Python.
  • Foi escrito código para lidar com rolagem infinita e extrair informações dos produtos.

Automação

  • Em um M1 MacBook Pro, levaram de 50 minutos a 2 horas e 30 minutos para fazer o scraping de um supermercado inteiro.
  • Isso era bom para desenvolvimento e testes, mas era necessária uma solução mais permanente.

Usar um notebook antigo?

  • Foi tentado usar um notebook antigo de 2013, mas o desempenho foi muito decepcionante.

Usar a nuvem?

  • A AWS era cara demais, e a Hetzner era muito mais barata.
  • Foi decidido usar os servidores da Hetzner.

Usar notebook antigo e nuvem!

  • O scraping foi automatizado em um servidor na nuvem, e o notebook antigo foi usado como servidor de CI.
  • Foi usado o Concourse para configurar o pipeline e executar o trabalho de scraping diariamente.

Contornando limitações de IP

  • Devido a regras de firewall da Akamai, requisições de endereços IP não residenciais eram bloqueadas.
  • Foi usado o Tailscale para fazer as requisições parecerem vir do IP residencial.

Causas e momentos das falhas

  • O projeto de scraping é afetado pelos desenvolvedores do site.
  • Há dois tipos de falha: breaking changes e non-breaking changes.
  • Receber feedback rapidamente é importante.

Otimização

  • Foram realizados vários trabalhos de otimização, como alertas por e-mail, histerese, timeouts e configuração de novas tentativas.
  • O desempenho foi melhorado usando um servidor maior e reduzindo a busca de dados.

Custos

  • O custo de uso do servidor na Hetzner é muito baixo.
  • Os custos de armazenamento de dados foram reduzidos usando o tier gratuito do R2 da Cloudflare.

Conclusão

  • São explicados os principais componentes usados para construir um pipeline de scraping para acompanhar variações nos preços de supermercados.

Resumo do GN⁺

  • Este texto compartilha a experiência de usar Playwright e serviços de nuvem para acompanhar variações de preços em supermercados.
  • Ele aborda como fazer scraping de sites renderizados com JavaScript, além de métodos de automação e otimização.
  • Também explica como usar Hetzner e Tailscale para reduzir custos e contornar limitações de IP.
  • O texto pode ser útil para pessoas interessadas em web scraping e automação.

1 comentários

 
GN⁺ 2024-08-07
Comentários do Hacker News
  • Compartilhando a experiência de ter enfrentado um problema parecido

    • Opera um site de comparação de preços de lentes em 30 países
    • Mudanças no HTML dos sites são um grande problema
    • Fazer a correspondência de produtos em mais de 100 sites foi o maior obstáculo inicial
    • A maior parte pode ser tratada com expressões regulares, mas é necessário fazer mapeamento manual
    • Construir o scraper e a infraestrutura é relativamente fácil; difícil é a manutenção
    • Quando um produto desaparece, é difícil descobrir a causa do erro
    • É um projeto divertido, mas desafiador e cheio de problemas incômodos para resolver
  • Tocando um projeto semelhante na Nova Zelândia

    • Usa Playwright e Typescript, armazenando arquivos Parquet em cloud storage
    • Só coleta os dados e ainda não os exibe
    • A principal tarefa é contornar serviços de proxy reverso como Akamai e Cloudflare
    • Na Nova Zelândia, pelo menos 3 startups estão fazendo a mesma coisa
    • A inflação estimula muita inovação
    • Observou padrões em que os supermercados tornam os preços mais complicados
  • Criou um site semelhante e recebeu bastante atenção

    • Usa um servidor Linode com 2GB de RAM, 5 IPv4 e 1000 IPv6
    • Faz scraping de todos os produtos em intervalos de até 40 minutos
    • Usa curl impersonate e scraping de JSON
    • 90% do mercado fornece preços por chamadas Ajax, e nos 10% restantes usa expressões regulares
    • Site: economizafloripa.com.br
  • Os dois principais supermercados da Austrália podem formar um monopólio por meio de algoritmos de IA de análise de preços

    • Algoritmos de IA podem cooperar para maximizar os lucros
    • Isso pode acontecer legalmente com dados públicos de preços, ou ilegalmente ao compartilhar custos de fornecimento ou lucro por produto
    • O consumidor acaba pagando pelo lucro maximizado
  • Atua no mercado sueco há mais de 8 anos

    • Site: matspar.se
    • Os clientes podem comparar produtos de todas as principais lojas online e adicioná-los ao carrinho
    • Após comparar o preço total, podem exportar o carrinho para a loja desejada
    • Faz scraping de mais de 30 milhões de preços por dia
  • Com transparência de preços, o rastreamento ficaria mais fácil

    • Exemplo: comparar o preço de leite de aveia em diferentes CEPs e supermercados
    • Possibilidade de rastrear "shrinkflation" (mesmo preço por uma quantidade menor)
    • É preciso verificar não só o preço, mas também o custo por grama
  • Como fazer mudanças sem quebrar o scraper

    • É possível adicionar verificações automáticas para evitar variações anormais de preço
    • Exemplo: impedir que o preço mude mais de 100% ou que o número de produtos ativos varie mais de 20%
  • Compartilhando a experiência de acompanhar preços ao se mudar para uma nova região

    • É mais fácil fazer compras baratas em dois mercados ou grandes lojas
    • Europa: Aldi/Lidl, EUA: Costco/Trader Joe's
    • Online: CamelCamelCamel/Amazon
    • Comprar direto do fabricante pode sair mais barato
  • O mais difícil é contornar bloqueios cada vez mais sofisticados, mais do que fazer scraping em si

    • É preciso rotacionar continuamente proxies residenciais e evitar padrões de scraping de dados
    • Alguns supermercados ocultam as requisições de rede
    • Até verificar as requisições e os dados de rede em apps móveis é bloqueado
    • Considerou que não vale a pena por causa do custo e do trabalho contínuo de desenvolvimento
  • Problema de renderização com JavaScript no lado do cliente

    • Ironicamente, os dados que preenchem o site são fornecidos em um formato JSON simples, o que torna o scraping mais confiável