Поиск по блогу

воскресенье, 30 ноября 2014 г.

Topmail Spider with ScrapyFileLogObserver and traceback

Здесь я привожу первый вариант решения (фрагменты паука) в котором компилятор выводит сообщения в один файл, а ошибки в другой. При этом все (логирование) дублируется в консоли.
Кроме того, traceback выводит подробные сведения о перехваченных ошибках.


Фрагменты из модуля spiders\topmail.py

In [2]:
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\mail_csv_1\\CSVmailSpider\\CSVmailSpider\\spiders\\topmail.py"
In []:
...
...
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
In []:
Фрагменты файла записи в CSV файл, в которых формируются элементы строк 

Были добавлены строки

In []:
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)

Вот фрагменты файла со вставленными строками:

In [3]:
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\mail_csv_1\\CSVmailSpider\\CSVmailSpider\\pipelines\\pipe_to_csvfile.py"
In []:
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(...), то мы получим только мои длиннющие "рекомендации"

In []:
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(...) выводит именно то, что нам надо:

In []:
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'

В заключение следует отметить, что мои попытки добавить другой вариант строки трассировки с выводом в файл:

In []:
##            traceback.print_tb(exc_traceback, limit=1, \
##                               file='spider_error.log')

Вывели в этот файл сообщения об ошибках записи в файл, а не о перехваченных ошибках. Предстоит еще поэкспериментировать с вариантами, но пока будем испоьзовать этот вариант.


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий