Importando Configurações no Scrapy
A gestão e importação de parâmetros de configuração são aspectos cruciais no desenvolvimento de um crawler Scrapy. Em vez de recorrer a importações diretas e pouco idiomáticas como from scrapy import settings, o Scrapy oferece mecanismos mais elegantes para acessar as configurações definidas em settings.py.
Uso de from_crawler para Componentes
Para componentes Scrapy como middlewares, extensions, ou item pipelines, o método de classe from_crawler é a forma recomendada de injetar configurações. Este método recebe uma instância de Crawler, que por sua vez contém o objeto settings.
class MeuComponente:
def __init__(self, parametro_customizado):
self.parametro_customizado = parametro_customizado
@classmethod
def from_crawler(cls, crawler):
# Acessa as configurações do projeto através do objeto crawler
valor_config = crawler.settings.get('MINHA_CONFIG_CHAVE')
return cls(valor_config)
# Exemplo de uso (geralmente gerenciado internamente pelo Scrapy):
# crawler = ... # Instância de Crawler
# componente = MeuComponente.from_crawler(crawler)
Um padrão comum observado em algumas implementações oficiais é a separação da lógica de extração de configurações em um método from_settings, que é então chamado por from_crawler. Isso promove maior modularidade e testabilidade.
class OutroComponente:
def __init__(self, valor_propriedade):
self.valor_propriedade = valor_propriedade
@classmethod
def from_settings(cls, settings):
# Lógica para extrair configurações específicas
config_data = settings.get('OUTRA_CHAVE_CONFIG')
return cls(config_data)
@classmethod
def from_crawler(cls, crawler):
# Simplesmente delega a inicialização para from_settings
return cls.from_settings(crawler.settings)
Acessando Configurações em Spiders e Arquivos Customizados
Nem todas as classes dentro de um projeto Scrapy, como as próprias spiders ou módulos utilitários personalizados, têm acesso direto ao método from_crawler. Para esses casos, o Scrapy fornece uma função utilitária que carrega todas as configurações do projeto:
from scrapy.utils.project import get_project_settings
# Carrega todas as configurações do arquivo settings.py
configuracoes_do_projeto = get_project_settings()
# Agora você pode acessar qualquer parâmetro:
# delay = configuracoes_do_projeto.get('DOWNLOAD_DELAY')
# user_agent = configuracoes_do_projeto.get('USER_AGENT')
O objeto configuracoes_do_projeto funciona como um dicionário, contendo todos os parâmetros definidos ou sobrescritos em settings.py.
Parâmetros de Configuração Essenciais
O Scrapy possui uma vasta gama de configurações. Abaixo estão alguns dos parâmetros mais frequentemente ajustados em settings.py:
CONCURRENT_ITEMS: Limita o número máximo de itens que são processados em paralelo pelos pipelines. O valor padrão é100.CONCURRENT_REQUESTS: Define o número máximo de requisições que o downloader do Scrapy pode executar simultaneamente. O padrão é16.DOWNLOAD_DELAY: Especifica o tempo, em segundos, que o downloader deve aguardar antes de baixar páginas consecutivas do mesmo website. Por padrão, o Scrapy adiciona um atraso aleatório entre0.5 * DOWNLOAD_DELAYe1.5 * DOWNLOAD_DELAY. Pode ser fixado definindoRANDOMIZE_DOWNLOAD_DELAYcomoFalse.CONCURRENT_REQUESTS_PER_DOMAIN: O número máximo de requisições simultâneas para o mesmo domínio. O padrão é8.CONCURRENT_REQUESTS_PER_IP: O número máximo de requisições simultâneas para o mesmo endereço IP. Se diferente de zero, este parâmetro substituiCONCURRENT_REQUESTS_PER_DOMAIN, eDOWNLOAD_DELAYé aplicado por IP.DEFAULT_ITEM_CLASS: A classe de item padrão usada ao executar o comandoscrapy shell. O padrão é'scrapy.item.Item'.DEPTH_LIMIT: O limite máximo de profundidade que o crawler pode atingir. Zero ouNonesignifica sem limite.DEPTH_PRIORITY: Controla se a varredura é em amplitude (BFS, valor positivo) ou profundidade (DFS, valor negativo). A prioridade da requisição é ajustada com a fórmularequest.priority = request.priority - (depth * DEPTH_PRIORITY).COOKIES_ENABLED: Habilita ou desabilita o middleware de cookies, que gerencia automaticamente os cookies. PadrãoTrue.COOKIES_DEBUG: Se ativado, Scrapy loga todos os cookies enviados em requisições e recebidos em respostas.DOWNLOADER_MIDDLEWARES: Um dicionário de middlewares do downloader e suas prioridades.DEFAULT_REQUEST_HEADERS: Um dicionário de cabeçalhos HTTP padrão que serão enviados com todas as requisições Scrapy.DUPEFILTER_CLASS: A classe usada para filtrar requisições duplicadas. Pode ser substituída por uma implementação de filtro Bloom, por exemplo.LOG_ENABLED: Habilita ou desabilita o sistema de logging do Scrapy. PadrãoTrue.LOG_FILE: O caminho para o arquivo onde os logs serão escritos. SeNone, os logs são enviados para a saída padrão.LOG_FORMAT: A string de formatação para as mensagens de log.LOG_DATEFORMAT: A string de formatação para a data/hora usada noLOG_FORMAT.LOG_LEVEL: O nível mínimo de log a ser exibido (CRITICAL, ERROR, WARNING, INFO, DEBUG). O padrão éDEBUG.LOG_STDOUT: SeTrue, toda a saída padrão (e erros) será redirecionada para o sistema de log.LOG_SHORT_NAMES: SeTrue, os logs exibem apenas o caminho raiz do módulo; seFalse, o componente responsável pela saída de log completa é mostrado.LOGSTATS_INTERVAL: O intervalo, em segundos, entre cada log de estatísticas de rastreamento.MEMDEBUG_ENABLED: Ativa o depurador de memória do Scrapy.REDIRECT_MAX_TIMES: O número máximo de vezes que uma requisição pode ser redirecionada.REDIRECT_PRIORITY_ADJUST: Ajusta a prioridade de requisições redirecionadas. Valores positivos aumentam a prioridade.RETRY_PRIORITY_ADJUST: Ajusta a prioridade de requisições que serão retentadas.ROBOTSTXT_OBEY: Indica se o crawler deve respeitar o protocolorobots.txt.SCRAPER_SLOT_MAX_ACTIVE_SIZE: Um limite flexível, em bytes, para o tamanho total dos dados de resposta que estão sendo processados. Se excedido, o Scrapy pausa novas requisições.SPIDER_MIDDLEWARES: Um dicionário de middlewares de spider e suas prioridades.USER_AGENT: O User-Agent padrão a ser usado em todas as requisições HTTP.
Personalizando o Modelo settings.py
Para otimizar o fluxo de trabalho e evitar a constante consulta de documentação para cada novo projeto, é altamente recomendável modificar o arquivo de modelo padrão settings.py gerado pelo comando scrapy startproject.
Você pode incluir comentários descritivos e os parâmetros mais comuns diretamente nesse modelo. Assim, ao iniciar um novo projeto, o settings.py já estará populado com as configurações e explicações relevantes, facilitando a rápida customização. O arquivo de modelo está geralmente localizado em Lib/site-packages/scrapy/templates/project/module/settings.py dentro do seu ambiente Python.
Abaixo, uma lista estendida de configurações, com comentários traduzidos e reescritos para clareza:
# Nome do projeto Scrapy
BOT_NAME = '$project_name'
# Módulos onde as spiders serão procuradas
SPIDER_MODULES = ['$project_name.spiders']
NEWSPIDER_MODULE = '$project_name.spiders'
# O número máximo de itens processados em paralelo por cada pipeline (por resposta).
# CONCURRENT_ITEMS = 100
# O número máximo de requisições simultâneas que o downloader do Scrapy executará.
CONCURRENT_REQUESTS = 8
# O atraso (em segundos) que o downloader deve aguardar antes de buscar páginas consecutivas do mesmo site.
# Um valor de 0 significa sem atraso. Por padrão, o Scrapy usa um atraso aleatório.
# DOWNLOAD_DELAY = 0
# O número máximo de requisições simultâneas que serão executadas para qualquer domínio individual.
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
# O número máximo de requisições simultâneas que serão executadas para qualquer IP individual.
# Se for diferente de zero, CONCURRENT_REQUESTS_PER_DOMAIN é ignorado, e DOWNLOAD_DELAY aplica-se por IP.
# CONCURRENT_REQUESTS_PER_IP = 16
# A classe de item padrão a ser usada para instanciar itens no Scrapy shell.
# DEFAULT_ITEM_CLASS = 'scrapy.item.Item'
# A profundidade máxima permitida para o rastreamento em qualquer site. Zero significa sem limite.
# DEPTH_LIMIT = 0
# Controla a ordem de exploração: positivo para BFS (largura), negativo para DFS (profundidade).
# A prioridade da requisição é calculada como: request.priority = request.priority - (depth * DEPTH_PRIORITY).
# DEPTH_PRIORITY = 0
# Habilita ou desabilita o middleware de cookies (gerenciamento automático de cookies).
COOKIES_ENABLED = False
# Se ativado, Scrapy registrará todos os cookies enviados (cabeçalho Cookie) e recebidos (cabeçalho Set-Cookie).
# COOKIES_DEBUG = False
# Habilita ou desabilita a coleta de estatísticas detalhadas de profundidade de rastreamento.
# DEPTH_STATS_VERBOSE = False
# Habilita ou desabilita o cache DNS em memória.
# DNSCACHE_ENABLED = True
# O tamanho máximo do cache DNS em memória.
# DNSCACHE_SIZE = 10000
# O tempo limite (em segundos) para o processamento de consultas DNS. Suporta valores flutuantes.
# DNS_TIMEOUT = 60
# A classe do downloader usada para o rastreamento.
# DOWNLOADER = 'scrapy.core.downloader.Downloader'
# Desativa o Console Telnet (ativado por padrão).
# TELNETCONSOLE_ENABLED = False
# Um dicionário de middlewares do downloader ativados em seu projeto e suas ordens de execução.
# DOWNLOADER_MIDDLEWARES = {}
# Cabeçalhos padrão para as requisições HTTP do Scrapy, preenchidos pelo DefaultHeadersMiddleware.
DEFAULT_REQUEST_HEADERS = {
# Exemplo: 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# Exemplo: 'Accept-Language': 'en',
}
# Dicionário dos middlewares do downloader padrão ativados no Scrapy.
# Valores mais baixos estão mais próximos do motor, valores mais altos estão mais próximos do downloader.
# Não modifique esta configuração diretamente, use DOWNLOADER_MIDDLEWARES para adicionar ou substituir.
# DOWNLOADER_MIDDLEWARES_BASE = {
# 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
# 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
# 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
# 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
# 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
# 'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
# 'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
# 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
# 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
# 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
# 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
# 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
# 'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
# 'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
# }
# Habilita ou desabilita a coleta de estatísticas do downloader.
# DOWNLOADER_STATS = True
# Dicionário de handlers de download de requisições ativados em seu projeto.
# DOWNLOAD_HANDLERS = {}
# Dicionário padrão de handlers de download de requisições.
# Para desativar um handler (ex: FTP), defina DOWNLOAD_HANDLERS = {'ftp': None}.
# DOWNLOAD_HANDLERS_BASE = {
# 'file': 'scrapy.core.downloader.handlers.file.FileDownloadHandler',
# 'http': 'scrapy.core.downloader.handlers.http.HTTPDownloadHandler',
# 'https': 'scrapy.core.downloader.handlers.http.HTTPDownloadHandler',
# 's3': 'scrapy.core.downloader.handlers.s3.S3DownloadHandler',
# 'ftp': 'scrapy.core.downloader.handlers.ftp.FTPDownloadHandler',
# }
# O tempo limite (em segundos) do downloader para baixar uma resposta.
# DOWNLOAD_TIMEOUT = 180
# O tamanho máximo da resposta (em bytes) que o downloader aceitará. Zero ou None para sem limite (padrão 1GB).
# DOWNLOAD_MAXSIZE = 1073741824
# O tamanho da resposta (em bytes) a partir do qual o downloader começará a emitir avisos.
# DOWNLOAD_WARNSIZE = 33554432
# Se o downloader deve gerar uma exceção ResponseFailed([_DataLoss]) se o Content-Length declarado
# não corresponder ao conteúdo real enviado pelo servidor.
# DOWNLOAD_FAIL_ON_DATALOSS = True
# A classe usada para detectar e filtrar requisições duplicadas.
# DUPEFILTER_CLASS = 'scrapy.dupefilters.RFPDupeFilter'
# Por padrão, o RFPDupeFilter registra apenas a primeira requisição duplicada.
# Defina DUPEFILTER_DEBUG como True para registrar todas as requisições duplicadas.
# DUPEFILTER_DEBUG = False
# Um dicionário de extensões ativadas em seu projeto e suas ordens de execução.
# EXTENSIONS = {}
# Um dicionário de extensões padrão disponíveis no Scrapy e suas ordens de execução.
# EXTENSIONS_BASE = {
# 'scrapy.extensions.corestats.CoreStats': 0,
# 'scrapy.extensions.telnet.TelnetConsole': 0,
# 'scrapy.extensions.memusage.MemoryUsage': 0,
# 'scrapy.extensions.memdebug.MemoryDebugger': 0,
# 'scrapy.extensions.closespider.CloseSpider': 0,
# 'scrapy.extensions.feedexport.FeedExporter': 0,
# 'scrapy.extensions.logstats.LogStats': 0,
# 'scrapy.extensions.spiderstate.SpiderState': 0,
# 'scrapy.extensions.throttle.AutoThrottle': 0,
# }
# Um dicionário de pipelines de itens a serem usados e suas ordens de execução.
# Os valores são arbitrários, mas geralmente definidos entre 0 e 1000. Valores menores têm maior prioridade.
# ITEM_PIPELINES = {}
# Habilita ou desabilita o logging.
# LOG_ENABLED = True
# A codificação usada para o output do log.
# LOG_ENCODING = 'utf-8'
# O nome do arquivo para o output do log. Se None, o log vai para stdout.
# LOG_FILE = None
# A string de formato para as mensagens de log.
# LOG_FORMAT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
# A string de formato para a data/hora, usada para o placeholder asctime em LOG_FORMAT.
# LOG_DATEFORMAT = '%Y-%m-%d %H:%M:%S'
# A classe usada para formatar mensagens de log de diferentes operações.
# LOG_FORMATTER = "scrapy.logformatter.LogFormatter"
# O nível mínimo de log a ser registrado (CRITICAL, ERROR, WARNING, INFO, DEBUG).
# LOG_LEVEL = 'DEBUG'
# Se True, toda a saída padrão (e erros) será redirecionada para o log.
# LOG_STDOUT = False
# Se True, o log incluirá apenas o caminho raiz; se False, exibirá o componente completo responsável.
# LOG_SHORT_NAMES = False
# O intervalo (em segundos) entre cada output de estatísticas de log.
# LOGSTATS_INTERVAL = 60.0
# Habilita ou desabilita o depurador de memória.
# MEMDEBUG_ENABLED = False
# Se o depurador de memória estiver ativado e esta configuração não estiver vazia,
# os relatórios de memória serão enviados para os endereços de e-mail especificados,
# caso contrário, serão escritos no log. Ex: MEMDEBUG_NOTIFY = ['usuario@exemplo.com']
# MEMDEBUG_NOTIFY = []
# Habilita ou desabilita a extensão de uso de memória, que monitora o pico de memória usado pelo processo.
# MEMUSAGE_ENABLED = True
# A quantidade máxima de memória (em MB) permitida antes que o Scrapy feche o processo.
# MEMUSAGE_LIMIT_MB = 0
# O intervalo (em segundos) para verificar o uso de memória.
# MEMUSAGE_CHECK_INTERVAL_SECONDS = 60.0
# Uma lista de e-mails para notificar se o limite de memória for atingido.
# MEMUSAGE_NOTIFY_MAIL = False
# A quantidade máxima de memória (em MB) permitida antes de enviar um e-mail de aviso.
# MEMUSAGE_WARNING_MB = 0
# O modelo usado para criar spiders com o comando genspider.
# NEWSPIDER_MODULE = ""
# Se habilitado, o Scrapy aguardará um tempo aleatório entre 0.5 * DOWNLOAD_DELAY e 1.5 * DOWNLOAD_DELAY
# ao buscar requisições do mesmo site.
# RANDOMIZE_DOWNLOAD_DELAY = True
# O limite máximo para o tamanho do pool de threads do Twisted Reactor.
# REACTOR_THREADPOOL_MAXSIZE = 10
# Define o número máximo de vezes que uma requisição pode ser redirecionada.
# Após este limite, a resposta da requisição será retornada como está.
# REDIRECT_MAX_TIMES = 20
# Ajusta a prioridade de requisições redirecionadas. Valores positivos aumentam a prioridade.
# REDIRECT_PRIORITY_ADJUST = 2
# Ajusta a prioridade de requisições que serão retentadas.
# RETRY_PRIORITY_ADJUST = -1
# Habilita ou desabilita a obediência ao protocolo robots.txt.
ROBOTSTXT_OBEY = False
# O backend do parser usado para analisar arquivos robots.txt.
# ROBOTSTXT_PARSER = 'scrapy.robotstxt.ProtegoRobotParser'
# O User-Agent a ser usado para requisições robots.txt, se diferente do USER_AGENT principal.
# ROBOTSTXT_USER_AGENT = None
# A classe do agendador (scheduler) usada para o rastreamento.
# SCHEDULER = 'scrapy.core.scheduler.Scheduler'
# Se True, registrará informações de depuração sobre o agendador de requisições.
# SCHEDULER_DEBUG = False
# O tipo de fila de disco que o agendador usará. Outros tipos disponíveis:
# scrapy.squeues.PickleFifoDiskQueue, scrapy.squeues.MarshalFifoDiskQueue, scrapy.squeues.MarshalLifoDiskQueue.
# SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue'
# O tipo de fila de memória que o agendador usará. Outros tipos disponíveis: scrapy.squeues.FifoMemoryQueue.
# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue'
# O tipo de fila de prioridade que o agendador usará. Outro tipo disponível:
# scrapy.pqueues.DownloaderAwarePriorityQueue.
# SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.ScrapyPriorityQueue'
# Um limite flexível (em bytes) para o tamanho dos dados de resposta que estão sendo processados.
# Se a soma dos tamanhos de todas as respostas em processamento exceder este valor, o Scrapy não processará
# novas requisições.
# SCRAPER_SLOT_MAX_ACTIVE_SIZE = 5_000_000
# Um dicionário de contratos de spider ativados em seu projeto, usados para testar spiders.
# SPIDER_CONTRACTS = {}
# Um dicionário dos contratos de Scrapy padrão disponíveis e suas ordens de execução.
# SPIDER_CONTRACTS_BASE = {
# 'scrapy.contracts.default.UrlContract' : 1,
# 'scrapy.contracts.default.ReturnsContract': 2,
# 'scrapy.contracts.default.ScrapesContract': 3,
# }
# A classe que será usada para carregar as spiders.
# SPIDER_LOADER_CLASS = 'scrapy.spiderloader.SpiderLoader'
# Um dicionário de middlewares de spider ativados em seu projeto e suas ordens de execução.
# SPIDER_MIDDLEWARES = {}
# Dicionário de middlewares de spider padrão ativados no Scrapy.
# SPIDER_MIDDLEWARES_BASE = {
# 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,
# 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,
# 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700,
# 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,
# 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900,
# }
# Uma lista de módulos onde as spiders serão procuradas.
# SPIDER_MODULES = {}
# A classe usada para coletar estatísticas.
# STATS_CLASS = 'scrapy.statscollectors.MemoryStatsCollector'
# Despeja as estatísticas do Scrapy no log quando a spider termina.
# STATS_DUMP = True
# Uma lista de e-mails para enviar as estatísticas do Scrapy após a conclusão da spider.
# STATSMAILER_RCPTS = []
# Especifica se o console telnet será habilitado.
# TELNETCONSOLE_ENABLED = True
# O intervalo de portas para o console telnet. Se None ou 0, uma porta dinâmica é alocada.
# TELNETCONSOLE_PORT = [6023, 6073]
# O diretório onde procurar modelos ao criar novos projetos e spiders.
# TEMPLATES_DIR = "templates"
# O comprimento máximo permitido para URLs rastreadas.
# URLLENGTH_LIMIT = 2083
# O User-Agent padrão usado durante o rastreamento.
# USER_AGENT = "Scrapy/VERSION (+https://scrapy.org)"