python - scraping - scrapy spider
Scrapy-logueando el archivo y la salida estándar simultáneamente, con nombres de arañas (6)
Decidí usar el módulo de registro de Python porque los mensajes generados por Twisted on std error son demasiado largos, y quiero INFO
mensajes significativos como los generados por StatsCollector
para escribir en un archivo de registro separado mientras mantengo el mensajes de pantalla.
from twisted.python import log
import logging
logging.basicConfig(level=logging.INFO, filemode=''w'', filename=''buyerlog.txt'')
observer = log.PythonLoggingObserver()
observer.start()
Bueno, esto está bien, tengo mis mensajes, ¡pero la desventaja es que no sé qué mensajes son generados por qué araña! Este es mi archivo de registro, con "trenzado" mostrado por %(name)s
:
INFO:twisted:Log opened.
2 INFO:twisted:Scrapy 0.12.0.2543 started (bot: property)
3 INFO:twisted:scrapy.telnet.TelnetConsole starting on 6023
4 INFO:twisted:scrapy.webservice.WebService starting on 6080
5 INFO:twisted:Spider opened
6 INFO:twisted:Spider opened
7 INFO:twisted:Received SIGINT, shutting down gracefully. Send again to force unclean shutdown
8 INFO:twisted:Closing spider (shutdown)
9 INFO:twisted:Closing spider (shutdown)
10 INFO:twisted:Dumping spider stats:
11 {''downloader/exception_count'': 3,
12 ''downloader/exception_type_count/scrapy.exceptions.IgnoreRequest'': 3,
13 ''downloader/request_bytes'': 9973,
En comparación con los mensajes generados a partir de torcido en error estándar:
2011-12-16 17:34:56+0800 [expats] DEBUG: number of rules: 4
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2011-12-16 17:34:56+0800 [iproperty] INFO: Spider opened
2011-12-16 17:34:56+0800 [iproperty] DEBUG: Redirecting (301) to <GET http://www.iproperty.com.sg/> from <GET http://iproperty.com.sg>
2011-12-16 17:34:57+0800 [iproperty] DEBUG: Crawled (200) <
He intentado% (name) s,% (module) s entre otros, pero parece que no puedo mostrar el nombre de la araña. ¿Alguien sabe la respuesta?
EDITAR: el problema con el uso de LOG_FILE
y LOG_LEVEL
en la configuración es que los mensajes de nivel inferior no se mostrarán en el error estándar.
Como dijo el Scrapy Official Doc:
Scrapy usa el sistema de registro incorporado de Python para el registro de eventos.
Por lo tanto, puede configurar su registrador solo como un script de Python normal.
Primero, tienes que importar el módulo de registro:
import logging
Puedes agregar esta línea a tu araña:
logging.getLogger().addHandler(logging.StreamHandler())
Agrega un controlador de flujo para iniciar sesión en la consola.
Después de eso, tienes que configurar la ruta del archivo de registro.
Agregue un dict llamado custom_settings
que consiste en sus configuraciones especificadas por la araña:
custom_settings = {
''LOG_FILE'': ''my_log.log'',
''LOG_LEVEL'': ''INFO'',
... # you can add more settings
}
Toda la clase se ve como:
import logging
class AbcSpider(scrapy.Spider):
name: str = ''abc_spider''
start_urls = [''you_url'']
custom_settings = {
''LOG_FILE'': ''my_log.log'',
''LOG_LEVEL'': ''INFO'',
... # you can add more settings
}
logging.getLogger().addHandler(logging.StreamHandler())
def parse(self, response):
pass
Desea utilizar el ScrapyFileLogObserver
.
import logging
from scrapy.log import ScrapyFileLogObserver
logfile = open(''testlog.log'', ''w'')
log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
log_observer.start()
Me alegra que hayas hecho esta pregunta, he querido hacer esto yo mismo.
Es muy fácil redirigir la salida usando: scrapy some-scrapy''s-args 2>&1 | tee -a logname
scrapy some-scrapy''s-args 2>&1 | tee -a logname
De esta manera, todo lo que salga en forma de código en stdout y stderr, será redirigido a un archivo de nombre de registro y también, será publicado en la pantalla.
Para todas aquellas personas que vinieron aquí antes de leer la versión actual de la documentation :
import logging
from scrapy.utils.log import configure_logging
configure_logging(install_root_handler=False)
logging.basicConfig(
filename=''log.txt'',
filemode = ''a'',
format=''%(levelname)s: %(message)s'',
level=logging.DEBUG
)
Sé que esto es antiguo pero fue una publicación muy útil ya que la clase aún no está documentada adecuadamente en los documentos de Scrapy. Además, podemos omitir la importación de registros y usar registros desechables directamente. ¡Gracias a todos!
from scrapy import log
logfile = open(''testlog.log'', ''a'')
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG)
log_observer.start()
ScrapyFileLogObserver ya no es compatible. Puede utilizar el módulo de registro de python estándar.
import logging
logging.getLogger().addHandler(logging.StreamHandler())