Voltar ao blogue
Guias
Raluca Penciuc23 de fevereiro de 20239 min de leitura

O guia definitivo para a extração de dados da Web do Walmart

O guia definitivo para a extração de dados da Web do Walmart

Pré-requisitos

Antes de começarmos, vamos certificar-nos de que dispomos das ferramentas necessárias.

Primeiro, baixe e instale o Node.js do site oficial, certificando-se de usar a versão Long-Term Support (LTS). Isso também instalará automaticamente o Node Package Manager (NPM), que usaremos para instalar outras dependências.

Para este tutorial, usaremos o Visual Studio Code como nosso ambiente de desenvolvimento integrado (IDE), mas você pode usar qualquer outro IDE de sua escolha. Crie uma nova pasta para seu projeto, abra o terminal e execute o seguinte comando para configurar um novo projeto Node.js:

npm init -y

Isto criará um ficheiro package.json no seu diretório de projeto, que armazenará informações sobre o seu projeto e as suas dependências.

Em seguida, precisamos instalar o TypeScript e as definições de tipo para o Node.js. O TypeScript oferece tipagem estática opcional que ajuda a evitar erros no código. Para fazer isso, execute no terminal:

npm install typescript @types/node --save-dev

Pode verificar a instalação executando:

npx tsc --versão

O TypeScript usa um arquivo de configuração chamado tsconfig.json para armazenar opções do compilador e outras configurações. Para criar esse arquivo em seu projeto, execute o seguinte comando:

npx tsc -init

Certifique-se de que o valor de "outDir" esteja definido como "dist". Desta forma, iremos separar os ficheiros TypeScript dos ficheiros compilados. Pode encontrar mais informações sobre este ficheiro e as suas propriedades na documentação oficial do TypeScript.

Agora, crie um diretório "src" no seu projeto e um novo ficheiro "index.ts". É aqui que vamos manter o código de raspagem. Para executar o código TypeScript, é necessário compilá-lo primeiro, portanto, para garantir que não nos esqueçamos dessa etapa extra, podemos usar um comando definido de forma personalizada.

Vá ao ficheiro "package. json" e edite a secção "scripts" desta forma:

"scripts": {

    "test": "npx tsc && node dist/index.js"

}

Desta forma, quando for executar o script, basta digitar "npm run test" no seu terminal.

Por fim, para extrair os dados do site, usaremos o Puppeteer, uma biblioteca de navegador sem cabeça para Node.js que permite controlar um navegador da Web e interagir com sites de forma programática. Para instalá-la, execute este comando no terminal:

npm install puppeteer

É altamente recomendado quando se pretende garantir a integridade dos dados, uma vez que muitos sítios Web actuais contêm conteúdo gerado dinamicamente. Se estiver curioso, pode consultar a documentação do Puppeteer antes de continuar para ver o que ele é capaz de fazer.

Localização dos dados

Agora que já tem o seu ambiente configurado, podemos começar a ver como extrair os dados. Para este artigo, optei por extrair dados desta página de produto: https://www.walmart.com/ip/Keter-Adirondack-Chair-Resin-Outdoor-Furniture-Teal/673656371.

Vamos extrair os seguintes dados:

  • o nome do produto;
  • o número de classificação do produto;
  • as avaliações do produto são importantes;
  • o preço do produto;
  • as imagens do produto;
  • os detalhes do produto.

Pode ver todas estas informações destacadas na imagem de ecrã abaixo:

Página de produto do Walmart para uma cadeira Adirondack de exterior, com caixas vermelhas a destacar a galeria de imagens, o título do produto e o preço, bem como a secção de descrição

Ao abrir as Ferramentas do desenvolvedor em cada um desses elementos, você poderá observar os seletores CSS que usaremos para localizar os elementos HTML. Se não sabe muito bem como funcionam os selectores CSS, pode consultar este guia para principiantes.

Extração de dados

Antes de escrever o nosso script, vamos verificar se a instalação do Puppeteer correu bem:

import puppeteer from 'puppeteer';

async function scrapeWalmartData(walmart_url: string): Promise<void> {

    // Launch Puppeteer

    const browser = await puppeteer.launch({

        headless: false,

    	  args: ['--start-maximized'],

    	  defaultViewport: null

    })

    // Create a new page

    const page = await browser.newPage()

    // Navigate to the target URL

    await page.goto(walmart_url)

    // Close the browser

    await browser.close()

}

scrapeWalmartData("https://www.walmart.com/ip/Keter-Adirondack-Chair-Resin-Outdoor-Furniture-Teal/673656371")

Aqui, abrimos uma janela do navegador, criamos uma nova página, acedemos ao URL de destino e, em seguida, fechamos o navegador. Por uma questão de simplicidade e para facilitar a depuração visual, abro a janela do navegador maximizada no modo não headless.

Agora, vamos dar uma vista de olhos à estrutura do sítio Web:

Página de produto do Walmart ao lado do inspetor do navegador, destacando o título do produto, o preço e os elementos HTML correspondentes

Para obter o nome do produto, selecionamos o atributo«itemprop»do elemento«h1». O resultado que procuramos é o seu conteúdo de texto.

// Extract product name

const product_name = await page.evaluate(() => {

    const name = document.querySelector('h1[itemprop="name"]')

    return name ? name.textContent : ''

})

console.log(product_name)

No que diz respeito ao número de classificação, identificámos como fiáveis os elementos«span»cujo nome de classe termina em«rating-number».

// Extract product rating number

const product_rating = await page.evaluate(() => {

    const rating = document.querySelector('span[class$="rating-number"]')

    return rating ? rating.textContent : ''

})

console.log(product_rating)

E, por fim (para a secção destacada), no que diz respeito ao número de avaliações e ao preço do produto, recorremos ao atributo«itemprop», tal como acima.

// Extract product reviews count

const product_reviews = await page.evaluate(() => {

    const reviews = document.querySelector('a[itemprop="ratingCount"]')

    return reviews ? reviews.textContent : ''

})

console.log(product_reviews)

// Extract product price

const product_price = await page.evaluate(() => {

    const price = document.querySelector('span[itemprop="price"]')

    return price ? price.textContent : ''

})

console.log(product_price)

Passando agora às imagens dos produtos, avançamos no documento HTML:

Página de produto do Walmart com o carrossel de miniaturas de imagens destacado e o inspetor do navegador a mostrar o elemento de imagem selecionado

É um pouco mais complicado, mas não impossível. Não conseguimos identificar as imagens de forma única apenas por si mesmas, por isso, desta vez, vamos focar-nos nos seus elementos pai. Assim, extraímos os elementos «div» que têm o atributo«data-testid»definido como«media-thumbnail».

Em seguida, convertemos o resultado numa matriz de JavaScript, para que possamos associar cada elemento ao seu atributo«src».

// Extract product images

const product_images = await page.evaluate(() => {

    const images = document.querySelectorAll('div[data-testid="media-thumbnail"] > img')

    const images_array = Array.from(images)

    return images ? images_array.map(a => a.getAttribute("src")) : []

})

console.log(product_images)

E, por último, mas não menos importante, descemos na página para consultar os detalhes do produto:

Secção de detalhes do produto do Walmart em destaque, com o inspetor do navegador a mostrar o código HTML da descrição e do conteúdo da lista com marcadores

Aplicamos a mesma lógica utilizada na extração das imagens e, desta vez, limitamo-nos a utilizar o nome da classe«dangerous-html».

// Extract product details

const product_details = await page.evaluate(() => {

    const details = document.querySelectorAll('div.dangerous-html')

    const details_array = Array.from(details)

    return details ? details_array.map(d => d.textContent) : []

})

console.log(product_details)

O resultado final deve ser o seguinte:

Cadeira Keter Adirondack, Mobiliário de exterior em resina, azul-petróleo

(4,1)

269 avaliações

Agora por 59,99 $

[

'https://i5.walmartimages.com/asr/51fc64d9-6f1f-46b7-9b41-8880763f6845.483f270a12a6f1cbc9db5a37ae7c86f0.jpeg?odnHeight=80&odnWidth=80&odnBg=FFFFFF',  'https://i5.walmartimages.com/asr/80977b5b-15c5-435e-a7d6-65f14b2ee9c9.d1deed7ca4216d8251b55aa45eb47a8f.jpeg?odnHeight=80&odnWidth=80&odnBg=FFFFFF',

'https://i5.walmartimages.com/asr/80c1f563-91a9-4bff-bda5-387de56bd8f5.5844e885d77ece99713d9b72b0f0d539.jpeg?odnHeight=80&odnWidth=80&odnBg=FFFFFF',  'https://i5.walmartimages.com/asr/fd73d8f2-7073-4650-86a3-4e809d09286e.b9b1277761dec07caf0e7354abb301fc.jpeg?odnHeight=80&odnWidth=80&odnBg=FFFFFF',

'https://i5.walmartimages.com/asr/103f1a31-fbc5-4ad6-9b9a-a298ff67f90f.dd3d0b75b3c42edc01d44bc9910d22d5.jpeg?odnHeight=80&odnWidth=80&odnBg=FFFFFF',  'https://i5.walmartimages.com/asr/120121cd-a80a-4586-9ffb-dfe386545332.a90f37e11f600f88128938be3c68dca5.jpeg?odnHeight=80&odnWidth=80&odnBg=FFFFFF',

'https://i5.walmartimages.com/asr/47b8397f-f011-4782-bbb7-44bfac6f3fcf.bb12c15a0146107aa2dcd4cefba48c38.jpeg?odnHeight=80&odnWidth=80&odnBg=FFFFFF'

]

[

  'A cadeira Keter Adirondack permite-lhe desfrutar do conforto descontraído desta cadeira popular, mas sem as preocupações associadas à madeira. Combinando o estilo tradicional e o aspeto e toque da madeira com materiais duráveis e que não requerem manutenção, esta cadeira irá encontrar',

  'Cadeira Keter Adirondack, Mobiliário de exterior em resina, cinzenta:   Fabricada em resina resistente a todas as condições meteorológicas para uma durabilidade máxima  A construção em polipropileno resistente às intempéries evita o desbotamento, a oxidação, o descascamento e as amolgadelas — ao contrário da madeira verdadeira  Montagem rápida e fácil  Porta-copos giratório  Conforto clássico redefinido  Design ergonómico  Durável e resistente às intempéries  Relaxamento sem preocupações  Dimensões: 79,9 cm C x 80 cm L x 96,5 cm A  A altura do assento é de 39 cm, com um assento profundo e encosto alto  A cadeira pesa 10 kg — pesada o suficiente para não ser derrubada pelo vento, mas leve o suficiente para reorganizar facilmente o seu espaço no pátio  Capacidade de 159 kg '

]

Contornar a deteção de bots

Embora a extração de dados do Walmart possa parecer fácil à primeira vista, o processo pode tornar-se mais complexo e desafiante à medida que o projeto vai ganhando escala. O site de retalho implementa várias técnicas para detetar e impedir o tráfego automatizado, pelo que o seu programa de extração, à medida que ganha escala, começa a ser bloqueado.

O Walmart utiliza o modelo «Press & Hold» de CAPTCHA, fornecido pela PerimeterX, que é conhecido por ser praticamente impossível de resolver a partir do código. Além disso, o site também utiliza proteções fornecidas pela Akamai e pela ThreatMetrix e recolhe vários dados do navegador para gerar e associar ao utilizador uma impressão digital única.

Entre os dados do navegador recolhidos, encontramos:

  • propriedades do objeto Navigator (deviceMemory, hardwareConcurrency, idiomas, plataforma, userAgent, webdriver, etc.)
  • identificação de impressões digitais na tela
  • controlos de prazos e de desempenho
  • plug-in e enumeração de voz
  • Web Workers
  • controlo das dimensões do ecrã
  • e muitos mais

Uma forma de superar estes desafios e continuar a extrair dados em grande escala é utilizar uma API de extração. Este tipo de serviços oferece uma forma simples e fiável de aceder a dados de sites como o walmart.com, sem necessidade de criar e manter o seu próprio programa de extração.

O WebScrapingAPI é um exemplo de um produto deste género. O seu mecanismo de rotação de proxy evita completamente os CAPTCHAs, e a sua base de conhecimentos alargada permite aleatorizar os dados do browser para que se pareça com um utilizador real.

A configuração é rápida e fácil. Basta registar uma conta para receber a sua chave de API. Esta pode ser acedida a partir do seu painel de controlo e é utilizada para autenticar os pedidos que envia.

Ecrã de boas-vindas do painel de controlo da WebScrapingAPI, apresentando um guia de início rápido em três passos com a chave da API, o ambiente de teste da API e links para a documentação

Como já configurou o seu ambiente Node.js, podemos utilizar o SDK correspondente. Execute o seguinte comando para o adicionar às dependências do seu projeto:

npm install webscrapingapi

Agora só falta ajustar os selectores CSS anteriores à API. A poderosa caraterística das regras de extração torna possível analisar dados sem modificações significativas.

import webScrapingApiClient from 'webscrapingapi';

const client = new webScrapingApiClient("YOUR_API_KEY");

async function exampleUsage() {

    const api_params = {

        'render_js': 1,

    	  'proxy_type': 'residential',

    	  'timeout': 60000,

    	  'extract_rules': JSON.stringify({

            name: {

                selector: 'h1[itemprop="name"]',

                output: 'text',

        	},

        	rating: {

                selector: 'span[class$="rating-number"]',

                output: 'text',

        	},

        	reviews: {

                selector: 'a[itemprop="ratingCount"]',

                output: 'text',

        	},

        	price: {

                selector: 'span[itemprop="price"]',

                output: 'text',

        	},

        	images: {

                selector: 'div[data-testid="media-thumbnail"] > img',

                output: '@src',

                all: '1'

        	},

        	details: {

                selector: 'div.dangerous-html',

                output: 'text',

                all: '1'

        	}

        })

    }

    const URL = "https://www.walmart.com/ip/Keter-Adirondack-Chair-Resin-Outdoor-Furniture-Teal/673656371"

    const response = await client.get(URL, api_params)

    if (response.success) {

        console.log(response.response.data)

    } else {

        console.log(response.error.response.data)

    }

}

exampleUsage();

Conclusão

Este artigo apresentou-lhe uma visão geral sobre como extrair dados da Web do Walmart utilizando TypeScript em conjunto com o Puppeteer. Abordámos o processo de configuração do ambiente necessário, a identificação e a extração dos dados, e fornecemos trechos de código e exemplos para o ajudar a orientar-se ao longo do processo.

As vantagens de extrair dados do Walmart incluem a obtenção de informações valiosas sobre o comportamento do consumidor, as tendências do mercado, o acompanhamento de preços e muito mais.

Além disso, optar por um serviço profissional de scraping pode ser uma solução mais eficiente, uma vez que garante que o processo seja totalmente automatizado e lida com as possíveis técnicas de deteção de bots que possam surgir.

Ao tirar partido do poder dos dados do Walmart, pode impulsionar o seu negócio para o sucesso e manter-se à frente da concorrência. Lembre-se de respeitar sempre os termos de serviço do site e de não fazer scraping de forma demasiado agressiva, para evitar ser bloqueado.

Sobre o autor
Raluca Penciuc, Desenvolvedora Full-Stack na WebScrapingAPI
Raluca PenciucDesenvolvedor Full-Stack

Raluca Penciuc é programadora Full Stack na WebScrapingAPI, onde desenvolve scrapers, aperfeiçoa estratégias de evasão e procura formas fiáveis de reduzir a deteção nos sites-alvo.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.