Guia para extrair dados do Walmart com Python

Comentários: 0

A raspagem da Web é uma maneira poderosa de extrair dados de sites para diferentes fins, como análise, pesquisa e inteligência nos negócios. Este tutorial ajuda a extrair informações de produtos do Walmart em Python com foco nas principais estratégias e técnicas. O Walmart scraping apresenta um exemplo em que podemos extrair detalhes de produtos como nome, preço ou avaliações encontradas em várias páginas dos sites do Walmart.

Este guia usará a biblioteca requests para fazer solicitações HTTP e a biblioteca lxml para analisar o conteúdo HTML.

Configurando o ambiente

Antes de começarmos, certifique-se de que tem o Python instalado na sua máquina. Você pode instalar as bibliotecas necessárias usando pip:

pip install requests
pip install  lxml
pip install urllib3

Em seguida, vamos importar as bibliotecas necessárias:

  • requests: para fazer requisições HTTP para recuperar páginas web;
  • lxml: para analisar o conteúdo HTML;
  • csv: para escrever os dados extraídos para um ficheiro CSV;
  • random: para selecionar proxies aleatórios e cadeias de caracteres User-Agent.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Definir URLs de produtos

Lista de URLs de produtos do Walmart para raspar.

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

Cadeias de caracteres de agente de utilizador e proxies

Para fazer scrape de um sítio Web, é muito importante que se utilizem os cabeçalhos corretos, nomeadamente o cabeçalho User-Agent, de modo a imitar um pedido de um navegador real. Além disso, é possível evitar ser restringido devido a medidas anti-bot postas em prática pelos proprietários do sítio utilizando servidores proxy rotativos. Abaixo estão exemplos de cadeias de caracteres User-Agent, juntamente com uma descrição de como integrar servidores proxy que exigem autorização com base no 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

Defina cabeçalhos para imitar as solicitações do navegador e evitar a deteção.

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

Crie uma lista vazia para armazenar detalhes do produto.

product_details = []

O processo de enumeração das páginas URL funciona da seguinte forma: Para cada página URL, é enviado um pedido GET utilizando um User-Agent e um proxy selecionados aleatoriamente. Ao receber a resposta HTML, esta é analisada para extrair detalhes como o nome do produto, o preço e as avaliações. Os dados extraídos são armazenados como um dicionário, que é posteriormente anexado a uma lista que foi 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

Detalhe da revisão:

3.png

Guardar dados em CSV

  1. Abra um novo arquivo CSV para gravação.
  2. Definir os nomes dos campos (colunas) para o arquivo CSV.
  3. Criar um objeto csv.DictWriter para gravar dicionários no arquivo CSV.
  4. Escrever a linha de cabeçalho no arquivo CSV.
  5. Percorrer a lista product_details e gravar cada dicionário de produto como uma linha no arquivo 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:

Aqui está o código completo com comentários para o ajudar a compreender melhor:

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 a serem extraídos
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)

O nosso tutorial demonstra como utilizar as bibliotecas Python para extrair dados de produtos do Walmart e guardá-los no formato CSV para análise posterior. O script fornecido é fundamental e oferece uma base que pode ser melhorada para aumentar a eficiência do processo de raspagem. As melhorias podem incluir a introdução de atrasos aleatórios entre os pedidos para imitar os padrões de navegação humana, a implementação da rotação do User-Agent e do proxy para evitar a deteção e o desenvolvimento de um sistema robusto de tratamento de erros para gerir potenciais interrupções ou falhas na recolha de dados.

Comentários:

0 Comentários