Guia sobre como extrair dados do Walmart com Python

Comentários: 0

Business intelligence, investigação e análise são apenas algumas das infinitas possibilidades disponibilizadas pela recolha de dados da Web. Uma entidade comercial de pleno direito como a Walmart fornece uma estrutura perfeita para recolhermos as informações necessárias. Podemos facilmente extrair dados da Walmart, como o nome, o preço e as informações de avaliação dos seus inúmeros sítios Web, utilizando várias técnicas de extração.

Neste artigo, vamos explicar o processo de: como extrair dados do Walmart. Utilizaremos requests para enviar pedidos HTTP e lxml para analisar os documentos HTML devolvidos.

Porquê utilizar Python para extrair dados do Walmart?

Quando se trata de extrair dados de produtos em vários sites de retalho, o Python está entre as opções mais eficazes disponíveis. Eis como se integra perfeitamente em projectos de extração:

  1. Bibliotecas avançadas. A existência de pedidos de interação com a Web e de lxml para a análise de HTML significa que pode consultar vastos catálogos em linha com a maior facilidade e eficácia.
  2. Facilidade de utilização. Com uma sintaxe fácil de utilizar, os utilizadores podem programar processos de recuperação de dados com pouca ou nenhuma experiência prévia e, assim, começar a trabalhar.
  3. Apoio da comunidade. A complexidade dos sítios Web de retalho significa que existe uma grande quantidade de recursos de qualificação e de apoio da comunidade para o ajudar a resolver os problemas que surgem.
  4. Tratamento de dados. Análise em profundidade. Com a ajuda do Pandas para o tratamento de dados e do Matplotlib para a representação visual, Python permite ao utilizador analisar dados numa escala mais ampla, como a recolha e a análise.
  5. Gestão de conteúdos dinâmicos. Com o Selenium, a interação com os elementos dinâmicos da Web torna-se possível, o que garante uma recolha de dados extensiva, mesmo a partir de páginas carregadas com JavaScript.
  6. Escalonamento eficaz. Com a capacidade de gerir conjuntos de dados maciços e minuciosos, o Python tem um desempenho extremamente bom durante longos períodos de tempo, mesmo quando submetido a actividades extensivas de extração de dados.

A utilização deste tipo de linguagem para projectos no sector do retalho não só descomplica o aspeto técnico, como também aumenta a eficiência e o âmbito da análise, tornando-a a escolha principal para os especialistas que pretendem obter um conhecimento profundo do mercado. Estes aspectos podem ser especialmente úteis quando se decide recolher dados do Walmart.

Agora, vamos começar com a construção de uma ferramenta de raspagem da Web do Walmart.

Configurar o ambiente para extrair dados do Walmart

Para começar, certifique-se de que o Python está instalado no seu computador. As bibliotecas necessárias podem ser descarregadas utilizando pip:


pip install requests
pip install  lxml
pip install urllib3

Agora vamos importar bibliotecas como:

  • requests - para obter páginas Web através de HTTP;
  • lxml - para a geração de árvores de documentos HTML;
  • CSV - para escrever os dados recolhidos em ficheiros CSV;
  • aleatório - para seleção de cadeias de caracteres do proxy e do agente do utilizador.

import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Definir URLs de produtos

A lista de URLs de produtos para extrair dados do Walmart pode ser adicionada desta forma.


product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

Cadeias de caracteres User-Agent e Proxies

Ao fazer web scraping no Walmart, é crucial apresentar os cabeçalhos HTTP corretos, especialmente o cabeçalho User-Agent, de modo a imitar um browser real. Além disso, os sistemas anti-bot do site também podem ser contornados usando servidores proxy rotativos. No exemplo abaixo, as cadeias de caracteres User-Agent são apresentadas juntamente com instruções para adicionar a autorização do servidor proxy por endereço IP.


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

Cabeçalhos para pedidos

Os cabeçalhos dos pedidos devem ser definidos de forma a disfarçá-los como provenientes do browser de um utilizador. Isso ajudará muito ao tentar extrair dados do Walmart. Aqui está um exemplo de como isso ficaria:


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

Inicializar o armazenamento de dados

O primeiro passo é criar uma estrutura que aceite informações sobre o produto.


product_details = []

A enumeração de páginas URL funciona da seguinte forma: Para cada página URL, é iniciado um pedido GET com um User-Agent e um proxy escolhidos aleatoriamente. Depois de ser devolvida uma resposta HTML, esta é analisada para obter os pormenores do produto, incluindo o nome, o preço e as avaliações. Os pormenores relevantes são guardados na estrutura de dados do dicionário, que é posteriormente adicionada à lista criada anteriormente.


for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Enviar um pedido HTTP GET para o URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Analisar o conteúdo HTML utilizando lxml
   parser = html.fromstring(response.text)
   # Extrair o título do produto
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Extrair o preço do produto
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Extrair detalhes da revisão
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Armazenar detalhes extraídos num dicionário
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Anexar detalhes do produto à lista
   product_details.append(product_detail)

Título:

1.png

Preço:

2.png

Detalhes da revisão:

3.png

Guardar dados em CSV

  1. Crie um novo ficheiro especificando CSV para o tipo de ficheiro e defina-o para o modo de escrita.
  2. Especifique os nomes dos campos (colunas) do ficheiro CSV.
  3. Para escrever dicionários no ficheiro CSV, crie um objeto csv.DictWriter.
  4. Escreve a linha de cabeçalho do ficheiro CSV.
  5. Para cada dicionário em product_details, faça um loop e escreva o dicionário como uma linha no ficheiro CSV.

with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

Código completo

Quando o web scraping Walmart, o script completo do Python será parecido com o fornecido abaixo. Também há alguns comentários para facilitar a compreensão de cada secção.


import requests
from lxml import html
import csv
import random
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# Lista de URLs de produtos para extrair dados do Walmart
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Cadeias de caracteres User-Agent aleatórias para anonimato
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# Lista de proxy para rotação de IP
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Cabeçalhos para imitar os pedidos do browser
headers = {
   'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
   'accept-language': 'en-IN,en;q=0.9',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   'sec-ch-ua-mobile': '?0',
   'sec-ch-ua-platform': '"Linux"',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'none',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
}

# Inicializar uma lista vazia para armazenar os detalhes do produto
product_details = []

# Percorrer cada URL de produto
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Enviar um pedido HTTP GET para o URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Analisar o conteúdo HTML utilizando lxml
   parser = html.fromstring(response.text)
   # Extrair o título do produto
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Extrair o preço do produto
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Extrair detalhes da revisão
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Armazenar detalhes extraídos num dicionário
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Anexar detalhes do produto à lista
   product_details.append(product_detail)

# Escrever os dados extraídos para um ficheiro CSV
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

Sugestões adicionais

Para aqueles que usam Python para fazer interface com a API de raspagem do Walmart, é crucial desenvolver métodos robustos que efetivamente raspem os preços do Walmart e os resultados das avaliações do Walmart. Esta API fornece um canal direto para dados extensivos de produtos, facilitando a análise em tempo real dos preços e do feedback dos clientes.

A utilização destas estratégias específicas aumenta a precisão e o âmbito das informações recolhidas, permitindo que as empresas se adaptem rapidamente às alterações do mercado e às tendências dos consumidores. Através da aplicação estratégica da API da Walmart em Python, as empresas podem otimizar os seus processos de recolha de dados, garantindo uma análise de mercado abrangente e uma tomada de decisões informada.

Conclusão

Neste tutorial, explicámos como utilizar as bibliotecas Python para extrair dados do Walmart e guardá-los num ficheiro CSV para análise posterior. O script fornecido é básico e serve como um ponto de partida que pode ser modificado para melhorar a eficiência do processo de recolha de dados. As melhorias podem incluir a adição de intervalos de tempo aleatórios entre os pedidos para simular a navegação humana, a utilização de agentes de utilizador e proxies para mascarar o bot e a implementação de um tratamento de erros avançado para lidar com interrupções ou falhas na recolha de dados.


Comentários:

0 Comentários