Scrapy: Web Scraping com Python – Guia Completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Scrapy e para que serve

Scrapy é um poderoso framework assíncrono para web scraping em Python, projetado para coleta de dados em alta performance e escala. Ele automatiza a extração de informações estruturadas de páginas web, sendo essencial para análise de dados, monitoramento de preços, raspagem de notícias e muitas outras aplicações.

Principais recursos e vantagens do Scrapy

Arquitetura assíncrona

Construído sobre a biblioteca Twisted, o Scrapy oferece processamento assíncrono de requisições, garantindo alta performance mesmo ao lidar com milhares de páginas simultaneamente, sem bloquear a execução do programa.

Flexibilidade na extração de dados

O framework suporta diversos métodos de extração:

  • Seletores CSS para seleção simples de elementos
  • Seletores XPath para consultas mais complexas
  • Expressões regulares para extração precisa
  • Suporte a formatos JSON e XML

Escalabilidade e desempenho

Projetado para projetos de qualquer porte — de scripts simples a soluções industriais. Recursos internos de cache, processamento paralelo e gerenciamento de memória garantem estabilidade mesmo ao processar milhões de páginas.

Extensibilidade via middleware

O sistema de middleware permite estender facilmente as funcionalidades do framework, adicionando lógica personalizada para tratamento de requisições e respostas, gerenciamento de cabeçalhos, uso de proxies e muito mais.

Instalação e configuração do Scrapy

Instalando o framework

pip install scrapy

Para trabalhar com formatos de dados adicionais, recomenda-se instalar os pacotes extras:

pip install scrapy[all]

Criando um novo projeto

scrapy startproject meuprojeto
cd meuprojeto

Criando um spider

scrapy genspider exemplo exemplo.com

Estrutura de um projeto Scrapy

Após criar o projeto, a estrutura de diretórios gerada é:

meuprojeto/
├── meuprojeto/
│   ├── __init__.py
│   ├── items.py          # Definição da estrutura dos dados
│   ├── middlewares.py    # Middleware para requisições/respostas
│   ├── pipelines.py      # Processamento e salvamento dos dados
│   ├── settings.py       # Configurações do projeto
│   └── spiders/          # Diretório com os spiders
│       ├── __init__.py
│       └── exemplo.py
└── scrapy.cfg           # Arquivo de configuração do projeto

Função dos principais arquivos

  • spiders/ - contém a lógica de raspagem e extração de dados
  • items.py - define a estrutura dos dados a serem extraídos
  • pipelines.py - processa e salva os dados extraídos
  • middlewares.py - configura o tratamento de requisições e respostas
  • settings.py - contém todas as configurações do projeto

Criando e configurando um spider

Spider básico

import scrapy

class ExemploSpider(scrapy.Spider):
    name = "exemplo"
    allowed_domains = ["exemplo.com"]
    start_urls = ["https://exemplo.com"]

    def parse(self, response):
        # Extração de dados
        titulo = response.css('title::text').get()
        
        # Retorno dos dados
        yield {
            'titulo': titulo,
            'url': response.url,
            'status': response.status
        }

Spider avançado com navegação

import scrapy

class SpiderAvancado(scrapy.Spider):
    name = "avancado"
    start_urls = ["https://exemplo.com"]

    def parse(self, response):
        # Extrair links de produtos
        for link in response.css('a.produto::attr(href)').getall():
            yield response.follow(link, self.parse_produto)
        
        # Paginação
        proxima_pagina = response.css('a.proxima::attr(href)').get()
        if proxima_pagina:
            yield response.follow(proxima_pagina, self.parse)

    def parse_produto(self, response):
        yield {
            'nome': response.css('h1::text').get(),
            'preco': response.css('.preco::text').get(),
            'descricao': response.css('.descricao::text').get()
        }

Recommendations