python - scrapy beautifulsoup example
Marco de Scrapy-Colorize logging (1)
Si solo quiere colorear LogRecord
, puede personalizar LOG_FORMAT
en settings.py
con códigos de escape ANSI.
Ejemplo:
LOG_FORMAT = ''/x1b[0;0;34m%(asctime)s/x1b[0;0m /x1b[0;0;36m[%(name)s]/x1b[0;0m /x1b[0;0;31m%(levelname)s/x1b[0;0m: %(message)s''
Si también desea colorear diferentes niveles de registro con diferentes colores, puede anular scrapy.utils.log._get_handler
( código fuente ).
Pon esto cerca de la parte superior de tu settings.py
import scrapy.utils.log
_get_handler = copy.copy(scrapy.utils.log._get_handler)
def _get_handler_custom(*args, **kwargs):
handler = _get_handler(*args, **kwargs)
handler.setFormatter(your_custom_formatter)
return handler
scrapy.utils.log._get_handler = _get_handler_custom
Lo que hace es reiniciar el formateador después de llamar al _get_handler
original, y luego volver a conectarlo a scrapy.utils.log
. Esta es una solución hacky y puede que no sea la mejor práctica, pero simplemente funciona.
Una forma más adecuada de lograr esto es anular el logging.StreamHandler
. Hay un montón de discusiones sobre SO que pueden guiarlo en la dirección correcta.
Aquí proporciono mis códigos de trabajo completos utilizados en mis proyectos (un colorlog
paquete de colorlog
está en uso).
settings.py
from colorlog import ColoredFormatter
import scrapy.utils.log
color_formatter = ColoredFormatter(
(
''%(log_color)s$(levelname)-5s%(reset)s ''
''%(yellow)s[%(asctime)s]%(reset)s''
''%(white)s %(name)s %(funcName)s %(bold_purple)s:%(lineno)d%(reset)s ''
''%(log_color)s%(message)s%(reset)s''
),
datefmt=''%y-%m-%d %H;%M:%S'',
log_colors={
''DEBUG'': ''blue'',
''INFO'': ''bold_cyan'',
''WARNING'': ''red'',
''ERROR'': ''bg_bold_red'',
''CRITICAL'': ''red,bg_white'',
}
)
_get_handler = copy.copy(scrapy.utils.log._get_handler)
def _get_handler_custom(*args, **kwargs):
handler = _get_handler(*args, **kwargs)
handler.setFormatter(color_formatter)
return handler
scrapy.utils.log._get_handler = _get_handler_custom
Estoy intentando hacer que Scrapy imprima registros coloreados. No estoy tan familiarizado con el registro de Python, pero tengo entendido que debo crear mi propio formateador y hacerlo usar Scrapy. Logré hacer un formateador para colorear el resultado usando Clint.
Mi problema es que no puedo hacer que funcione correctamente en Scrapy. Hubiera esperado que el objeto logger en mi araña tuviera un controlador, entonces habría cambiado el formateador de ese controlador. Cuando miro lo que hay dentro de spider.logger.logger
, veo que el handler
es una lista vacía. Intenté agregar mi formateador en un nuevo controlador de flujo.
crawler.spider.logger.logger.addHandler(sh)
donde sh es un controlador que usa mi formateador de color.
Esto agrega efectos para hacer que scrappy genere cada mensaje dos veces. El primer mensaje se colorea pero no tiene formato Scrapy. El segundo tiene formato Scrapy sin colores.
¿Cómo puedo hacer que Scrapy imprima registros coloreados manteniendo el mismo formato que se puede establecer en settings.py
Gracias