Como salvar as informações extraídas?
Para salvar as informações extraídas, é essencial entender um pouco sobre os formatos usados para armazenar os resultados:
CSV - Um dos formatos mais populares para armazenar dados tabulares. É um arquivo de texto em que cada linha corresponde a um único registro, e os valores são separados por vírgulas. As vantagens desse formato incluem: suporte pela maioria dos aplicativos de processamento de dados, inclusive o Excel; facilidade de leitura e edição usando editores de texto. Desvantagens: recursos limitados para armazenar estruturas de dados complexas (por exemplo, dados aninhados); problemas com o escape de vírgulas e caracteres especiais.
JSON - Formato de intercâmbio de dados baseado em texto, conveniente para representar dados estruturados. É amplamente usado no desenvolvimento da Web. Prós: suporta estruturas de dados aninhadas e hierárquicas; bem suportado pela maioria das linguagens de programação; facilmente legível por humanos e máquinas. O JSON é adequado para armazenar dados que talvez precisem ser transmitidos por meio de APIs. Contras: os arquivos JSON podem ser maiores em comparação com o CSV; o processamento pode ser mais lento devido à sua estrutura mais complexa.
XLS - Projetado para planilhas do Excel, ele armazena dados sobre células, formatação e fórmulas. É comumente usado para armazenar bancos de dados. Para trabalhar com XLS em Python, você precisa de bibliotecas de terceiros, como a pandas. Esse formato permite o armazenamento de dados em um formato legível e apresentável. A principal desvantagem é a necessidade de bibliotecas adicionais, o que pode aumentar a carga do servidor e o tempo de processamento de dados.
XML - Uma linguagem de marcação usada para armazenar e transmitir dados. Oferece suporte a estruturas e atributos aninhados. Prós: estruturada; permite o armazenamento de estruturas de dados complexas; bem suportada por vários padrões e sistemas. Contras: os arquivos XML podem ser volumosos e de processamento complexo; o processamento de XML pode ser lento devido à sua estrutura.
Bancos de dados são usados para armazenar grandes volumes de dados estruturados. Os exemplos incluem MySQL, PostgreSQL, MongoDB e SQLite. Prós: suporta grandes volumes de dados e acesso rápido; fácil de organizar e relacionar dados; suporta transações e recuperação de dados. Contras: requer esforço extra para configuração e manutenção.
Para nossos raspadores, escolheremos o formato CSV porque os dados extraídos são tabulares (texto de citação e autor, nomes de produtos e links) e o volume de dados é relativamente pequeno, sem estruturas aninhadas. Informações adicionais sobre como ler e gravar nesse formato podem ser encontradas aqui. Adicionaremos a importação de CSV ao nosso código de cotação, criaremos um objeto escritor e gravaremos os dados da cotação (as próprias cotações e seus autores):
with open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(['Quote', 'Author']) for quote in quotes[:3]: text = quote.select_one('.text').get_text(strip=True) author = quote.select_one('.author').get_text(strip=True) csvwriter.writerow([text, author])
Também adicionaremos saídas adicionais do console e tratamento de erros:
print("Data successfully written to quotes.csv") except requests.RequestException as e: print(f'Error requesting the page: {e}') except Exception as e: print(f'An error occurred: {e}')
Aqui está o código completo atualizado:
import requests from bs4 import BeautifulSoup import csv # URL da página de destino url = 'https://quotes.toscrape.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/128.0.6613.85 Safari/537.36' } try: # Envie uma solicitação GET para a página com o agente do usuário response = requests.get(url, headers=headers) response.raise_for_status() # Verifique se há erros de HTTP # Crie um objeto BeautifulSoup para analisar o HTML soup = BeautifulSoup(response.text, 'html.parser') # Encontre todos os blocos com aspas quotes = soup.select('.quote') # Abra o arquivo CSV para gravação com open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile: # Crie um objeto escritor csvwriter = csv.writer(csvfile) # Escreva cabeçalhos csvwriter.writerow(['Quote', 'Author']) # Escreva dados de citação for quote in quotes[:3]: # Extrair o texto da citação text = quote.select_one('.text').get_text(strip=True) # Extrair o nome do autor author = quote.select_one('.author').get_text(strip=True) # Gravar no arquivo CSV csvwriter.writerow([text, author]) print("Data successfully written to quotes.csv") except requests.RequestException as e: print(f'Erro ao solicitar a página: {e}') except Exception as e: print(f'Ocorreu um erro: {e}')
Realizaremos ações semelhantes com o segundo raspador:
from playwright.sync_api import sync_playwright import csv # URL da página de destino url = 'https://parsemachine.com/sandbox/catalog/' def scrape_with_playwright(): try: with sync_playwright() as p: # Inicia o navegador Chromium browser = p.chromium.launch(headless=False) # Altera para True para o modo headless try: # Abra uma nova guia page = browser.new_page() # Navegue até a página de destino page.goto(url) # Encontre todos os cartões de produto product_cards = page.query_selector_all('.card.product-card') # Abra o arquivo CSV para gravação com open('products.csv', 'w', newline='', encoding='utf-8') as csvfile: # Crie um objeto escritor csvwriter = csv.writer(csvfile) # Escreva cabeçalhos csvwriter.writerow(['Title', 'Link']) # Extraia dados dos cartões de produtos e escreva no CSV for card in product_cards: # Extraia o título do produto title_tag = card.query_selector('.card-title .title') title = title_tag.inner_text() if title_tag else 'Nenhum título disponível' # Link para a página do produto product_link = title_tag.get_attribute('href') if title_tag else 'Nenhum link disponível' # Se o link for relativo, adicione o URL de base if product_link and not product_link.startswith('http'): product_link = f'https://parsemachine.com{product_link}' # Grava os dados no arquivo CSV csvwriter.writerow([title, product_link]) # Imprime as informações do produto print(f'Title: {title}, Link: {product_link}') print("Data successfully written to products.csv") except Exception as e: print(f'Error working with Playwright: {e}') finally: # Feche o navegador browser.close() print("Browser closed.") except Exception as e: print(f'Error launching Playwright: {e}') scrape_with_playwright()
Obstáculos na raspagem da Web
Estrutura complexa e variável do site: Um dos obstáculos mais comuns na raspagem da Web é a estrutura variável do site e a ofuscação do código. Mesmo pequenas alterações na marcação HTML ou na estrutura da página podem fazer com que os scripts de raspagem parem de funcionar. Isso pode exigir atualizações frequentes do código para se adaptar às novas alterações.
Limites de solicitação: Muitos sites têm limites para o número de solicitações que podem ser enviadas em um determinado período de tempo. Se suas solicitações excederem os limites definidos, seu endereço IP poderá ser temporariamente bloqueado.
Bloqueio de IPs: Os sites podem bloquear endereços IP que eles identificam como suspeitos ou excessivamente ativos, o que pode ser um obstáculo significativo para a raspagem. Nesse caso, podem ser necessários servidores proxy de qualidade para contornar esses bloqueios.
CAPTCHA: Muitos recursos da Web implementam medidas de proteção na forma de CAPTCHAs para impedir ações automatizadas. O CAPTCHA requer entrada manual ou o uso de serviços especializados para ser contornado.
Um dos melhores serviços atualmente é o CapMonster Cloud - sua API permite fácil integração ao código para contornar o CAPTCHA e continuar a operação do scraper. É fácil de conectar e oferece soluções rápidas para vários tipos de CAPTCHAs com o mínimo de erros - suporta reCAPTCHA, DataDome, Amazon CAPTCHA e outros. O CapMonster Cloud pode ser considerado uma ótima opção como ferramenta auxiliar e parte importante do processo de raspagem da Web.
Recomendações para uma raspagem bem-sucedida
- Use proxy e rotação de agente de usuário: Para evitar o bloqueio de IP e contornar os limites de solicitação, isso ajuda a imitar solicitações de vários dispositivos e navegadores.
- Adicione tratamento de erros e novas tentativas: Uma página da Web pode estar temporariamente indisponível ou uma solicitação pode falhar. Um mecanismo de repetição e tratamento de erros ajudará a garantir que seu script seja resistente a essas situações e evitará que o processo de raspagem seja interrompido.
- Revisar o arquivo robots.txt do site: Esse arquivo contém diretrizes para os bots sobre quais partes do site podem ou não ser rastreadas. Seguir essas recomendações ajuda a evitar problemas legais e conflitos com os proprietários do site.
- Introduza atrasos aleatórios entre as solicitações: para evitar atividades suspeitas e reduzir a probabilidade de bloqueio.
Essas recomendações ajudarão seu script a imitar o comportamento de um usuário real, reduzindo assim a chance de detecção.
Conclusão
Em resumo, a raspagem da Web em Python é um dos métodos mais populares para coletar dados de vários sites com eficiência. Discutimos como escolher as ferramentas certas para raspagem da Web, o processo de instalação do Python e das bibliotecas necessárias, além de escrever o código para extrair dados e salvar os resultados em formatos convenientes. Com a abordagem passo a passo descrita neste artigo, até mesmo um desenvolvedor novato pode dominar as técnicas básicas de raspagem da Web e criar seus primeiros scripts de raspagem. A raspagem da Web abre oportunidades significativas para análise de dados, coleta de informações, monitoramento de mercado e muitas outras tarefas. É essencial continuar aprendendo novas ferramentas e técnicas para permanecer relevante nesse campo em constante evolução.
Ao usar bibliotecas e ferramentas como BeautifulSoup, requests, Selenium, Playwright e outras mencionadas neste guia, você pode extrair informações de sites estáticos e dinâmicos. Ao trabalhar com raspagem da Web, é importante considerar os aspectos legais e éticos, bem como estar preparado para contornar vários obstáculos, como CAPTCHA ou carregamento de conteúdo dinâmico.
Cada uma das ferramentas e abordagens discutidas tem suas vantagens e limitações. A escolha da ferramenta certa depende das especificidades da tarefa, da complexidade das páginas da Web e do volume de dados. Para uma raspagem eficaz da Web, é fundamental compreender as características das páginas da Web com as quais você está trabalhando.
Esperamos que essas instruções o ajudem a entender melhor o processo de raspagem da Web e forneçam o conhecimento básico necessário para criar seus próprios raspadores. Boa sorte com seus projetos de coleta e análise de dados!
Nota: Gostaríamos de lembrá-lo de que o produto é usado para automatizar testes em seus próprios sites e em sites aos quais você tem acesso legal.