A raspagem da Web é uma maneira poderosa de extrair dados de sites para diferentes fins, como análise, pesquisa e inteligência nos negócios. Este tutorial ajuda a extrair informações de produtos do Walmart em Python com foco nas principais estratégias e técnicas. O Walmart scraping apresenta um exemplo em que podemos extrair detalhes de produtos como nome, preço ou avaliações encontradas em várias páginas dos sites do Walmart.
Este guia usará a biblioteca requests para fazer solicitações HTTP e a biblioteca lxml para analisar o conteúdo HTML.
Antes de começarmos, certifique-se de que tem o Python instalado na sua máquina. Você pode instalar as bibliotecas necessárias usando pip:
pip install requests
pip install lxml
pip install urllib3
Em seguida, vamos importar as bibliotecas necessárias:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Lista de URLs de produtos do Walmart para raspar.
product_urls = [
'link with https',
'link with https',
'link with https'
]
Para fazer scrape de um sítio Web, é muito importante que se utilizem os cabeçalhos corretos, nomeadamente o cabeçalho User-Agent, de modo a imitar um pedido de um navegador real. Além disso, é possível evitar ser restringido devido a medidas anti-bot postas em prática pelos proprietários do sítio utilizando servidores proxy rotativos. Abaixo estão exemplos de cadeias de caracteres User-Agent, juntamente com uma descrição de como integrar servidores proxy que exigem autorização com base no endereço IP.
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 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
proxy = [
'<ip>:<port>',
'<ip>:<port>',
'<ip>:<port>',
]
Defina cabeçalhos para imitar as solicitações do navegador e evitar a deteção.
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',
'dnt': '1',
'priority': 'u=0, i',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'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',
}
Crie uma lista vazia para armazenar detalhes do produto.
product_details = []
O processo de enumeração das páginas URL funciona da seguinte forma: Para cada página URL, é enviado um pedido GET utilizando um User-Agent e um proxy selecionados aleatoriamente. Ao receber a resposta HTML, esta é analisada para extrair detalhes como o nome do produto, o preço e as avaliações. Os dados extraídos são armazenados como um dicionário, que é posteriormente anexado a uma lista que foi criada anteriormente.
for url in product_urls:
headers['user-agent'] = random.choice(user_agents)
proxies = {
'http': f'http://{random.choice(proxy)}',
'https': f'http://{random.choice(proxy)}',
}
try:
# Enviar um pedido HTTP GET para o URL
response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
print(response.status_code)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f'Error fetching data: {e}')
# Analisar o conteúdo HTML utilizando lxml
parser = html.fromstring(response.text)
# Extrair o título do produto
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Extrair o preço do produto
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# Extrair detalhes da revisão
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Armazenar detalhes extraídos num dicionário
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Anexar detalhes do produto à lista
product_details.append(product_detail)
Título:
Preço:
Detalhe da revisão:
with open('walmart_products.csv', 'w', newline='') as csvfile:
fieldnames = ['title', 'price', 'review_details']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for product_detail in product_details:
writer.writerow(product_detail)
Aqui está o código completo com comentários para o ajudar a compreender melhor:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()
# Lista de URLs de produtos a serem extraídos
product_urls = [
'link with https',
'link with https',
'link with https'
]
# Cadeias de caracteres User-Agent aleatórias para anonimato
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 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
# Lista de proxy para rotação de IP
proxy = [
'<ip>:<port>',
'<ip>:<port>',
'<ip>:<port>',
]
# Cabeçalhos para imitar os pedidos do browser
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',
'dnt': '1',
'priority': 'u=0, i',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'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',
}
# Inicializar uma lista vazia para armazenar os detalhes do produto
product_details = []
# Percorrer cada URL de produto
for url in product_urls:
headers['user-agent'] = random.choice(user_agents)
proxies = {
'http': f'http://{random.choice(proxy)}',
'https': f'http://{random.choice(proxy)}',
}
try:
# Enviar um pedido HTTP GET para o URL
response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
print(response.status_code)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f'Error fetching data: {e}')
# Analisar o conteúdo HTML utilizando lxml
parser = html.fromstring(response.text)
# Extrair o título do produto
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Extrair o preço do produto
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# Extrair detalhes da revisão
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Armazenar detalhes extraídos num dicionário
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Anexar detalhes do produto à lista
product_details.append(product_detail)
# Escrever os dados extraídos para um ficheiro CSV
with open('walmart_products.csv', 'w', newline='') as csvfile:
fieldnames = ['title', 'price', 'review_details']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for product_detail in product_details:
writer.writerow(product_detail)
O nosso tutorial demonstra como utilizar as bibliotecas Python para extrair dados de produtos do Walmart e guardá-los no formato CSV para análise posterior. O script fornecido é fundamental e oferece uma base que pode ser melhorada para aumentar a eficiência do processo de raspagem. As melhorias podem incluir a introdução de atrasos aleatórios entre os pedidos para imitar os padrões de navegação humana, a implementação da rotação do User-Agent e do proxy para evitar a deteção e o desenvolvimento de um sistema robusto de tratamento de erros para gerir potenciais interrupções ou falhas na recolha de dados.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentários: 0