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

Comentários: 0

A recolha de dados de comércio eletrónico para obter informações sobre produtos é útil para efetuar análises da concorrência, monitorizar preços e realizar estudos de mercado. A raspagem de dados de páginas de produtos pode ser feita convenientemente usando Python. Este tutorial de raspagem de comércio eletrônico mostrará como coletar informações usando uma combinação de solicitações e lxml de lojas on-line.

A recolha de dados de páginas Web para comércio eletrónico consiste em obter informações sobre produtos, como o título, o preço ou o número de identificação, em lojas na Internet. As numerosas bibliotecas disponíveis em Python tornam esta tarefa não só fácil como bastante eficiente. Neste artigo, vamos concentrar-nos na recolha de dados de sítios Web de comércio eletrónico utilizando Python. O sítio Web da Costco será o nosso objeto.

Escrever um script para raspagem de dados de comércio eletrónico

Para começar, vamos certificar-nos de que temos todas as ferramentas ou bibliotecas de raspagem de comércio eletrónico Python disponíveis que vamos precisar para este script:


pip install requests
pip install lxml

Concentrar-nos-emos na extração de nomes de produtos, caraterísticas e marcas de páginas específicas do sítio Web.

Passo 1. Compreender a estrutura HTML do sítio Web

Para começar a criar um raspador de produtos de comércio eletrónico, tem de compreender primeiro como está estruturada uma determinada página Web. Vá ao sítio Web, abra a página da qual pretende recolher informações e inspeccione os elementos necessários (por exemplo, nome do produto, caraterísticas, marca, etc.).

Passo 2. Envio de pedidos HTTP

Primeiro, vamos importar a biblioteca requests para enviar GET especialmente para as páginas de produtos. Além disso, vamos configurar os cabeçalhos do pedido para que se assemelhem a um pedido do browser.


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. Extrair dados utilizando XPath e lxml

Com o lxml, vamos extrair a informação desejada do html. É crucial quando se lida com a extração de dados de comércio eletrónico.


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

Quando tentamos fazer scraping de um site de comércio eletrónico com Python, temos de compreender que a maioria dos sites tem algum tipo de software anti-bot. A utilização de proxies e de agentes de utilizador rotativos pode ajudar a aliviar as suas suspeitas.

Utilizar 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. Guardar dados num ficheiro CSV

No final, os dados extraídos serão armazenados num formato CSV para que eu possa analisá-los mais tarde num processo de recolha de dados de comércio eletrónico mais avançado.


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

Aqui está a versão final do script para a recolha eficaz de dados de comércio eletrónico. Pode copiar e colar para uma utilização fácil.


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"
]

# headers
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}")

O Python ecommerce scraper está completo agora.

Extração de dados de comércio eletrónico: Considerações finais

A utilização de um raspador Web de comércio eletrónico para a loja online da Costco mostra como o Python pode ser eficaz na obtenção de dados de produtos para análise e tomada de decisões comerciais optimizadas. Com os scripts e as bibliotecas certas, Requests e Lxml para fornecer extractores automatizados, é possível fazer scraping do site sem quaisquer interrupções do fluxo de trabalho causadas por uma API anti-bot. Por último, é essencial cumprir sempre os regulamentos éticos ao efetuar a recolha de dados da Web para comércio eletrónico.

Comentários:

0 Comentários