Как отобразить очищенные элементы в нескольких строках в файле output.log? - PullRequest
2 голосов
/ 26 февраля 2020

Когда я использую scrapy с командой scrapy crawl my-spider --logfile=output.log, я без проблем получаю предметы и их логи. Но то, как они отображаются, довольно неприятно для моих глаз.

Что я получаю:

...
2020-02-26 16:23:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://some-url.com>
{'key_1': 'value_1', 'key_2': 'value_2', 'key_3': 'value_3'}
...

Что я хочу:

...
2020-02-26 16:23:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://some-url.com>
{'key_1': 'value_1',
 'key_2': 'value_2',
 'key_3': 'value_3'}
...

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Вы можете настроить Scrapy на использование собственного средства форматирования журнала , что расширит стандартное средство форматирования и для форматирования полезной нагрузки перед ее сбросом в журнал.

В качестве примера давайте рассмотрим пример проекта quotesbot , упомянутого в scrapy docs .

Scrapy docs говорят есть настройка, которую мы можем использовать:

LOG_FORMATTER

По умолчанию: scrapy.logformatter.LogFormatter

класс для форматирования сообщений журнала для различных действий.

Итак, в файле settings.py вы добавляете строку, которая сообщит Scrapy, какой форматер журнала следует использовать.

BOT_NAME = 'quotesbot'

SPIDER_MODULES = ['quotesbot.spiders']
NEWSPIDER_MODULE = 'quotesbot.spiders'
...
...
...
LOG_FORMATTER = 'quotesbot.my_pretty_formatter.MyPrettyFormatter'  # Add this line.

Затем создайте новый "симпатичный форматер" в ./quotesbot/my_pretty_formatter.py:

from pprint import pformat
from scrapy.logformatter import LogFormatter

class MyPrettyFormatter(LogFormatter):
    def scraped(self, item, response, spider):
        pretty_item = pformat(item)  # This will prettify the item that's about to be logged.
        return super().scraped(pretty_item, response, spider)

И все.

Вывод стандартного log formatter :

2020-02-26 19:57:06 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/10/>
{'text': '“... a mind needs books as a sword needs a whetstone, if it is to keep its edge.”', 'author': 'George R.R. Martin', 'tags': ['books', 'mind']}

Вывод нашего нового pretty formatter :

2020-02-26 19:55:43 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/10/>
{'author': 'George R.R. Martin',
 'tags': ['books', 'mind'],
 'text': '“... a mind needs books as a sword needs a whetstone, if it is to '
         'keep its edge.”'}
0 голосов
/ 26 февраля 2020

Простое решение заключается в использовании замены после сохранения файла журнала:

fin = open("output.log", "rt")
data = fin.read()
data = data.replace(', ', ',\t')
fin.close()

fin = open("output.log", "wt")
fin.write(data)
fin.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...