Como acessar Scrape eBay em 2024: Um guia para iniciantes

Python, Como fazer, 21/11/20245 minutos de leitura

O eBay é um dos maiores mercados on-line do mundo, hospedando milhões de produtos em várias categorias. Scraping O eBay pode ser de grande valia para tarefas como:

  • Comparação de preços
  • Análise de mercado
  • Rastreamento de tendências de produtos

Neste guia, mostraremos como criar um script Python simples para pesquisar uma palavra-chave, extrair detalhes do produto, como título, preço, moeda, disponibilidade, resenhas e classificações, e salvar os dados em um arquivo CSV. Este tutorial é excelente para iniciantes que desejam aprender a usar a Web scraping da maneira correta, com dicas sobre como respeitar os termos de serviço e usar o proxies de forma responsável.

Não gostou da explicação? Aqui está o código completo

Se estiver procurando apenas a implementação completa, aqui está o script Python completo para scraping detalhes do produto do eBay usando proxies. Copie e cole-o em seu ambiente para começar:

import re
import csv
import time

import requests
from bs4 import BeautifulSoup

proxies = {
    "http": "http://username:[email protected]:6060",
    "https": "http://username:[email protected]:6060",
}

def get_product_information(product_url) -> dict:
    r = requests.get(product_url, proxies=proxies)
    soup = BeautifulSoup(r.text, features="html.parser")

    product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
    product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
    currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

    # locate the element that holds quanity number of product
    quantity_available = soup.find("div", {"class":"x-quantity__availability"})
    if quantity_available is not None:
        # Using regex check if we can locate the strings that holds this number
        regex_pattern = r"\d+\savailable"
        if re.search(regex_pattern, quantity_available.text) is not None:
            quantity_available = re.search(regex_pattern, quantity_available.text).group()
            # After string is located we extract the number by splitting it by space and selecting the first element.
            quantity_available = quantity_available.split(" ")[0]
        else:
            quantity_available = "NA"

    total_reviews = soup.find("span", {"class":"ux-summary__count"})
    if total_reviews is not None:
        total_reviews = total_reviews.text.split(" ")[0]
    else:
        total_reviews = "NA"

    rating = soup.find("span", {"class":"ux-summary__start--rating"})
    if rating is not None:
        rating = rating.text
    else:
        rating = "NA"

    product_info = {
        "product_url": product_url,
        "title": product_title,
        "product_price": product_price,
        "currency": currency,
        "availability": quantity_available,
        "nr_reviews": total_reviews,
        "rating": rating
    }

    return product_info

def save_to_csv(products, csv_file_name="products.csv"):

    # Write the list of dictionaries to a CSV file
    with open(csv_file_name, mode='w', newline='') as csv_file:
        # Create a csv.DictWriter object
        writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

        # Write the header (keys of the dictionary)
        writer.writeheader()

        # Write the rows (values of the dictionaries)
        writer.writerows(products)

    print(f"Data successfully written to {csv_file_name}")

def main(keyword_to_search: str):
    products = []

    r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

    soup = BeautifulSoup(r.text, features="html.parser")
    for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
        item_url = item.find("a").get("href")

        product_info: dict = get_product_information(item_url)
        print(product_info)
        # Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
        time.sleep(2)

        products.append(product_info)
    # save data to csv
    save_to_csv(products)


if __name__ == '__main__':
    keywords = "laptop bag"
    main(keywords)

Lembre-se de atualizar a variável proxies com um novo nome de usuário e senha antes de usá-los.

Como faremos Scrape eBay

Nosso método simplifica o processo, concentrando-se em quatro funções principais:

  • Pesquisando uma palavra-chave: Descubra produtos inserindo um termo de pesquisa (por exemplo, "bolsas para laptop") para buscar itens relevantes.
  • Extração de URLs de produtos: Colete URLs de produtos listados na primeira página do resultado da pesquisa para simplificar a coleta de dados.
  • Extração de informações sobre o produto: Para cada URL de produto, navegaremos até a página do produto para recuperar informações vitais.
  • Salvamento de dados: Salve os dados extraídos em um arquivo CSV para acesso e análise eficientes.

Pré-requisitos

É fundamental começar com as ferramentas certas. Você precisará de:

Instalar o Python:

Configure seu ambiente de desenvolvimento:

  • Selecione o diretório em que deseja colocar o projeto. Configure um ambiente virtual para manter as dependências limpas e isoladas.
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
source env/bin/activate # No Windows, use: venv\Scripts\activate
pip install requests bs4

Proxies Instalação:

Neste exemplo, usaremos o Proxyscrape Residential Proxies rotativo para manter o anonimato e proteger o ip privado de ser colocado na lista negra.

Explicação do script

Etapa 1: Importação de bibliotecas e Proxies

Começamos importando as bibliotecas necessárias para este projeto scraping da Web, que incluem:

  • CSV: esse módulo fornece classes para ler e gravar dados tabulares no formato CSV. Ele permite que os programadores gravem facilmente dados no formato preferido do Excel ou leiam dados de arquivos gerados pelo Excel sem conhecer os detalhes precisos do formato CSV.
  • Requests: esse módulo permite que você envie solicitações HTTP usando Python.
  • O BeautifulSoup4 é um analisador de html avançado, projetado para extrair as informações de que você precisa de uma estrutura html.

Importações necessárias:

importar csv
importar tempo
importar solicitações
from bs4 import BeautifulSoup

Proxy Instalação:

Para manter seu IP privado e, assim, minimizar as chances de ter seu IP colocado na lista negra de sites específicos, é recomendável realizar atividades na Web scraping sob a proteção de proxies. Como mencionado acima, usaremos o Proxyscrape Residential Proxies rotativo para este tutorial, mas você pode usar outro proxies ou nenhum proxies .

proxies = {
   "http": "http://username:[email protected]:6060",
   "https": "http://username:[email protected]:6060",
}

Etapa 2: Obtendo resultados de pesquisa

Vamos começar explicando o processo de pesquisa que usaremos neste tutorial. Consultaremos o URL do eBay com a palavra-chave "laptop bag" (bolsa para laptop), conforme mostrado nesta figura:

Usaremos o URL consultado para enviar uma solicitação com request.get(). Quando recebermos uma resposta, analisaremos o conteúdo HTML usando o BeautifulSoup (bs4) para extrair o URL de cada produto. A imagem abaixo mostra onde o URL de cada produto está localizado no HTML.

O link do produto é encontrado em um <div> com o elemento classe s-item__info clearfix. Para extrair esses links, usamos BeautifulSoup (bs4) para pesquisar todos os <div> elementos com essa classe específica. Depois de localizarmos esses elementos, iteramos em cada um deles para encontrar <a> e extrair os elementos href que contém o URL do produto.

def main(keyword_to_search: str):
   products = []

   r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

   soup = BeautifulSoup(r.text, features="html.parser")
   for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
       item_url = item.find("a").get("href")

       product_info: dict = get_product_information(item_url)
		# Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
       time.sleep(1)

       products.append(product_info)
   # save data to csv
   save_to_csv(products)

Etapa 3: Extração de informações sobre o produto

Apresentando o get_product_information função. Essa função recebe a URL de um produto como entrada, envia uma solicitação a essa URL e, em seguida, utiliza o BeautifulSoup (bs4) para analisar as informações do produto usando regras específicas e padrões regex.

def get_product_information(product_url) -> dict:
   r = requests.get(product_url, proxies=proxies)
   soup = BeautifulSoup(r.text, features="html.parser")

   product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
   product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
   currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

   # locate the element that holds quanity number of product
   quantity_available = soup.find("div", {"class":"x-quantity__availability"})
   if quantity_available is not None:
       # Using regex check if we can locate the strings that holds this number
       regex_pattern = r"\d+\savailable"
       if re.search(regex_pattern, quantity_available.text) is not None:
           quantity_available = re.search(regex_pattern, quantity_available.text).group()
           # After string is located we extract the number by splitting it by space and selecting the first element.
           quantity_available = quantity_available.split(" ")[0]
       else:
           quantity_available = "NA"

   total_reviews = soup.find("span", {"class":"ux-summary__count"})
   if total_reviews is not None:
       total_reviews = total_reviews.text.split(" ")[0]
   else:
       total_reviews = "NA"

   rating = soup.find("span", {"class":"ux-summary__start--rating"})
   if rating is not None:
       rating = rating.text
   else:
       rating = "NA"

   product_info = {
       "product_url": product_url,
       "title": product_title,
       "product_price": product_price,
       "currency": currency,
       "availability": quantity_available,
       "nr_reviews": total_reviews,
       "rating": rating
   }

   return product_info

Por fim, organizamos as entidades de produto analisadas em um dicionário, que é então retornado pela função.

Etapa 4: Salvando resultados

É hora de armazenar esses resultados em um arquivo CSV usando a função nativa do Python csv biblioteca. O save_to_csv(products) A função aceita produtos como entrada, que é uma lista de dicionários contendo detalhes do produto, conforme descrito anteriormente. Esses dados são então salvos em um arquivo CSV com o nome do csv_file_name que tem como padrão "products.csv".

def save_to_csv(products, csv_file_name="products.csv"):

   # Write the list of dictionaries to a CSV file
   with open(csv_file_name, mode='w', newline='') as csv_file:
       # Create a csv.DictWriter object
       writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

       # Write the header (keys of the dictionary)
       writer.writeheader()

       # Write the rows (values of the dictionaries)
       writer.writerows(products)

   print(f"Data successfully written to {csv_file_name}")

Conclusão

Neste tutorial, demonstramos como scrape o eBay criando um script Python que pesquisa uma palavra-chave, extrai detalhes do produto e salva os dados em um arquivo CSV. Esse processo destaca técnicas scraping essenciais, como a manipulação de elementos HTML, o uso de proxies para anonimato e o respeito às práticas scraping éticas. Esse script pode ser aprimorado incorporando a funcionalidade de paginação e a capacidade de processar várias palavras-chave.

Lembre-se sempre de usar o scrape com responsabilidade, aderir aos termos de serviço do site e usar ferramentas como limitação de taxa para evitar interrupções. Para tornar suas tarefas scraping mais confiáveis e eficientes, considere explorar nossos serviços proxy de alta qualidade em ProxyScrape. Não importa se você precisa de um proxies residencial, de data center ou móvel, temos o que você precisa. Confira nossas ofertas para levar seus projetos de scraping web para o próximo nível!

Feliz scraping!