Gerenciando Configurações no Scrapy com settings.py

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 entre 0.5 * DOWNLOAD_DELAY e 1.5 * DOWNLOAD_DELAY. Pode ser fixado definindo RANDOMIZE_DOWNLOAD_DELAY como False.
  • 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 substitui CONCURRENT_REQUESTS_PER_DOMAIN, e DOWNLOAD_DELAY é aplicado por IP.
  • DEFAULT_ITEM_CLASS: A classe de item padrão usada ao executar o comando scrapy shell. O padrão é 'scrapy.item.Item'.
  • DEPTH_LIMIT: O limite máximo de profundidade que o crawler pode atingir. Zero ou None significa 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órmula request.priority = request.priority - (depth * DEPTH_PRIORITY).
  • COOKIES_ENABLED: Habilita ou desabilita o middleware de cookies, que gerencia automaticamente os cookies. Padrão True.
  • 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ão True.
  • LOG_FILE: O caminho para o arquivo onde os logs serão escritos. Se None, 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 no LOG_FORMAT.
  • LOG_LEVEL: O nível mínimo de log a ser exibido (CRITICAL, ERROR, WARNING, INFO, DEBUG). O padrão é DEBUG.
  • LOG_STDOUT: Se True, toda a saída padrão (e erros) será redirecionada para o sistema de log.
  • LOG_SHORT_NAMES: Se True, os logs exibem apenas o caminho raiz do módulo; se False, 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 protocolo robots.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)"

Tags: Scrapy Python WebScraping Configurações Settings

Publicado em 6-19 03:31