Scrapy - l'enregistrement du dossier et la sortie standard (stdout) simultanément, avec les noms
j'ai décidé d'utiliser le module de journalisation Python car les messages générés par Twisted sur l'erreur std sont trop longs, et je veux INFO
nivelez les messages significatifs tels que ceux générés par le StatsCollector
à écrire sur un fichier journal séparé tout en maintenant les messages à l'écran.
from twisted.python import log
import logging
logging.basicConfig(level=logging.INFO, filemode='w', filename='buyerlog.txt')
observer = log.PythonLoggingObserver()
observer.start()
eh Bien, c'est bien, j'ai de mes messages, mais l'inconvénient est que je ne connais pas les messages sont générés par lequel araignée! C'est mon fichier journal, avec" twisted " affiché par %(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,
par rapport aux messages générés par twisted sur Standard error:
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) <
j'ai essayé %(nom)s, %(module) s entre autres mais je ne semble pas être capable de montrer le nom de l'Araignée. Personne ne connaît la réponse?
modifier:
le problème avec l'aide de LOG_FILE
et LOG_LEVEL
dans les paramètres est que les messages de niveau inférieur ne seront pas affichés sur l'erreur std.
5 réponses
vous voulez utiliser le ScrapyFileLogObserver
.
import logging
from scrapy.log import ScrapyFileLogObserver
logfile = open('testlog.log', 'w')
log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
log_observer.start()
je suis content que vous ayez posé cette question, je voulais le faire moi-même.
il est très facile de rediriger la sortie en utilisant: scrapy some-scrapy's-args 2>&1 | tee -a logname
de cette façon, tout ce que scrapy ouputs dans stdout et stderr, sera redirigé vers un fichier logname et aussi, prited à l'écran.
pour tous ceux qui sont venus ici avant de lire le courant documentation version:
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
)
je sais que c'est vieux, mais il était vraiment utile de post depuis la classe n'est toujours pas correctement documentées dans le Scrapy docs. En outre, nous pouvons passer l'importation de la coupe et utiliser des rondins raclés directement. Merci À Tous!
from scrapy import log
logfile = open('testlog.log', 'a')
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG)
log_observer.start()
Comme Scrapy Officiel Doc dit:
Scrapy utilise le système de journalisation intégré de Python pour la journalisation d'événements.
ainsi vous pouvez configurer votre logger comme un script Python normal.
Vous pouvez ajouter cette ligne à votre araignée:
logging.getLogger().addHandler(logging.StreamHandler())
il ajoute un gestionnaire de flux pour se connecter à la console.
après cela, vous devez configurer le chemin du fichier de journalisation.
Ajouter un dict nommé custom_settings
qui se compose de votre spider-spécifié paramètres:
custom_settings = {
'LOG_FILE': 'my_log.log',
'LOG_LEVEL': 'INFO',
... # you can add more settings
}
toute la classe ressemble à:
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