Здесь я привожу первый вариант решения (фрагменты паука) в котором компилятор выводит сообщения в один файл, а ошибки в другой. При этом все (логирование) дублируется в консоли.
Кроме того, traceback выводит подробные сведения о перехваченных ошибках.
Как вывести в лог описания ошибок успешно перехваченных в "exceptions"?
import sys, traceback
Примеры настройки логирования в Scrapy и картинка "loggers, handlers, filters, and formatters
28.10. traceback — Print or retrieve a stack traceback
28.10.1. Traceback Examples
Logging
11.5. Logging
15.7. logging — Logging facility for Python
15.8. logging.config — Logging configuration
15.9. logging.handlers — Logging handlers
Фрагменты из модуля spiders\topmail.py¶
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\mail_csv_1\\CSVmailSpider\\CSVmailSpider\\spiders\\topmail.py"
...
...
from scrapy.log import ScrapyFileLogObserver
from scrapy import log
class TopmailSpider(CSVFeedSpider):
...
# Do any adaptations you need here
....
def __init__(self, name=None, **kwargs):
ScrapyFileLogObserver(open("spider.log", 'w'), level=log.logging.INFO).start()
ScrapyFileLogObserver(open("spider_error.log", 'w'), level=log.logging.ERROR).start()
super(TopmailSpider, self).__init__(name, **kwargs)
def parse_row(self, response, row):
i = CsvmailspiderItem()
...
return i
Фрагменты файла записи в CSV файл, в которых формируются элементы строк
Были добавлены строки
from scrapy import log
import sys, traceback
....
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, \
exc_traceback,limit=2, \
file=sys.stdout)
Вот фрагменты файла со вставленными строками:
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\mail_csv_1\\CSVmailSpider\\CSVmailSpider\\pipelines\\pipe_to_csvfile.py"
from scrapy import log
import sys, traceback
#import ipdb;ipdb.set_trace()
class Pipe_WriteToCSV_file(object):
...
...
def __init__(self):
filename = "toyota_e1.csv" #filepath to save
#with open(filename, 'w') as self.file:
self.file = open(filename, 'wb')
def process_item(self, item, spider):
# To escape raise exception in line=csv_row_constr.format(...
# constuct empty list
c=['' for i in range(17)]
# try in case some item[...] does not exist
try:
# Request URL
c[2]=item['req_url'] #Response URL
# From csv URL
c[3]=item['url'] # from csv URL
c[4]=item['views'] # from csv views
c[5]=item['views_p'] # from csv views percent
# After parameters of CSV url - parsing from 'req_url'
c[6]=item['req_gender']
c[7]=item['req_age']
c[8]=item['req_date'] #'2014-06-30'
# After parsing ['rec_date'] field
c[9]=item['req_date_year']
c[10]=item['req_date_month']
c[11]=item['req_date_day']
c[12]=item['req_date_weekday']
# After parsing ['url field']
c[13]=item['url_firm_0']
c[14]=item['url_firm_1']
c[15]=item['url_firm_2']
c[16]=item['url_firm_3']
except KeyError:
log.msg('Catch KeyError: %s in pipe_to_csvfile.py'% \
'from c[1-16] Probably, you switch off some pipe? \
Or comment c[...]')
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, \
exc_traceback,limit=2, \
file=sys.stdout)
# If you
...
...
Объект item в общем случае - словарь списков, в нашем частном случае - словарь строк. Если какому-то элементу словаря ранее не было присвоено значение, то при обращении к нему (например, с[15]=item[...]) возникает ошибка.
Компилятор при этом сообщает мне, в какой именно строке возникла ошибка.
Если ограничиться только log.msg(...), то мы получим только мои длиннющие "рекомендации"
2014-11-30 15:12:01+0300 [scrapy] INFO: Catch KeyError: from c[1-16] Probably, you switch off some pipe? Or comment c[...] in pipe_
to_csvfile.py
А строка traceback.print_exception(...) выводит именно то, что нам надо:
Traceback (most recent call last):
File "CSVmailSpider\pipelines\pipe_to_csvfile.py", line 53, in process_item
c[13]=item['url_firm_0']
File "C:\Users\kiss\Anaconda\lib\site-packages\scrapy\item.py", line 50, in __getitem__
return self._values[key]
KeyError: 'url_firm_0'
В заключение следует отметить, что мои попытки добавить другой вариант строки трассировки с выводом в файл:
## traceback.print_tb(exc_traceback, limit=1, \
## file='spider_error.log')
Вывели в этот файл сообщения об ошибках записи в файл, а не о перехваченных ошибках. Предстоит еще поэкспериментировать с вариантами, но пока будем испоьзовать этот вариант.
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий