urljoin follow example python scrapy

python - follow - suprimir el artículo Scrapy impreso en los registros después de la tubería



scrapy python documentation (6)

Creo que la forma más limpia de hacerlo es agregar un filtro al registrador scrapy.core.scraper que cambia el mensaje en cuestión. Esto le permite mantener el __repr__ su artículo intacto y no tener que cambiar el nivel de registro de scrapy:

import re class ItemMessageFilter(logging.Filter): def filter(self, record): # The message that logs the item actually has raw % operators in it, # which Scrapy presumably formats later on match = re.search(r''(Scraped from %/(src/)s)/n%/(item/)s'', record.msg) if match: # Make the message everything but the item itself record.msg = match.group(1) # Don''t actually want to filter out this record, so always return 1 return 1 logging.getLogger(''scrapy.core.scraper'').addFilter(ItemMessageFilter())

Tengo un proyecto desechable en el que el elemento que finalmente ingresa a mi canalización es relativamente grande y almacena muchos metadatos y contenido. Todo funciona correctamente en mi araña y tuberías. Los registros, sin embargo, están imprimiendo todo el artículo desechado cuando sale de la tubería (creo):

2013-01-17 18:42:17-0600 [tutorial] DEBUG: processing Pipeline pipeline module 2013-01-17 18:42:17-0600 [tutorial] DEBUG: Scraped from <200 http://www.example.com> {''attr1'': ''value1'', ''attr2'': ''value2'', ''attr3'': ''value3'', ... snip ... ''attrN'': ''valueN''} 2013-01-17 18:42:18-0600 [tutorial] INFO: Closing spider (finished)

Preferiría no incluir todos estos datos en archivos de registro si puedo evitarlos. ¿Alguna sugerencia sobre cómo suprimir esta salida?


Después de leer la documentación y realizar una (breve) búsqueda en el código fuente, no puedo ver una manera directa de lograr este objetivo.

El enfoque de martillo es establecer el nivel de registro en la configuración a INFO (es decir, agregar la siguiente línea a settings.py):

LOG_LEVEL=''INFO''

Esto eliminará mucha otra información sobre las URL / páginas que se están rastreando, pero definitivamente suprimirá los datos sobre los elementos procesados.


Otro enfoque consiste en anular el método __repr__ de las subclases de Item para elegir de forma selectiva qué atributos (si los hay) se imprimirán al final de la canalización:

from scrapy.item import Item, Field class MyItem(Item): attr1 = Field() attr2 = Field() # ... attrN = Field() def __repr__(self): """only print out attr1 after exiting the Pipeline""" return repr({"attr1": self.attr1})

De esta manera, puede mantener el nivel de registro en DEBUG y mostrar solo los atributos que desea ver saliendo de la canalización (para verificar attr1 , por ejemplo).


Probé la forma de representación mencionada por @dino, no funciona bien. Pero evolucionando a partir de su idea, probé el método str , y funciona.

Así es como lo hago, muy simple:

def __str__(self): return ""


Si desea excluir solo algunos atributos de la salida, puede extender la respuesta dada por @dino

from scrapy.item import Item, Field import json class MyItem(Item): attr1 = Field() attr2 = Field() attr1ToExclude = Field() attr2ToExclude = Field() # ... attrN = Field() def __repr__(self): r = {} for attr, value in self.__dict__[''_values''].iteritems(): if attr not in [''attr1ToExclude'', ''attr2ToExclude'']: r[attr] = value return json.dumps(r, sort_keys=True, indent=4, separators=('','', '': ''))


o Si sabe que la araña está funcionando correctamente, puede deshabilitar todo el registro

LOG_ENABLED = False

Lo deshabilito cuando mi rastreador funciona bien