Como extrair dados do eBay usando Python

Comentários: 0

O eBay é uma plataforma online bem conhecida que oferece oportunidades de negociação em uma ampla gama de produtos entre seus usuários registrados. Neste guia, vamos explicar como extrair dados da listagem do eBay usando Python. Como tal, estaremos interessados em detalhes que estão disponíveis a partir da própria listagem, bem como de ir para cada um dos produtos, por sua vez, para mais detalhes.

Requisitos

Para começar, certifique-se de que tem as seguintes bibliotecas Python instaladas:

  • Requests: Para fazer requisições HTTP.
  • lxml: Para analisar o conteúdo HTML.
  • Pandas: Para salvar dados em um arquivo CSV.

Instale essas bibliotecas usando:


pip install requests lxml pandas

Compreendendo a estrutura de URL do eBay para paginação

Ao pesquisar produtos no eBay, cada URL de página pode ser modificado para navegar pelos resultados paginados. Por exemplo:

  • Página 1: https://www.ebay.com/sch/i.html?_nkw=laptop
  • Página 2: https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn=2

O parâmetro _pgn é usado para navegar por várias páginas de listagens, permitindo a recuperação de dados extensos. Vamos começar o processo de raspagem.

Passo 1: Enviando solicitações ao eBay

Para começar, configuraremos cabeçalhos para imitar uma solicitação real do navegador, o que ajuda a evitar a deteção e o possível bloqueio pelas medidas anti-bot do eBay. Em seguida, enviaremos uma solicitação para a página de listagem para reunir os links de cada produto.


import requests
from lxml.html import fromstring

# Definir cabeçalhos para simular um navegador real
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',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    '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',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

# Parâmetros de pedido para a consulta de pesquisa
params = {
    '_nkw': 'laptop',
}

# Enviar um pedido à página de anúncios do eBay
listing_page_response = requests.get('https link', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)

Passo 2: Analisando a página de listagem

Na página de listagem, extrairemos os URLs de produtos individuais. Isso nos permite visitar cada página de produto para reunir detalhes específicos, como o título do produto, o preço e muito mais.


# Analisar a página de listagem para extrair links de produtos
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Saída de uma amostra das ligações encontradas
print("Product Links:", links[:5])  # Display the first five product links

Passo 3: raspagem de dados do produto

Com os URLs dos produtos em mãos, visitaremos cada página de produto e extrairemos os seguintes detalhes:

  • Título do produto;
  • Preço;
  • Custo de envio;
  • Condição do produto;
  • Quantidade disponível;
  • Quantidade vendida;
  • Opções de pagamento;
  • Política de devolução.

Em seguida, percorreremos cada link e usaremos expressões XPath para localizar as informações necessárias na página do produto.


product_data = []

for url in links:
    # Enviar um pedido para a página do produto
    product_page_response = requests.get(url, headers=headers)
    product_parser = fromstring(product_page_response.text)
    
    # Extrair dados utilizando XPath
    try:
        product_title = product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0]
        price = product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0]
        shipping_cost = product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        product_condition = product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0]
        available_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0]
        sold_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1]
        payment_options = ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label'))
        return_policy = product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        
        # Armazenar dados num dicionário
        product_info = {
            'Title': product_title,
            'Price': price,
            'Shipping Cost': shipping_cost,
            'Condition': product_condition,
            'Available Quantity': available_quantity,
            'Sold Quantity': sold_quantity,
            'Payment Options': payment_options,
            'Return Policy': return_policy,
        }
        product_data.append(product_info)
    
    except IndexError as e:
        print(f"An error occurred: {e}")

Passo 4: Guardar dados num ficheiro CSV

Depois de coletar os dados, podemos salvá-los em um arquivo CSV usando o Pandas.


import pandas as pd

# Converter dados em DataFrame
df = pd.DataFrame(product_data)

# Guardar em CSV
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Cuidando da limitação da taxa e contornando a deteção no eBay

O eBay emprega a limitação de taxa para evitar solicitações excessivas. Aqui estão alguns métodos para evitar a deteção:

  • Use Proxies: Faça uma rotação entre diferentes endereços IP.
  • Ajustar intervalos de solicitação: Implemente atrasos entre as solicitações.
  • Randomizar agentes de usuário: Varie a cadeia de caracteres do agente do usuário para evitar a deteção.

Seguindo essas práticas recomendadas, você pode minimizar o risco de ser bloqueado e continuar raspando dados com eficiência.

Código completo

Aqui está o código completo para raspar os dados do eBay e salvá-los em um arquivo CSV:


import requests
import random
from lxml.html import fromstring
import pandas as pd

useragents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36']

# Definir cabeçalhos para o pedido
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',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    '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',
    'user-agent': random.choice(useragents),
}

# Parâmetros de pesquisa
params = {'_nkw': 'laptop'}
proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Obter a página de listagem
listing_page_response = requests.get('https://www.ebay.com/sch/i.html', params=params, headers=headers, proxies=proxies)
listing_parser = fromstring(listing_page_response.text)
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Extrair dados do produto
product_data = []
for url in links:
    product_page_response = requests.get(url, headers=headers, proxies=proxies)
    product_parser = fromstring(product_page_response.text)
    try:
        product_info = {
            'Title': product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0],
            'Price': product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0],
            'Shipping Cost': product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0],
            'Condition': product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0],
            'Available Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0],
            'Sold Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1],
            'Payment Options': ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label')),
            'Return Policy': product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        }
        product_data.append(product_info)
    except IndexError:
        continue

# Guardar em CSV
df = pd.DataFrame(product_data)
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

A raspagem do eBay com Python permite a coleta eficiente de dados sobre produtos, preços e tendências. Neste guia, cobrimos a raspagem de listagens, a manipulação da paginação, a configuração de cabeçalhos e o uso de proxies para evitar a deteção. Lembre-se de respeitar os termos de serviço do eBay, usando intervalos de solicitação responsáveis e rotação de proxy. Com estas ferramentas, pode agora recolher e analisar facilmente os dados do eBay para obter informações sobre o mercado. Boa raspagem!

Comentários:

0 Comentários