В каком месте/файле обрабатывать спарсенные данные в Scrapy?
Приветствую
Как я понял, в Scrapy есть несколько основных мест, где можно обработать скачанные данные:
— в самом пауке;
— в файле items;
— в файле pipelines.
Со вчерашнего дня размышляю о том, где правильно разбирать полученные данные и пока пришел только к одному умозаключению: в файле паука должны быть обработаны лишь те данные, которые нужны для его работы и небольшие допустимые модификации полученных данных. В итоге остается два места — spider middleware/items и pipelines.
По логике, можно написать один и тот же метод/функцию, которая будет одинаково работать и через процессор промежуточного ПО паука (spider middleware/items) и через pipilene. Но как я понял, если нужно несколько обработчиков полученных пауком данных, то через обработчики/процессоры items это будет слегка затруднительно, так как можно указать только под одному обработчику/процессору для каждого поля. А через pipilenes можно указывать несколько обработчиков.
Но тут возникает одно опасение — повышенная нагрузка pipelines в сравнении с обработчиком/процессором items. Когда мы вызываем обработчик в pipelines, то мы вызываем весь массив сохраненных данных в одном поле. А когда мы обрабатываем данные через обработчик/процессор поля, то мы обрабатываем лишь одно поле без дополнительного последующего вызова всех полей поля...
В общем, если вы знаете Scrapy, объясните пожалуйста в каком месте какие данные нужно обрабатывать.
P.S.
Я не знаю нужно ли вам указывать примеры спарсенных данных, поэтому предложу простой пример из нескольких полей:
— заголовок стрницы
— url картинки
— большой кусок HTML кода, который надо потом обработать (очистить от ненужного)
— несколько тегов списком
dimonchik2013 Думал я думал, так и не понял почему именно обрабатывать данные нужно именно в файле pipelines.py, а не с помощью обработчиков/процессоров полей в файле items.py — хотелось бы четко понимать различие!
Допусти мне нужно обработать 5 разных полей из 10.
В файле items.py я создаю функции или импортирую их, указываю поля и обработчики/процессоры к ним:
def proc_1(value):
# data processing
return value
def proc_2(value):
# data processing
return value
def proc_3(value):
# data processing
return value
Class MyFields(scrapy.items):
f1 = scrapy.Field(output_processor=proc_1)
f2 = scrapy.Field(output_processor=proc_2)
f3 = scrapy.Field(output_processor=proc_3)
#...
В файле pipelines.py я создаю класс и создаю обработчик:
class TestPipeline(object):
def process_item(self, item, spider):
# data processing
return item
В чем принципиальная разница — не пойму. Наверное моих познаний в Python маловато в, как их там, алгоритмов, структур данных, архитектуры...
Почти тоже самое можно организовать через Spider Middleware, так мне показалось (еще не дошел до испытаний этого варианта). Главный вопрос остался открытым — почему данные нужно обрабатывать именно в pipelines, а не в items.py через процессоры? Хотелось бы четко понимать.