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:
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.
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.
Nosso método simplifica o processo, concentrando-se em quatro funções principais:
É fundamental começar com as ferramentas certas. Você precisará de:
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
source env/bin/activate # No Windows, use: venv\Scripts\activate
pip install requests bs4
Neste exemplo, usaremos o Proxyscrape Residential Proxies rotativo para manter o anonimato e proteger o ip privado de ser colocado na lista negra.
Começamos importando as bibliotecas necessárias para este projeto scraping da Web, que incluem:
importar csv
importar tempo
importar solicitações
from bs4 import BeautifulSoup
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",
}
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)
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.
É 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}")
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!