Como recolher dados de sítios Web de comércio eletrónico com Python

Comentários: 0

Para análise competitiva, monitorização de preços e pesquisa de mercado, é importante extrair dados de produtos de sites de comércio eletrónico. Pode utilizar Python para extrair dados de páginas de produtos de forma eficiente. Neste guia, demonstraremos como extrair informações de produtos de lojas on-line usando uma combinação de solicitações e lxml.

A raspagem de comércio eletrônico envolve a extração de detalhes do produto, como nomes, preços e IDs de lojas on-line. O Python, com suas bibliotecas versáteis, torna essa tarefa eficiente e direta. Neste guia, vamos extrair informações de produtos do site da Costco.

Escrevendo um script para extrair dados de produtos

Antes de mergulhar no processo de raspagem, certifique-se de ter as bibliotecas Python necessárias instaladas:

pip install requests
pip install lxml

Vamos concentrar-nos em extrair nomes de produtos, caraterísticas de produtos e marcas de produtos de páginas de produtos específicas no site.

Passo 1. Compreender a estrutura HTML do site

Para extrair dados de qualquer site, você precisa entender a estrutura da página da Web. Abra uma página do site e inspeccione os elementos que pretende extrair (por exemplo, nome do produto, caraterísticas da marca, etc.).

Passo 2. Envio de solicitações HTTP

Primeiro, usaremos a biblioteca requests para enviar solicitações HTTP GET para as páginas de produtos. Também vamos configurar os cabeçalhos da requisição para imitar uma requisição real do navegador.


import requests

# Lista de URLs de produtos a serem extraídos
urls = [
    "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
    "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Percorrer cada URL e enviar um pedido GET
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # O processamento adicional será acrescentado em etapas subsequentes
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Passo 3. Extraindo dados usando XPath e lxml

Usando lxml, extrairemos os pontos de dados necessários do HTML analisado.

from lxml import html

# Lista para armazenar dados extraídos
scraped_data = []

# Percorrer cada URL e enviar um pedido GET
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Analisar conteúdo HTML com lxml
        tree = html.fromstring(html_content)
        
        # Extrair dados utilizando XPath
        product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
        product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
        product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
        
        # Anexar os dados extraídos à lista
        scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Imprimir os dados extraídos
for item in scraped_data:
    print(item)

Passo 4. Abordagem de potenciais problemas

Os sítios Web implementam frequentemente medidas anti-bot. A utilização de proxies e de agentes de utilizador rotativos pode ajudar a evitar a deteção.

Usando proxies com autorização de IP:


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)

Agentes de utilizador rotativos:


import random

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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # Adicionar mais agentes de utilizador conforme necessário
]

headers['user-agent'] = random.choice(user_agents)

response = requests.get(url, headers=headers)

Passo 5. Salvando dados em um arquivo CSV

Finalmente, salvaremos os dados raspados em um arquivo CSV para análise posterior.

import csv

csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Escrever dados num ficheiro CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for item in scraped_data:
            writer.writerow(item)
    print(f"Data saved to {csv_file}")
except IOError:
    print(f"Error occurred while writing data to {csv_file}")

Código completo


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

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

# Lista de URLs de produtos a serem extraídos
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

#  cabeçalhos
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-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Lista de agentes do utilizador para pedidos rotativos
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   # Adicionar mais agentes de utilizador conforme necessário
]


# Lista de proxies para pedidos rotativos
proxies = [
    {'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
    # Adicionar mais proxies conforme necessário
]

# Lista para armazenar dados extraídos
scraped_data = []

# Percorrer cada URL e enviar um pedido GET
for url in urls:
   # Escolher um agente de utilizador aleatório para os cabeçalhos do pedido
   headers['user-agent'] = random.choice(user_agents)
   # Escolher um proxy aleatório para o pedido
   proxy = random.choice(proxies)

   # Enviar um pedido HTTP GET para o URL com cabeçalhos e proxy
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Armazena o conteúdo HTML da resposta
       html_content = response.content
       # Analisar conteúdo HTML com lxml
       tree = html.fromstring(html_content)

       # Extrair dados utilizando XPath
       product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
       product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
       product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()

       # Anexar os dados extraídos à lista
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # Imprimir mensagem de erro se o pedido falhar
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Configuração do ficheiro CSV
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Escrever dados num ficheiro CSV
try:
   with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
       writer = csv.DictWriter(file, fieldnames=fieldnames)
       writer.writeheader()
       for item in scraped_data:
           writer.writerow(item)
   print(f"Data saved to {csv_file}")
except IOError:
   # Imprimir mensagem de erro se a escrita no ficheiro falhar
   print(f"Error occurred while writing data to {csv_file}")

A utilização de Python para extrair informação de sítios de comércio eletrónico como o Costco é um método eficaz de recolha de informação sobre produtos para análise e tomada de decisões estratégicas. A utilização adequada de bibliotecas, por exemplo, Requests e Lxml, resulta em processos de extração automatizados que podem tratar conteúdos HTML sem esquecer a implementação de uma API anti-bot eficaz. É de notar que os protocolos de raspagem ética devem ser sempre seguidos.

Comentários:

0 Comentários